<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Falco – Integration</title><link>https://v0-43--falcosecurity.netlify.app/tags/integration/</link><description>Recent content in Integration on Falco</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 09 Aug 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://v0-43--falcosecurity.netlify.app/tags/integration/feed.xml" rel="self" type="application/rss+xml"/><item><title>Blog: Manage Falco easier with Giant Swarm App Platform</title><link>https://v0-43--falcosecurity.netlify.app/blog/giantswarm-app-platform-falco/</link><pubDate>Tue, 09 Aug 2022 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/giantswarm-app-platform-falco/</guid><description>
&lt;p&gt;In this article, you will learn how Giant Swarm simplifies the maintenance of the software stack within Kubernetes clusters by using its App Platform technology. Additionally, we will show how customers can leverage this to easily deploy Falco, either individually or as part of Giant Swarm's Security Pack, to secure their managed Kubernetes service.&lt;/p&gt;
&lt;h3 id="giant-swarm"&gt;Giant Swarm&lt;/h3&gt;
&lt;p&gt;Having CoreOS, Fleet, and Docker as base technologies, &lt;a href="https://www.giantswarm.io/about"&gt;Giant Swarm&lt;/a&gt; was founded in 2014. In 2016, it chose Kubernetes to reinvent itself. And just a year later, in 2017, it became part of the founding members of the &lt;a href="https://linuxfoundation.org/press-release/cloud-native-computing-foundation-announces-first-kubernetes-certified-service-providers/"&gt;Kubernetes Certified Service Providers&lt;/a&gt;. Customers like &lt;a href="https://www.giantswarm.io/customers/adidas"&gt;Adidas&lt;/a&gt; or &lt;a href="https://www.giantswarm.io/customers/vodafone"&gt;Vodafone&lt;/a&gt; backup a company that, supported by a &lt;a href="https://www.giantswarm.io/blog/surviving-and-thriving-how-to-really-work-emotely"&gt;fully remote team&lt;/a&gt;, has been able to foresee the trends of technology and working lifestyle.&lt;/p&gt;
&lt;p&gt;As a managed Kubernetes company, its services and infrastructure enable enterprises to run resilient distributed systems at scale while removing the burden of Day 2 operations. Giant Swarm takes pride in delivering a fully open source platform that's carefully curated and opinionated.&lt;/p&gt;
&lt;h4 id="security-and-simplicity"&gt;Security and simplicity&lt;/h4&gt;
&lt;p&gt;Giant Swarm takes security as seriously as ease of management. Hence, when using a managed Kubernetes platform, everything that happens on the &lt;a href="https://docs.giantswarm.io/general/management-clusters/"&gt;management cluster&lt;/a&gt; is as important as the performance of the workload cluster itself.&lt;/p&gt;
&lt;p&gt;That's why, leveraging the concept of operators to control all resources that clusters need as 'Custom Resources', Giant Swarm can deploy and update its management clusters in the quickest possible way. Needless to say, this is exactly what Giant Swarm offers to its customers to manage their applications.&lt;/p&gt;
&lt;h3 id="falco-the-runtime-security-project"&gt;Falco, the Runtime Security Project&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://falco.org"&gt;Falco&lt;/a&gt; is the de facto Kubernetes threat detection engine, and also extends its reach to cloud and Linux hosts. It monitors the behavior of every process in the node and can alert us when something fishy happens.&lt;/p&gt;
&lt;p&gt;How does Falco do that? Based on a set of &lt;a href="http://falco.org/docs/rules"&gt;rules&lt;/a&gt; that Falco interprets at startup time, it waits for events and &lt;a href="https://falco.org/docs/rules/supported-events/"&gt;syscalls&lt;/a&gt; that would trigger one of those rules. When a rule is triggered, Falco raises an alert and, thanks to applications like &lt;a href="https://github.com/falcosecurity/falcosidekick"&gt;Falco Sidekick&lt;/a&gt;, allows teams to react accordingly.&lt;/p&gt;
&lt;p&gt;But with great power comes great responsibility. What happens when we start getting false positives our Falco rules haven't been updated for some months, or our Falco daemon is a few versions behind? The answer is as simple as updating. Well, maybe not that simple if we are responsible for tens of clusters with hundreds of nodes.&lt;/p&gt;
&lt;h3 id="giant-swarm-app-platform"&gt;Giant Swarm App Platform&lt;/h3&gt;
&lt;p&gt;Giant Swarm describes &lt;a href="https://docs.giantswarm.io/app-platform/overview/"&gt;App Platform&lt;/a&gt; as a set of features that allow you to browse, install, and manage the configurations of &lt;a href="https://docs.giantswarm.io/app-platform/apps/"&gt;managed apps&lt;/a&gt; from a single place: The management cluster.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/img/falco-on-giantswarm/falco-on-giantswarm-01.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;The technology behind it is simple: Apps are packaged as &lt;a href="https://helm.sh/docs/intro/using_helm/"&gt;Helm charts&lt;/a&gt;, can be configured with values, overridden with a different app configuration, etc. - whatever meets your needs. To deploy, a CRD (&lt;a href="https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#customresourcedefinitions"&gt;Custom Resource Definition&lt;/a&gt;) resource is created, interpreted by the &lt;a href="http://github.com/giantswarm/app-operator"&gt;App Operator&lt;/a&gt; (running on the managed cluster), assigned to the &lt;a href="https://github.com/giantswarm/chart-operator"&gt;Chart Operator&lt;/a&gt; (running on the workload cluster), and in a few seconds, our application will be deployed on as many clusters as desired.&lt;/p&gt;
&lt;p&gt;The App Platform offers its repertoire of applications from the App Catalog. Giant Swarm offers two App Catalogs out of the box: The Giant Swarm Catalog and the Giant Swarm Playground. But what we love the most from the App Platform is that we can have our additional catalogs, storing our applications and configurations.&lt;/p&gt;
&lt;h3 id="what-does-it-look-like-on-the-cli"&gt;What does it look like on the CLI?&lt;/h3&gt;
&lt;p&gt;It's now time to look at App Platform running. Let's walk through its deployment on a &lt;strong&gt;minikube&lt;/strong&gt; cluster. Following these instructions, it shouldn't take too long until we are ready to deploy our first managed app, &lt;strong&gt;Falco&lt;/strong&gt;, using a single CRD.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To keep this as standard as possible, we'll even go through some steps to compile some interesting Giant Swarm tools, like the plugin kubectl-gs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="do-you-already-have-a-kubernetes-cluster-nearby"&gt;Do you already have a Kubernetes cluster nearby?&lt;/h4&gt;
&lt;p&gt;If not, we can spin up a &lt;a href="https://minikube.sigs.k8s.io/docs/"&gt;&lt;strong&gt;minikube&lt;/strong&gt;&lt;/a&gt; instance pretty quickly.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ minikube start --driver virtualbox
😄 minikube v1.25.1 on Darwin 11.6.6
✨ Using the virtualbox driver based on user configuration
👍 Starting control plane node minikube in cluster minikube
🔥 Creating virtualbox VM (CPUs=2, Memory=6000MB, Disk=20000MB) ...
🐳 Preparing Kubernetes v1.23.1 on Docker 20.10.12 ...
▪ kubelet.housekeeping-interval=5m
▪ Generating certificates and keys ...
▪ Booting up control plane ...
▪ Configuring RBAC rules ...
▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🔎 Verifying Kubernetes components...
🌟 Enabled addons: default-storageclass, storage-provisioner
🏄 Done! kubectl is now configured to use &amp;#34;minikube&amp;#34; cluster and &amp;#34;default&amp;#34; namespace by default
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you don't have &lt;a href="https://kubernetes.io/docs/tasks/tools/#kubectl"&gt;kubectl&lt;/a&gt; installed or your system, the easiest way to access it would be through an &lt;a href="https://minikube.sigs.k8s.io/docs/handbook/kubectl/"&gt;alias&lt;/a&gt; to &lt;code&gt;minikube kubectl&lt;/code&gt;, like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;alias kubectl=&amp;#34;minikube kubectl --&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Don't forget the &lt;code&gt;--&lt;/code&gt; at the end. That tells the command prompt not to pass any added parameters to &lt;code&gt;minikube&lt;/code&gt;, since we need them to be understood by kubectl.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;One disadvantage of this method, in comparison to having a local &lt;code&gt;kubectl&lt;/code&gt; binary, is that the &lt;code&gt;kubectl-gs&lt;/code&gt; plugin might not work when called as &lt;code&gt;kubectl gs&lt;/code&gt; (explained later during this tutorial) so you might need to call it directly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To ensure our cluster is up and running, execute the following command and verify that all nodes, pods, and containers are up and ready:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl get nodes,ns,pods -A
NAME STATUS ROLES AGE VERSION
node/minikube Ready control-plane,master 4m16s v1.23.1
NAME STATUS AGE
namespace/default Active 4m14s
namespace/kube-node-lease Active 4m15s
namespace/kube-public Active 4m15s
namespace/kube-system Active 4m16s
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system pod/coredns-64897985d-qbf4n 1/1 Running 0 4m
kube-system pod/etcd-minikube 1/1 Running 0 4m12s
kube-system pod/kube-apiserver-minikube 1/1 Running 0 4m12s
kube-system pod/kube-controller-manager-minikube 1/1 Running 0 4m12s
kube-system pod/kube-proxy-6ds89 1/1 Running 0 4m
kube-system pod/kube-scheduler-minikube 1/1 Running 0 4m14s
kube-system pod/storage-provisioner 1/1 Running 1 (3m29s ago) 4m10s
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="prerequisites-compiling-apptestctl-and-kubectl-gs"&gt;Prerequisites: Compiling &lt;code&gt;apptestctl&lt;/code&gt; and &lt;code&gt;kubectl-gs&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;As mentioned above, we'll compile a couple of tools. The first one will be &lt;code&gt;apptestctl&lt;/code&gt;. This tool will help us bootstrap &lt;strong&gt;App Platform&lt;/strong&gt; on a cluster not managed by Giant Swarm.&lt;/p&gt;
&lt;p&gt;To do this, we'll use the &lt;code&gt;docker.io/golang:1.17&lt;/code&gt; image.&lt;/p&gt;
&lt;p&gt;The following command will prepare an available instance of a Golang compiler for us to compile both of these tools:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl run golang --image docker.io/golang:1.17 -- sleep infinity
pod/golang created
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="compiling-apptestctl"&gt;Compiling &lt;code&gt;apptestctl&lt;/code&gt;&lt;/h5&gt;
&lt;p&gt;These steps are quite simple: clone the &lt;a href="https://github.com/giantswarm/apptestctl"&gt;&lt;code&gt;apptestctl&lt;/code&gt;&lt;/a&gt; repository and compile it as indicated.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We'll do this inside the container we created in the previous step so we don't pollute our system.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl exec -it golang -- git clone https://github.com/giantswarm/apptestctl src/apptestctl
Cloning into &amp;#39;apptestctl&amp;#39;...
... output omitted ...
Resolving deltas: 100% (791/791), done.
$ kubectl exec -it golang -- make -C src/apptestctl
make: Entering directory &amp;#39;/go/src/apptestctl&amp;#39;
... output omitted ...
====&amp;gt; apptestctl-v-linux-amd64
... output omitted ...
cp -a apptestctl-v-linux-amd64 apptestctl
====&amp;gt; build
make: Leaving directory &amp;#39;/go/src/apptestctl&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Alternatively, you can build a Darwin client.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl exec -it golang -- make build-darwin -C src/apptestctl
make: Entering directory &amp;#39;/go/src/apptestctl&amp;#39;
... output omitted ...
====&amp;gt; apptestctl-v-darwin-amd64
... output omitted ...
cp -a apptestctl-v-darwin-amd64 apptestctl-darwin
====&amp;gt; build-darwin
make: Leaving directory &amp;#39;/go/src/apptestctl&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Either way, you can copy the &lt;code&gt;apptestctl&lt;/code&gt; binary to your system and use it from wherever you prefer.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl cp golang:/go/src/apptestctl/apptestctl-darwin ./apptestctl
$ kubectl chmod u+x ./apptestctl
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="compiling-kubectl-gs"&gt;Compiling &lt;code&gt;kubectl-gs&lt;/code&gt;&lt;/h5&gt;
&lt;p&gt;Use the same steps to compile the &lt;a href="https://github.com/giantswarm/kubectl-gs"&gt;&lt;code&gt;kubectl-gs&lt;/code&gt;&lt;/a&gt; plugin this time, which will allow us to interact with App Platform. Pay attention to the fact that we'll compile it just for Darwin in this instance.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl exec -it golang -- git clone https://github.com/giantswarm/kubectl-gs src/kubectl-gs
Cloning into &amp;#39;kubectl-gs&amp;#39;...
... output omitted ...
Resolving deltas: 100% (4427/4427), done.
$ kubectl exec -it golang -- make build-darwin -C src/kubectl-gs
make: Entering directory &amp;#39;/go/src/kubectl-gs&amp;#39;
... output omitted ...
====&amp;gt; kubectl-gs-v-darwin-amd64
... output omitted ...
cp -a kubectl-gs-v-darwin-amd64 kubectl-gs-darwin
====&amp;gt; build-darwin
make: Leaving directory &amp;#39;/go/src/kubectl-gs&amp;#39;
$ kubectl cp golang:/go/src/kubectl-gs/kubectl-gs-darwin ./kubectl-gs
$ kubectl chmod u+x ./kubectl-gs
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="deploying-app-platform-via-apptestctl"&gt;Deploying App Platform via &lt;code&gt;apptestctl&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Once we have both tools, &lt;code&gt;apptestctl&lt;/code&gt; and &lt;code&gt;kubectl-gs&lt;/code&gt;, it's time to bootstrap App Platform. To do that, we'll use the &lt;code&gt;apptestctl bootstrap&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;The command &lt;code&gt;apptestctl bootstrap&lt;/code&gt; needs the KUBECONFIG information to access our &lt;em&gt;minikube&lt;/em&gt; cluster, so in this case, we will use the command &lt;code&gt;kubectl config view --flatten --minify -o json&lt;/code&gt; to obtain it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Alternatively, we would need to look for the .kube/config file and pass it with the &lt;code&gt;--kubeconfig-path&lt;/code&gt; option.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ ./apptestctl bootstrap --kubeconfig &amp;#34;$(kubectl config view --flatten --minify -o json)&amp;#34;
bootstrapping app platform components
... output omitted ...
app platform components are ready
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Once deployed, we can run a few commands to observe the resources created in our cluster.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl get deployments -n giantswarm
NAME READY UP-TO-DATE AVAILABLE AGE
app-operator 1/1 1 1 1m20s
chart-operator 1/1 1 1 1m20s
chartmuseum-chartmuseum 1/1 1 1 1m20s
# kubectl get catalog -A
NAMESPACE NAME CATALOG URL AGE
default chartmuseum http://chartmuseum-chartmuseum:8080/charts/ 1m25s
default helm-stable https://charts.helm.sh/stable/packages/ 1m25s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wait a moment... Where does this &lt;code&gt;Catalog&lt;/code&gt; resource come from? The bootstrap process of App Platform creates some CRDs that will support the operators to manage our applications.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl get crd
NAME CREATED AT
appcatalogentries.application.giantswarm.io 2022-06-10T15:30:12Z
appcatalogs.application.giantswarm.io 2022-06-10T15:30:12Z
apps.application.giantswarm.io 2022-06-10T15:30:12Z
catalogs.application.giantswarm.io 2022-06-10T15:30:12Z
charts.application.giantswarm.io 2022-06-10T15:30:12Z
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In short, once we register a &lt;code&gt;Catalog&lt;/code&gt;, several &lt;code&gt;AppCatalogEntries&lt;/code&gt; resources will be created. There will be at least one per application and version.&lt;/p&gt;
&lt;h4 id="registering-a-catalog"&gt;Registering a &lt;code&gt;Catalog&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Now, it looks like a great time to see what the &lt;code&gt;kubectl-gs&lt;/code&gt; plugin can do for us.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl-gs get catalogs
NAME NAMESPACE CATALOG URL AGE
chartmuseum default http://chartmuseum-chartmuseum:8080/charts/ 25m
helm-stable default https://charts.helm.sh/stable/packages/ 25m
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;All right, that was maybe not so impressive, but it'll become much more useful when we register our first catalog. Why is that? Because &lt;code&gt;kubectl gs&lt;/code&gt; will help us generate the definition of a &lt;code&gt;Catalog&lt;/code&gt; resource through its &lt;code&gt;template&lt;/code&gt; subcommand.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl-gs template catalog --name giantswarm --namespace default \
--description &amp;#34;Giant Swarm Catalog&amp;#34; --logo http://logo-url \
--url https://giantswarm.github.io/giantswarm-catalog
---
apiVersion: application.giantswarm.io/v1alpha1
kind: Catalog
metadata:
name: giantswarm
labels:
application.giantswarm.io/catalog-visibility: public
namespace: default
spec:
title: giantswarm
description: Giant Swarm Catalog
logoURL: http://logo-url
storage:
URL: https://giantswarm.github.io/giantswarm-catalog
type: helm
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et voilà, our &lt;code&gt;Catalog&lt;/code&gt; CRD pointing to a Giant Swarm collection of applications is ready to be deployed into our cluster.&lt;/p&gt;
&lt;p&gt;You might have figured out already what each parameter represents. &lt;code&gt;kubectl gs&lt;/code&gt; will complain if any of those parameters are missing. Also, pay attention that we didn't use a real logo URL, but if you were using &lt;a href="https://github.com/giantswarm/happa"&gt;&lt;code&gt;happa&lt;/code&gt;&lt;/a&gt;, the Giant Swarm Web-UI, would't you like to see a logo identifying your application?&lt;/p&gt;
&lt;p&gt;Finally, the URL is the location of the Helm repository from which App Platform will download the applications.&lt;/p&gt;
&lt;p&gt;Once we understand what the &lt;code&gt;kubectl gs template&lt;/code&gt; command has generated, it's time to create it inside the cluster and let the App Operator do its magic. Let's go for it.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl-gs template catalog --name giantswarm --namespace default \
--description &amp;#34;Giant Swarm Catalog&amp;#34; --logo http://logo-url \
--url https://giantswarm.github.io/giantswarm-catalog | kubectl apply -f -
catalog.application.giantswarm.io/giantswarm created
$ kubectl-gs get catalogs
NAME NAMESPACE CATALOG URL AGE
chartmuseum default http://chartmuseum-chartmuseum:8080/charts/ 35m
helm-stable default https://charts.helm.sh/stable/packages/ 35m
giantswarm default https://giantswarm.github.io/giantswarm-catalog 53s
$ kubectl gs get catalog giantswarm
CATALOG APP NAME VERSION UPSTREAM VERSION AGE DESCRIPTION
... output omitted ...
giantswarm falco-app 0.3.2 0.0.1 5m26s A Helm chart for falco
... output omitted ...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Do you remember the aforementioned AppCatalogEntries that the App Operator had to create once we defined the Catalog? Here are the Falco ones.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl get AppCatalogEntries | grep falco-app
giantswarm-falco-app-0.1.2 giantswarm falco-app 0.1.2 0.0.1 240d
giantswarm-falco-app-0.2.0 giantswarm falco-app 0.2.0 0.0.1 176d
giantswarm-falco-app-0.3.0 giantswarm falco-app 0.3.0 0.0.1 103d
giantswarm-falco-app-0.3.1 giantswarm falco-app 0.3.1 0.0.1 94d
giantswarm-falco-app-0.3.2 giantswarm falco-app 0.3.2 0.0.1 79d
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="installing-an-app-from-the-app-catalog"&gt;Installing an App from the App Catalog&lt;/h3&gt;
&lt;p&gt;What we've done so far was deploy App Platform, which is required only once. Giant Swarm would have configured that for us already if we were using their services.&lt;/p&gt;
&lt;p&gt;Now, it's finally time to create the CRD that will trigger the App Operator to assist in the deployment of Falco. How do we do that? &lt;code&gt;kubectl gs&lt;/code&gt; comes to the rescue again!&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl gs template app --catalog giantswarm --name falco-app --namespace falco-ns
--version 0.3.2 --app-name my-falco --in-cluster
---
apiVersion: application.giantswarm.io/v1alpha1
kind: App
metadata:
name: my-falco
labels:
app-operator.giantswarm.io/version: 0.0.0
namespace: falco-ns
spec:
name: falco-app
version: 0.3.2
namespace: falco-ns
kubeConfig:
inCluster: true
catalog: giantswarm
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It is worth mentioning that we are testing on a &lt;em&gt;minikube&lt;/em&gt; cluster, where we install applications inside the cluster itself. To achieve that, we use the &lt;code&gt;--in-cluster&lt;/code&gt; parameter passed to the previous commands.&lt;/p&gt;
&lt;p&gt;Otherwise, if we wanted to install or update the application in one of our managed workload clusters, we would use the &lt;code&gt;--cluster&lt;/code&gt; parameter to indicate where the application should be deployed:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl gs template app --catalog giantswarm --name falco-app --namespace falco-ns \
--version 0.3.2 --cluster cluster-123 --app-name my-falco
---
apiVersion: application.giantswarm.io/v1alpha1
kind: App
metadata:
name: my-falco
namespace: cluster-123
spec:
name: falco-app
version: 0.3.2
namespace: falco-ns
kubeConfig:
inCluster: false
catalog: giantswarm
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In the previous output, you can see how the namespace field inside the metadata section receives the name of the cluster instead of the actual namespace where the application should reside.&lt;/p&gt;
&lt;p&gt;The reason is that, although the application will be installed on one of the workload clusters, this CRD will be created in a namespace inside the management cluster. This topic alone would be enough for a whole new post.&lt;/p&gt;
&lt;p&gt;Here is a graphical representation of the CRDs supporting App Platform, in the management cluster:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/img/falco-on-giantswarm/falco-on-giantswarm-02.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;Finally, the last step is creating the CRD for the App in the cluster. Don't forget to ensure that the namespace where the CRD will belong exists, or the &lt;code&gt;kubectl apply&lt;/code&gt; command will fail.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl create ns falco-ns
namespace/falco-ns created
$ kubectl gs template app --catalog giantswarm --name falco-app --namespace falco-ns \
--version 0.3.2 --in-cluster --app-name my-falco | kubectl apply -f-
app.application.giantswarm.io/my-falco created
$ kubectl gs get app -n falco-ns
NAME VERSION LAST DEPLOYED STATUS NOTES
my-falco 0.3.2 113s deployed
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Here are the resulting Kubernetes resources when using regular kubectl commands.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ kubectl get app,deployment,daemonset -n falco-ns
NAME INSTALLED VERSION CREATED AT LAST DEPLOYED STATUS
app.application.giantswarm.io/my-falco 0.3.2 4m25s 4m24s deployed
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/my-falco-falcosidekick 2/2 2 2 4m24s
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/my-falco 1 1 1 1 1 &amp;lt;none&amp;gt; 4m24s
daemonset.apps/my-falco-falco-exporter 1 1 1 1 1 &amp;lt;none&amp;gt; 4m24s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The previous output might differ depending on the type of cluster you would be using, among other variables.&lt;/p&gt;
&lt;p&gt;As you can see, once App Platform is up and running, we only need to create the namespace that should contain the Falco application (which should already exist if we are deploying from a managed workload cluster), and the CRD based on the template from the &lt;code&gt;kubectl gs&lt;/code&gt; plugin. In a matter of seconds, Falco will be up and running, watching for threats and alerting when suspicious behaviors arise.&lt;/p&gt;
&lt;h3 id="managed-security"&gt;Managed Security&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://twitter.com/StoneZach/"&gt;Zach Stone&lt;/a&gt;, Platform Engineer at Giant Swarm, walked us through some of the biggest challenges that the company's customers face and how his team is using Falco to develop thoughtful solutions.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“The biggest problem that most of our customers face isn't what happens in the cluster, it's what happens with the information once they get it out of the cluster,”&lt;/em&gt; asserted Stone. &lt;em&gt;“People also focus too much on the capability that a tool offers and don't take a bigger look at the security processes it supports.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“If a customer has a vulnerability management program, we can track all of the vulnerabilities in their components, but if fixing those vulnerabilities isn’t a priority, then the program doesn’t work,”&lt;/em&gt; remarked Stone. &lt;em&gt;&amp;quot;The larger discussion is usually about where the alerts should go, who bears responsibility for remediation, and how to fit that work into the team's limited capacity. We spend a lot of time trying to ensure security isn't just something that sits alongside the business, but rather is a meaningful part of the daily routine.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Part of that effort is in tuning detection rules and alerting. &lt;em&gt;&amp;quot;Any time we surface an alert, it should be actionable and have a clear owner who is invested in never seeing that alert again.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“I think Falco's superpower is in the flexibility of the policies. I'm also really excited about the changes that are slated to make it easier to update them. Most rules aren't one-size-fits-all -- for a given policy, there is usually some refinement needed to ensure the policy makes sense within our platform, and then customers modify it even further to meet their security requirements. All that customization can make it incredibly difficult to reconcile,”&lt;/em&gt; said Stone. &lt;em&gt;“The fact that we can already do it with Falco speaks volumes about the versatility of the solution.”&lt;/em&gt;&lt;/p&gt;
&lt;h4 id="security-pack"&gt;Security Pack&lt;/h4&gt;
&lt;p&gt;Giant Swarm's &lt;a href="https://docs.giantswarm.io/app-platform/apps/security/"&gt;Security Pack&lt;/a&gt; is a collection of open source security tools offered by Giant Swarm, which not only contains Falco but also a plethora of other open source projects, including &lt;em&gt;Kyverno&lt;/em&gt; for policy enforcement, &lt;em&gt;Trivy&lt;/em&gt; for image scanning, and &lt;em&gt;Cosign&lt;/em&gt; for image signature verification.&lt;/p&gt;
&lt;p&gt;Security does not apply to a single level and, therefore, Security Pack consists of multiple applications, each one independently installable and configurable, available via their App Platform. &lt;em&gt;“Falco will be the cornerstone of our node-level security capabilities,”&lt;/em&gt; affirmed Stone, &lt;em&gt;“the biggest opportunity for API plug-ins I see is to get feedback from the node level back into the Security Pack so that we can further contextualize events in the ecosystem.”&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Adding simplicity to our cluster management is considered a requirement nowadays, especially in those cases where the lack of resources in an organization can keep it from achieving an acceptable level of security.&lt;/p&gt;
&lt;p&gt;Features like Giant Swarm's App Platform and Security Pack will help organizations to finally focus on what actually matters to them: Running their business. In the future, Giant Swarm plans to launch its security pack across all its customers' clusters, enabled by default and built on Falco.&lt;/p&gt;</description></item><item><title>Blog: Kubernetes Response Engine, Part 9: Falcosidekick + Fission</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-9-fission/</link><pubDate>Wed, 01 Sep 2021 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-9-fission/</guid><description>
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This blog post is part of a series of articles about how to create a &lt;code&gt;Kubernetes&lt;/code&gt; response engine with &lt;code&gt;Falco&lt;/code&gt;, &lt;code&gt;Falcosidekick&lt;/code&gt; and a &lt;code&gt;FaaS&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;See other posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-1-kubeless/"&gt;Kubernetes Response Engine, Part 1 : Falcosidekick + Kubeless&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-2-openfaas/"&gt;Kubernetes Response Engine, Part 2 : Falcosidekick + OpenFaas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-3-knative/"&gt;Kubernetes Response Engine, Part 3 : Falcosidekick + Knative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-4-tekton/"&gt;Kubernetes Response Engine, Part 4 : Falcosidekick + Tekton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-5-argo/"&gt;Kubernetes Response Engine, Part 5 : Falcosidekick + Argo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/"&gt;Kubernetes Response Engine, Part 6 : Falcosidekick + Cloud Run&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-7-cloud-functions/"&gt;Kubernetes Response Engine, Part 7 : Falcosidekick + Cloud Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-8-fluxv2/"&gt;Kubernetes Response Engine, Part 8: Falcosidekick + Flux v2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;The earlier posts in this series, show how to use Kubeless, Argo, Knative, and others to trigger a resource after getting input from Falcosidekick.
Recently, Falcosidekick received a new output type support for &lt;a href="https://github.com/falcosecurity/falcosidekick/pull/255"&gt;Fission&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this blog post, we will cover using &lt;code&gt;Falcosidekick&lt;/code&gt; and &lt;code&gt;Fission&lt;/code&gt; to detect and delete a compromised pod in a Kubernetes cluster.
We will briefly talk about Fission in this blog, however, you can check the complete documentation &lt;a href="https://fission.io/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;We need tools with the following minimum versions to achieve this demo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Minikube v1.19.0&lt;/li&gt;
&lt;li&gt;Helm v3.5.4&lt;/li&gt;
&lt;li&gt;kubectl v1.21.0&lt;/li&gt;
&lt;li&gt;fission-cli v1.13.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="provision-local-kubernetes-cluster"&gt;Provision local Kubernetes Cluster&lt;/h3&gt;
&lt;p&gt;There are various ways to provision a local Kubernetes cluster such as, KinD, k3s, k0s, Minikube, etc. We are going to
use Minikube in this walkthrough.&lt;/p&gt;
&lt;p&gt;Let's get provisioned a local Kubernetes cluster:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ minikube start --cpus &lt;span style="color:#666"&gt;3&lt;/span&gt; --memory &lt;span style="color:#666"&gt;8192&lt;/span&gt; --vm-driver virtualbox
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;😄 minikube v1.19.0 on Darwin 10.15.7
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;✨ Using the virtualbox driver based on user configuration
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;👍 Starting control plane node minikube in cluster minikube
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;🔥 Creating virtualbox VM &lt;span style="color:#666"&gt;(&lt;/span&gt;&lt;span style="color:#b8860b"&gt;CPUs&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;3, &lt;span style="color:#b8860b"&gt;Memory&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;8192MB, &lt;span style="color:#b8860b"&gt;Disk&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;20000MB&lt;span style="color:#666"&gt;)&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;🐳 Preparing Kubernetes v1.20.2 on Docker 20.10.4 ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▪ Generating certificates and keys ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▪ Booting up control plane ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▪ Configuring RBAC rules ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;🔎 Verifying Kubernetes components...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;🌟 Enabled addons: storage-provisioner, default-storageclass
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;🏄 Done! kubectl is now configured to use &lt;span style="color:#b44"&gt;&amp;#34;minikube&amp;#34;&lt;/span&gt; cluster and &lt;span style="color:#b44"&gt;&amp;#34;default&amp;#34;&lt;/span&gt; namespace by default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="install-fission"&gt;Install Fission&lt;/h2&gt;
&lt;p&gt;Fission is a fast, open source serverless framework for Kubernetes with a focus on developer productivity and high performance.
Fission operates on just the code: Docker and Kubernetes are abstracted away under normal operation, though you can use both to extend Fission if you want to.&lt;/p&gt;
&lt;p&gt;Follow the official documentation for &lt;a href="https://docs.fission.io/docs/installation/"&gt;deploying Fission to Kubernetes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here we will be using Helm to install Fission:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#a2f"&gt;export&lt;/span&gt; &lt;span style="color:#b8860b"&gt;FISSION_NAMESPACE&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;fission&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl create namespace &lt;span style="color:#b8860b"&gt;$FISSION_NAMESPACE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl create -k &lt;span style="color:#b44"&gt;&amp;#34;github.com/fission/fission/crds/v1?ref=1.13.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ helm repo add fission-charts https://fission.github.io/fission-charts/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ helm repo update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ helm install --version 1.13.1 --namespace &lt;span style="color:#b8860b"&gt;$FISSION_NAMESPACE&lt;/span&gt; fission fission-charts/fission-all
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME: fission
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LAST DEPLOYED: Wed Jul &lt;span style="color:#666"&gt;21&lt;/span&gt; 18:03:44 &lt;span style="color:#666"&gt;2021&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAMESPACE: fission
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;STATUS: deployed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;REVISION: &lt;span style="color:#666"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TEST SUITE: None
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NOTES:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1. Install the client CLI.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Mac:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $ curl -Lo fission https://github.com/fission/fission/releases/download/1.13.1/fission-1.13.1-darwin-amd64 &lt;span style="color:#666"&gt;&amp;amp;&amp;amp;&lt;/span&gt; chmod +x fission &lt;span style="color:#666"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo mv fission /usr/local/bin/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Linux:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $ curl -Lo fission https://github.com/fission/fission/releases/download/1.13.1/fission-1.13.1-linux-amd64 &lt;span style="color:#666"&gt;&amp;amp;&amp;amp;&lt;/span&gt; chmod +x fission &lt;span style="color:#666"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo mv fission /usr/local/bin/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Windows:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; For Windows, you can use the linux binary on WSL. Or you can download this windows executable: https://github.com/fission/fission/releases/download/1.13.1/fission-1.13.1-windows-amd64.exe
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2. You&lt;span style=""&gt;&amp;#39;&lt;/span&gt;re ready to use Fission!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#080;font-style:italic"&gt;# Create an environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $ fission env create --name nodejs --image fission/node-env
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#080;font-style:italic"&gt;# Get a hello world&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $ curl https://raw.githubusercontent.com/fission/examples/master/nodejs/hello.js &amp;gt; hello.js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#080;font-style:italic"&gt;# Register this function with Fission&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $ fission &lt;span style="color:#a2f;font-weight:bold"&gt;function&lt;/span&gt; create --name hello --env nodejs --code hello.js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#080;font-style:italic"&gt;# Run this function&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $ fission &lt;span style="color:#a2f;font-weight:bold"&gt;function&lt;/span&gt; &lt;span style="color:#a2f"&gt;test&lt;/span&gt; --name hello
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Hello, world!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check if everything is working before moving onto the next step:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods --namespace fission
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;buildermgr-5698c89fff-rk9z6 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;controller-5dcb44bcd6-vq9hb 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;executor-6b6d6469d6-2xrlk 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fission-kube-state-metrics-5fc9bd6684-7ffwp 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fission-prometheus-alertmanager-65f5574885-tlrz6 2/2 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fission-prometheus-node-exporter-jd9w6 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fission-prometheus-node-exporter-jpzn8 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fission-prometheus-node-exporter-rb25l 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fission-prometheus-pushgateway-54c87b5796-28x2h 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fission-prometheus-server-9d64c74b4-ld97h 2/2 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;influxdb-59649c8c6-5vx54 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubewatcher-6996fccc6b-5vbvx 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logger-6kdw4 2/2 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logger-nmw9t 2/2 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logger-zkrq9 2/2 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mqtrigger-keda-7584989c48-n5w6g 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mqtrigger-nats-streaming-664c55c979-t9gp5 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m19s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nats-streaming-6c6d7c6fbf-ft468 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;router-5c5c6cbb87-989pc 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;storagesvc-57ccf58976-qcr4d 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m19s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;timer-794b89579b-6kxwx 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 7m20s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="install-falco-falcosidekick"&gt;Install Falco + Falcosidekick&lt;/h2&gt;
&lt;p&gt;Firstly, we'll create the namespace that will host both &lt;code&gt;Falco&lt;/code&gt; and &lt;code&gt;Falcosidekick&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl create namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We add the &lt;code&gt;helm&lt;/code&gt; repo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ helm repo add falcosecurity https://falcosecurity.github.io/charts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;&amp;#34;falcosecurity&amp;#34;&lt;/span&gt; has been added to your repositories
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ helm repo update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hang tight &lt;span style="color:#a2f;font-weight:bold"&gt;while&lt;/span&gt; we grab the latest from your chart repositories...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...Successfully got an update from the &lt;span style="color:#b44"&gt;&amp;#34;falcosecurity&amp;#34;&lt;/span&gt; chart repository
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...Successfully got an update from the &lt;span style="color:#b44"&gt;&amp;#34;openfaas&amp;#34;&lt;/span&gt; chart repository
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Update Complete. ⎈Happy Helming!⎈
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In a real project, you should get the whole chart with &lt;code&gt;helm pull falcosecurity/falco --untar&lt;/code&gt; and then configure
the &lt;code&gt;values.yaml&lt;/code&gt;. For this tutorial, will try to keep thing as easy as possible and set configs directly
by passing arguments to &lt;code&gt;helm install&lt;/code&gt; command line:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ helm upgrade --install falco falcosecurity/falco --namespace falco &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falcosidekick.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falcosidekick.config.fission.function&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;falco-pod-delete&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should get this output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Release &lt;span style="color:#b44"&gt;&amp;#34;falco&amp;#34;&lt;/span&gt; does not exist. Installing it now.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME: falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LAST DEPLOYED: Tue Apr &lt;span style="color:#666"&gt;13&lt;/span&gt; 10:49:49 &lt;span style="color:#666"&gt;2021&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAMESPACE: falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;STATUS: deployed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;REVISION: &lt;span style="color:#666"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NOTES:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Falco agents are spinning up on each node in your cluster. After a few
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;seconds, they are going to start monitoring your containers looking &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;security issues.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;No further action should be required.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And you can see your new &lt;code&gt;Falco&lt;/code&gt; and &lt;code&gt;Falcosidekick&lt;/code&gt;pods:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods --namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-f77c58899-gd467 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 51s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-f77c58899-hfsjx 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 51s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-hg2wm 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 51s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The argument &lt;code&gt;falcosidekick.enabled=true&lt;/code&gt; sets the following settings in &lt;em&gt;Falco&lt;/em&gt; for you:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falco.jsonOutput&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falco.httpOutput.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falco.httpOutput.url&lt;span style="color:#666"&gt;=&lt;/span&gt;http://falco-falcosidekick:2801
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The
arguments &lt;code&gt;--set falco.jsonOutput=true --set falco.httpOutput.enabled=true --set falco.httpOutput.url=http://falco-falcosidekick:2801&lt;/code&gt;
are there to configure the format of events and the URL where &lt;code&gt;Falco&lt;/code&gt; will send them.
As &lt;code&gt;Falco&lt;/code&gt; and &lt;code&gt;Falcosidekick&lt;/code&gt; will
be in the same namespace, it can directly use the name of the service (&lt;code&gt;falco-falcosidekick&lt;/code&gt;) above &lt;code&gt;Falcosidekick&lt;/code&gt; pods.&lt;/p&gt;
&lt;p&gt;We check the logs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl logs deployment/falco-falcosidekick -n falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Found &lt;span style="color:#666"&gt;2&lt;/span&gt; pods, using pod/falco-falcosidekick-f77c58899-gd467
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/07/21 12:52:02 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : Enabled Outputs : &lt;span style="color:#666"&gt;[&lt;/span&gt;Fission&lt;span style="color:#666"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/07/21 12:52:02 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : Falco Sidekick is up and listening on :2801
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Fission&lt;/code&gt; is displayed as enabled output, everything is good 👍.&lt;/p&gt;
&lt;h2 id="install-our-fission-function"&gt;Install our Fission Function&lt;/h2&gt;
&lt;p&gt;Our really basic function will receive events from &lt;code&gt;Falco&lt;/code&gt;, thanks to &lt;code&gt;Falcosidekick&lt;/code&gt;, check if the triggered rule is
&lt;a href="https://github.com/falcosecurity/falco/blob/0d7068b048772b1e2d3ca5c86c30b3040eac57df/rules/falco_rules.yaml#L2063"&gt;Terminal Shell in container&lt;/a&gt;,
extract the &lt;em&gt;namespace&lt;/em&gt; and &lt;em&gt;pod name&lt;/em&gt; from the fields of events and delete the according pod:&lt;/p&gt;
&lt;p&gt;Basically, the process is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; +----------+ +---------------+ +----------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Falco +-----------------&amp;gt; Falcosidekick +--------------------&amp;gt; Fission |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; +----^-----+ sends event +---------------+ triggers +-----+----+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;detects a shell | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; +----+-------+ deletes |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Pwned Pod &amp;lt;----------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; +------------+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let's get the function and other artifacts:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ git clone https://github.com/fission/examples.git &amp;amp;&amp;amp; cd examples/sample/falco
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The function we are going to deploy basically receives events for an infected pod from the &lt;em&gt;Falcosidekick&lt;/em&gt; and deletes it immediately.
Before deploying the function we need some permissions to delete Pod.
We create a &lt;code&gt;ServiceAccount&lt;/code&gt; with rights to delete a Pod in any namespace, and we'll associate it to our function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;apiVersion&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;v1&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;kind&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;ServiceAccount&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;metadata&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;falco-pod-delete&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;namespace&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;fission-function&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00f;font-weight:bold"&gt;---&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;kind&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;ClusterRole&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;apiVersion&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;rbac.authorization.k8s.io/v1&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;metadata&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;falco-pod-delete-cluster-role&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;rules&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#008000;font-weight:bold"&gt;apiGroups&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;[&lt;span style="color:#b44"&gt;&amp;#34;&amp;#34;&lt;/span&gt;]&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;resources&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;[&lt;span style="color:#b44"&gt;&amp;#34;configmaps&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;secrets&amp;#34;&lt;/span&gt;]&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;verbs&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;[&lt;span style="color:#b44"&gt;&amp;#34;get&amp;#34;&lt;/span&gt;]&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#008000;font-weight:bold"&gt;apiGroups&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;[&lt;span style="color:#b44"&gt;&amp;#34;&amp;#34;&lt;/span&gt;]&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;resources&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;[&lt;span style="color:#b44"&gt;&amp;#34;pods&amp;#34;&lt;/span&gt;]&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;verbs&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;[&lt;span style="color:#b44"&gt;&amp;#34;get&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;list&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;delete&amp;#34;&lt;/span&gt;]&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#008000;font-weight:bold"&gt;apiGroups&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;[&lt;span style="color:#b44"&gt;&amp;#34;&amp;#34;&lt;/span&gt;]&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;resources&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;[&lt;span style="color:#b44"&gt;&amp;#34;events&amp;#34;&lt;/span&gt;]&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;verbs&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;[&lt;span style="color:#b44"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;]&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#008000;font-weight:bold"&gt;apiGroups&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;[&lt;span style="color:#b44"&gt;&amp;#34;fission.io&amp;#34;&lt;/span&gt;]&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;resources&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;[&lt;span style="color:#b44"&gt;&amp;#34;packages&amp;#34;&lt;/span&gt;]&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;verbs&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;[&lt;span style="color:#b44"&gt;&amp;#34;get&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;list&amp;#34;&lt;/span&gt;]&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00f;font-weight:bold"&gt;---&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;kind&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;ClusterRoleBinding&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;apiVersion&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;rbac.authorization.k8s.io/v1&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;metadata&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;falco-pod-delete-cluster-role-binding&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;roleRef&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;kind&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;ClusterRole&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;falco-pod-delete-cluster-role&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;apiGroup&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;rbac.authorization.k8s.io&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;subjects&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#008000;font-weight:bold"&gt;kind&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;ServiceAccount&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;falco-pod-delete&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;namespace&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;fission-function&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let's create the service account with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl apply -f sa-falco-pod-delete.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;falco-pod-delete/handler.go&lt;/code&gt; contains our function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-golang" data-lang="golang"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;package&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;main&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;import&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;context&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;encoding/json&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;io/ioutil&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;log&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;metaV1&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;k8s.io/apimachinery/pkg/apis/meta/v1&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;k8s.io/client-go/kubernetes&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;k8s.io/client-go/rest&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubeClient&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;*&lt;/span&gt;kubernetes.Clientset&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;init&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// creates the in-cluster config&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;config,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;rest.&lt;span style="color:#00a000"&gt;InClusterConfig&lt;/span&gt;()&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f"&gt;panic&lt;/span&gt;(err.&lt;span style="color:#00a000"&gt;Error&lt;/span&gt;())&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// creates the clientset&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubeClient,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubernetes.&lt;span style="color:#00a000"&gt;NewForConfig&lt;/span&gt;(config)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f"&gt;panic&lt;/span&gt;(err.&lt;span style="color:#00a000"&gt;Error&lt;/span&gt;())&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Alert&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Output&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;output&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Priority&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;priority&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Rule&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;rule&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Time&lt;span style="color:#bbb"&gt; &lt;/span&gt;time.Time&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;time&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;OutputFields&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ContainerID&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;container.id&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ContainerImageRepository&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;interface&lt;/span&gt;{}&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;container.image.repository&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ContainerImageTag&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;interface&lt;/span&gt;{}&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;container.image.tag&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;EvtTime&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;int64&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;evt.time&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;FdName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;fd.name&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;K8SNsName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;k8s.ns.name&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;K8SPodName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;k8s.pod.name&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ProcCmdline&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;proc.cmdline&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;output_fields&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;criticalNamespaces&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;[]&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;{&lt;span style="color:#b44"&gt;&amp;#34;kube-system&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;kube-public&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;kube-node-lease&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;falco&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;fission&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;fission-function&amp;#34;&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;Handler&lt;/span&gt;(w&lt;span style="color:#bbb"&gt; &lt;/span&gt;http.ResponseWriter,&lt;span style="color:#bbb"&gt; &lt;/span&gt;r&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;*&lt;/span&gt;http.Request)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;alert&lt;span style="color:#bbb"&gt; &lt;/span&gt;Alert&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;r.Body&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;defer&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;r.Body.&lt;span style="color:#00a000"&gt;Close&lt;/span&gt;()&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;body,&lt;span style="color:#bbb"&gt; &lt;/span&gt;_&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ioutil.&lt;span style="color:#00a000"&gt;ReadAll&lt;/span&gt;(r.Body)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;json.&lt;span style="color:#00a000"&gt;Unmarshal&lt;/span&gt;(body,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;&amp;amp;&lt;/span&gt;alert)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;\n[ INFO ] Alert : %v\n&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;alert)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;podName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;alert.OutputFields.K8SPodName&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;namespace&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;alert.OutputFields.K8SNsName&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;critical&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;bool&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;_,&lt;span style="color:#bbb"&gt; &lt;/span&gt;ns&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;range&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;criticalNamespaces&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ns&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;==&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;namespace&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;critical&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;break&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;!critical&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;_,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubeClient.&lt;span style="color:#00a000"&gt;CoreV1&lt;/span&gt;().&lt;span style="color:#00a000"&gt;Pods&lt;/span&gt;(namespace).&lt;span style="color:#00a000"&gt;Get&lt;/span&gt;(context.&lt;span style="color:#00a000"&gt;Background&lt;/span&gt;(),&lt;span style="color:#bbb"&gt; &lt;/span&gt;podName,&lt;span style="color:#bbb"&gt; &lt;/span&gt;metaV1.GetOptions{})&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;\n[ WARN ] Failed to get pod &amp;#39;%s&amp;#39; in &amp;#39;%s&amp;#39; namespace&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;podName,&lt;span style="color:#bbb"&gt; &lt;/span&gt;namespace)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;Deleting pod %s from namespace %s&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;podName,&lt;span style="color:#bbb"&gt; &lt;/span&gt;namespace)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubeClient.&lt;span style="color:#00a000"&gt;CoreV1&lt;/span&gt;().&lt;span style="color:#00a000"&gt;Pods&lt;/span&gt;(namespace).&lt;span style="color:#00a000"&gt;Delete&lt;/span&gt;(context.&lt;span style="color:#00a000"&gt;Background&lt;/span&gt;(),&lt;span style="color:#bbb"&gt; &lt;/span&gt;podName,&lt;span style="color:#bbb"&gt; &lt;/span&gt;metaV1.DeleteOptions{})&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;\n[ ERROR ] Failed to delete pod: %v&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;w.&lt;span style="color:#00a000"&gt;WriteHeader&lt;/span&gt;(http.StatusInternalServerError)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;w.&lt;span style="color:#00a000"&gt;Write&lt;/span&gt;([]&lt;span style="color:#a2f"&gt;byte&lt;/span&gt;(err.&lt;span style="color:#00a000"&gt;Error&lt;/span&gt;()))&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;w.&lt;span style="color:#00a000"&gt;WriteHeader&lt;/span&gt;(http.StatusOK)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;w.&lt;span style="color:#00a000"&gt;Write&lt;/span&gt;([]&lt;span style="color:#a2f"&gt;byte&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;))&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A fission function requires an environment/runtime to run.
The &lt;code&gt;yaml&lt;/code&gt; definitions for the runtime, the function and the router are available under the &lt;code&gt;specs&lt;/code&gt; directory.&lt;/p&gt;
&lt;p&gt;Now, we are ready to deploy our &lt;em&gt;falco-pod-delete&lt;/em&gt; function using the specs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ fission spec apply
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DeployUID: edc80e3e-7d1e-448c-aba8-c8cd75b3a1eb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Resources:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * &lt;span style="color:#666"&gt;1&lt;/span&gt; Functions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * &lt;span style="color:#666"&gt;1&lt;/span&gt; Environments
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * &lt;span style="color:#666"&gt;1&lt;/span&gt; Packages
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * &lt;span style="color:#666"&gt;1&lt;/span&gt; Http Triggers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * &lt;span style="color:#666"&gt;0&lt;/span&gt; MessageQueue Triggers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * &lt;span style="color:#666"&gt;0&lt;/span&gt; Time Triggers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * &lt;span style="color:#666"&gt;0&lt;/span&gt; Kube Watchers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * &lt;span style="color:#666"&gt;1&lt;/span&gt; ArchiveUploadSpec
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Validation Successful
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Spec doesn&lt;span style=""&gt;&amp;#39;&lt;/span&gt;t belong to Git Tree.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;1&lt;/span&gt; &lt;span style="color:#a2f;font-weight:bold"&gt;function&lt;/span&gt; created: falco-pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;1&lt;/span&gt; HTTPTrigger created: falco-pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;1&lt;/span&gt; environment created: go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;1&lt;/span&gt; package created: falco-pod-delete-d18f6a0b-e5a1-4275-9471-38d684ac4dfe
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check if the package was built successfully for our fission function before moving to the next step:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ fission pkg list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME BUILD_STATUS ENV LASTUPDATEDAT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-pod-delete-d18f6a0b-e5a1-4275-9471-38d684ac4dfe succeeded go &lt;span style="color:#666"&gt;21&lt;/span&gt; Jul &lt;span style="color:#666"&gt;21&lt;/span&gt; 08:26 IST
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="test-our-function"&gt;Test our function&lt;/h2&gt;
&lt;p&gt;We start by creating a dumb pod:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl run alpine --namespace default --image&lt;span style="color:#666"&gt;=&lt;/span&gt;alpine --restart&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;Never&amp;#39;&lt;/span&gt; -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;sleep 600&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pod/alpine created
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods --namespace default
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alpine 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 11s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let's run a &lt;em&gt;shell&lt;/em&gt; command inside and see what happens:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; -i --tty alpine --namespace default -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;uptime&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;19:27:21 up &lt;span style="color:#666"&gt;50&lt;/span&gt; min, load average: 0.11, 0.12, 0.11
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As expected we got the result of our command, but, if we get the status of the pod we retrieve:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods --namespace default
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alpine 1/1 Terminating &lt;span style="color:#666"&gt;0&lt;/span&gt; 103s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;💥 &lt;strong&gt;It has been terminated&lt;/strong&gt; 💥&lt;/p&gt;
&lt;p&gt;We can now check the logs of components.&lt;/p&gt;
&lt;p&gt;For &lt;code&gt;Falco&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl logs daemonset/falco --namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;..
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;{&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;output&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;10:36:32.750441241: Notice A shell was spawned in a container with an attached terminal (user=root user_loginuid=-1 k8s.ns=default k8s.pod=alpine container=cbd3133ccac6 shell=sh parent=runc cmdline=sh -c uptime terminal=34816 container_id=cbd3133ccac6 image=alpine) k8s.ns=default k8s.pod=alpine container=cbd3133ccac6&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;priority&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;Notice&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;rule&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;Terminal shell in container&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;2021-07-21T10:36:32.750441241Z&amp;#34;&lt;/span&gt;, &lt;span style="color:#b44"&gt;&amp;#34;output_fields&amp;#34;&lt;/span&gt;: &lt;span style="color:#666"&gt;{&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;container.id&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;cbd3133ccac6&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;container.image.repository&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;alpine&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;evt.time&amp;#34;&lt;/span&gt;:1626863792750441241,&lt;span style="color:#b44"&gt;&amp;#34;k8s.ns.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;k8s.pod.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;alpine&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.cmdline&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;sh -c uptime&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;sh&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.pname&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;runc&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.tty&amp;#34;&lt;/span&gt;:34816,&lt;span style="color:#b44"&gt;&amp;#34;user.loginuid&amp;#34;&lt;/span&gt;:-1,&lt;span style="color:#b44"&gt;&amp;#34;user.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span style="color:#666"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;{&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;output&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;10:37:09.101509967: Notice Unexpected connection to K8s API Server from container (command=fetcher -secret-dir /secrets -cfgmap-dir /configs -jaeger-collector-endpoint /userfunc k8s.ns=fission-function k8s.pod=poolmgr-go-default-516098-5bdbf8c8f5-g8gvc container=281c99ea33c2 image=fission/fetcher:1.13.1 connection=192.168.43.223:39526-&amp;gt;10.100.0.1:443) k8s.ns=fission-function k8s.pod=poolmgr-go-default-516098-5bdbf8c8f5-g8gvc container=281c99ea33c2&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;priority&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;Notice&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;rule&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;Contact K8S API Server From Container&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;2021-07-21T10:37:09.101509967Z&amp;#34;&lt;/span&gt;, &lt;span style="color:#b44"&gt;&amp;#34;output_fields&amp;#34;&lt;/span&gt;: &lt;span style="color:#666"&gt;{&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;container.id&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;281c99ea33c2&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;container.image.repository&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;fission/fetcher&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;container.image.tag&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;1.13.1&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;evt.time&amp;#34;&lt;/span&gt;:1626863829101509967,&lt;span style="color:#b44"&gt;&amp;#34;fd.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;192.168.43.223:39526-&amp;gt;10.100.0.1:443&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;k8s.ns.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;fission-function&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;k8s.pod.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;poolmgr-go-default-516098-5bdbf8c8f5-g8gvc&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.cmdline&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;fetcher -secret-dir /secrets -cfgmap-dir /configs -jaeger-collector-endpoint /userfunc&amp;#34;&lt;/span&gt;&lt;span style="color:#666"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;..
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For &lt;code&gt;Falcosidekick&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl logs deployment/falco-falcosidekick --namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;..
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/07/21 10:37:13 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : Fission - Post OK &lt;span style="color:#666"&gt;(&lt;/span&gt;200&lt;span style="color:#666"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/07/21 10:36:32 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : Fission - Function Response : OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/07/21 10:36:32 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : Fission - Call Function &lt;span style="color:#b44"&gt;&amp;#34;falco-pod-delete&amp;#34;&lt;/span&gt; OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;..
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For &lt;em&gt;falco-delete-pod&lt;/em&gt; function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ fission &lt;span style="color:#a2f;font-weight:bold"&gt;function&lt;/span&gt; logs -f --name falco-pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;..
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;2021-07-21 10:47:27.206605532 +0000 UTC&lt;span style="color:#666"&gt;]&lt;/span&gt; 2021/07/21 10:47:27 Deleting pod alpine from namespace default
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;..
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;With this really simple example, we got another way to create a Response Engine with amazing pieces of software from the Open Source world.
We only scratched the surface of possibilities, so don't hesitate to share with us your comments, ideas and successes.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you would like to find out more about Falco:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get started in &lt;a href="http://falco.org/"&gt;Falco.org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out the
&lt;a href="https://github.com/falcosecurity/falco"&gt;Falco project in GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Get involved in the &lt;a href="https://falco.org/community/"&gt;Falco community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Meet the maintainers on the
&lt;a href="https://kubernetes.slack.com/?redir=%2Farchives%2FCMWH3EH32"&gt;Falco Slack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Follow &lt;a href="https://twitter.com/falco_org"&gt;@falco_org on Twitter&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Blog: Kubernetes Response Engine, Part 8: Falcosidekick + Flux v2</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-8-fluxv2/</link><pubDate>Tue, 31 Aug 2021 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-8-fluxv2/</guid><description>
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This blog post is part of a series of articles about how to create a &lt;code&gt;Kubernetes&lt;/code&gt; response engine with &lt;code&gt;Falco&lt;/code&gt;, &lt;code&gt;Falcosidekick&lt;/code&gt; and a &lt;code&gt;FaaS&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;See other posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-1-kubeless/"&gt;Kubernetes Response Engine, Part 1 : Falcosidekick + Kubeless&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-2-openfaas/"&gt;Kubernetes Response Engine, Part 2 : Falcosidekick + OpenFaas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-3-knative/"&gt;Kubernetes Response Engine, Part 3 : Falcosidekick + Knative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-4-tekton/"&gt;Kubernetes Response Engine, Part 4 : Falcosidekick + Tekton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-5-argo/"&gt;Kubernetes Response Engine, Part 5 : Falcosidekick + Argo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/"&gt;Kubernetes Response Engine, Part 6 : Falcosidekick + Cloud Run&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-7-cloud-functions/"&gt;Kubernetes Response Engine, Part 7 : Falcosidekick + Cloud Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Today, we will set up another KRE (Kubernetes Response Engine) based on &lt;code&gt;Flux (version 2)&lt;/code&gt;. If you don't know about &lt;code&gt;Flux (version 2)&lt;/code&gt;, let me explain it in a few words. &lt;code&gt;Flux (version 2)&lt;/code&gt; is a tool for keeping Kubernetes clusters in sync with configuration sources (such as Git repositories) and automating updates to the configuration when new code is available to deploy.&lt;/p&gt;
&lt;p&gt;To learn more about &lt;code&gt;Flux (version 2)&lt;/code&gt;, see &lt;a href="https://fluxcd.io/docs/"&gt;Flux Documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Flux (version 2)&lt;/code&gt; might look like a GitOps tool. It is, in reality, another GitOps tool in that it watches Github repositories for configuration changes and keeps the current state and the desired state always in sync. It does that on top of Kubernetes by using a bunch of CRs (Custom Resources). However, unlike Knative Eventing, Tekton Triggers, and Argo Events, &lt;code&gt;Flux (version 2)&lt;/code&gt; does not support an eventing system to forward events from one point to another.&lt;/p&gt;
&lt;p&gt;To set up KRE with &lt;code&gt;Flux (version 2)&lt;/code&gt;, we will create a small project that listens to events and updates the GitHub repository, which &lt;code&gt;Flux (version 2)&lt;/code&gt; monitors to alter the desired state. For example, get the event of a pwned pod, then change its replicas to zero within the deployment YAML file.&lt;/p&gt;
&lt;p&gt;The reference architecture given below illustrates the content of this blog.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/docs/images/kre_flux_v2_gitops_toolkit.png" alt="kre_flux_v2_gitops_toolkit" loading="lazy" /&gt;
&lt;/p&gt;
&lt;!-- START doctoc generated TOC please keep comment here to allow auto update --&gt;
&lt;!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --&gt;
&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-8-fluxv2/#prerequisites"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-8-fluxv2/#tutorial"&gt;Tutorial&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-8-fluxv2/#provision-local-kubernetes-cluster"&gt;Provision local Kubernetes Cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-8-fluxv2/#install-flux-v2---gitops-toolkit"&gt;Install Flux V2 - GitOps Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-8-fluxv2/#install-falco-event-listener"&gt;Install falco-event-listener&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-8-fluxv2/#installing-falco-and-falcosidekick"&gt;Installing Falco and Falcosidekick&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-8-fluxv2/#test"&gt;Test&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- END doctoc generated TOC please keep comment here to allow auto update --&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;minikube v1.21.0&lt;/li&gt;
&lt;li&gt;helm v3.6.2+gee407bd&lt;/li&gt;
&lt;li&gt;kubectl v1.21.1&lt;/li&gt;
&lt;li&gt;ko v0.8.3&lt;/li&gt;
&lt;li&gt;flux v0.16.0&lt;/li&gt;
&lt;li&gt;gcloud v347.0.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tutorial"&gt;Tutorial&lt;/h2&gt;
&lt;h3 id="provision-local-kubernetes-cluster"&gt;Provision local Kubernetes Cluster&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ minikube config view
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- cpus: &lt;span style="color:#666"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- driver: virtualbox
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- memory: &lt;span style="color:#666"&gt;8192&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;minikube start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="install-flux-v2-gitops-toolkit"&gt;Install Flux V2 - GitOps Toolkit&lt;/h3&gt;
&lt;p&gt;I highly recommended that you check out &lt;a href="https://fluxcd.io/docs/get-started/"&gt;getting started&lt;/a&gt; page of &lt;code&gt;Flux (version 2)&lt;/code&gt;. It gives you detailed installation instructions for &lt;code&gt;Flux (version 2)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For &lt;code&gt;Flux (version 2)&lt;/code&gt; to create a GitHub repository for its resources, we must define the token and username information. Then, &lt;code&gt;Flux (version 2)&lt;/code&gt; installed in a GitOps way, and &lt;code&gt;Flux (version 2)&lt;/code&gt; will push its manifest to the repository.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f"&gt;export&lt;/span&gt; &lt;span style="color:#b8860b"&gt;GITHUB_USER&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&amp;lt;username&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f"&gt;export&lt;/span&gt; &lt;span style="color:#b8860b"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&amp;lt;token&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once the necessary environment variables are defined, we can install &lt;code&gt;Flux (version 2)&lt;/code&gt;. The following command will create and push its manifests to the repository, then install Flux components.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;flux bootstrap github &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --owner&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b8860b"&gt;$GITHUB_USER&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --repository&lt;span style="color:#666"&gt;=&lt;/span&gt;fleet-infra &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --branch&lt;span style="color:#666"&gt;=&lt;/span&gt;main &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --path&lt;span style="color:#666"&gt;=&lt;/span&gt;./clusters/my-cluster &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --personal
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After the installation is complete, the next step is creating the alpine &lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-8-fluxv2/alpine-gitsource.yaml"&gt;GitRepository&lt;/a&gt; and &lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-8-fluxv2/alpine-kustomization.yaml"&gt;Kustomization&lt;/a&gt; CRD's (Custom Resource Definitions). For more information, see &lt;a href="https://fluxcd.io/docs/components/"&gt;components&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Apply the CRD files as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl apply -f https://raw.githubusercontent.com/developer-guy/kubernetes-response-engine-based-on-flux-v2-gitops-toolkit/master/alpine-gitsource.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitrepository.source.toolkit.fluxcd.io/alpine created
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl apply -f https://raw.githubusercontent.com/developer-guy/kubernetes-response-engine-based-on-flux-v2-gitops-toolkit/master/alpine-kustomization.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kustomization.kustomize.toolkit.fluxcd.io/alpine created
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alternatively, we can use the &lt;a href="https://fluxcd.io/docs/cmd/#installation"&gt;Flux CLI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To create &lt;code&gt;GitRepository&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;flux create &lt;span style="color:#a2f"&gt;source&lt;/span&gt; git alpine &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --url https://github.com/developer-guy/desired-state-repository &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --branch master &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --interval 30s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To create &lt;code&gt;Kustomization&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;flux create kustomization alpine &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --source alpine &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --path &lt;span style="color:#b44"&gt;&amp;#34;./&amp;#34;&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --prune &lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --validation client &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --interval 5m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="install-falco-event-listener"&gt;Install falco-event-listener&lt;/h3&gt;
&lt;p&gt;As the name suggests, this program will listen to an event in the form of &lt;code&gt;CloudEvents.&lt;/code&gt; This CloudEvents forwarded from Falcosidekick, a simple daemon for enhancing available outputs for Falco. After the successful receipt of the event, &lt;code&gt;falco-event-listener&lt;/code&gt; will update the YAML definition to scale its replicas to zero based on the pieces of information given in the event.&lt;/p&gt;
&lt;p&gt;In most basic form, the architecture of the demo is:&lt;/p&gt;
&lt;p&gt;Falco w/HTTP --&amp;gt; Falcosidekick w/CloudEvent --&amp;gt; falco-event-listener w/HTTP --&amp;gt; GitHub&lt;/p&gt;
&lt;p&gt;To learn more about &lt;code&gt;CloudEvents&lt;/code&gt;, see &lt;a href="https://cloudevents.io"&gt;cloudevents.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First, let us clone the &lt;code&gt;falco-event-listener&lt;/code&gt; repository.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/developer-guy/falco-event-listener
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f"&gt;cd&lt;/span&gt; falco-event-listener
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Before installing this project, we have to do a couple of things.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We have to &lt;a href="https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token"&gt;create a GitHub PAT (Personal Access Token)&lt;/a&gt; to be able to update the desired state configurations which are in the GitHub repository after we detect a malicious behavior related to our pod has detected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you can see in the above arguments, we should pass &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; as an argument to our CLI application. The best option is storing &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; in a Kubernetes Secret and &lt;a href="https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables"&gt;using Secret as environment variables&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl create namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl create secret generic github-secret &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --from-literal &lt;span style="color:#b8860b"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b8860b"&gt;$GITHUB_TOKEN&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;You might notice that we are using some URLs (--notify-url) within the flags of the project. Let me explain that why we need it a bit. As you might know, we are trying to set up some remediation engine here, so we have to react to those events thrown by the Falcosidekick as soon as possible. We defined an interval while creating a &lt;code&gt;GitRepository,&lt;/code&gt; which means that &lt;code&gt;Flux (version 2)&lt;/code&gt; will wait at least that long to sync configurations, so we have to notify &lt;code&gt;Flux (version 2)&lt;/code&gt; controllers about changes once we edited the desired state by a process whose name is &lt;code&gt;falco-event-listener.&lt;/code&gt; To notify the &lt;code&gt;Flux (version 2)&lt;/code&gt; controllers about changes in Git or Helm repositories, we can set up webhooks and trigger a cluster reconciliation every time a source changes. For more detail, please &lt;a href="https://fluxcd.io/docs/guides/webhook-receivers/"&gt;see&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are different kinds of webhook receivers in &lt;code&gt;Flux (version 2)&lt;/code&gt;, but we'll use the &lt;code&gt;generic&lt;/code&gt; one in this guide.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-golang" data-lang="golang"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;const&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;GenericReceiver&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;generic&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;GenericHMACReceiver&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;generic-hmac&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;GitHubReceiver&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;github&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;GitLabReceiver&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;gitlab&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;BitbucketReceiver&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;bitbucket&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;HarborReceiver&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;harbor&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;DockerHubReceiver&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;dockerhub&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;QuayReceiver&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;quay&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;GCRReceiver&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;gcr&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;NexusReceiver&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;nexus&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ACRReceiver&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;acr&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let us to create a &lt;code&gt;Receiver&lt;/code&gt;, to do that we have to a couple of things again:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#b8860b"&gt;TOKEN&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;head -c &lt;span style="color:#666"&gt;12&lt;/span&gt; /dev/urandom | sha256sum | cut -d &lt;span style="color:#b44"&gt;&amp;#39; &amp;#39;&lt;/span&gt; -f1&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#a2f"&gt;echo&lt;/span&gt; &lt;span style="color:#b8860b"&gt;$TOKEN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0babd54d2b64d6d6fcd10a663cb6195773e968ba6642ca8c1a8a54df7b52efd0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl -n flux-system create secret generic webhook-token &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--from-literal&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b8860b"&gt;token&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b8860b"&gt;$TOKEN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;secret/webhook-token created
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cat &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt; EOF | kubectl apply -f -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: notification.toolkit.fluxcd.io/v1beta1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: Receiver
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: generic-receiver
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: flux-system
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; type: generic
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; secretRef:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: webhook-token
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; resources:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - apiVersion: source.toolkit.fluxcd.io/v1beta1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; kind: GitRepository
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: alpine
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: flux-system
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;receiver.notification.toolkit.fluxcd.io/generic-receiver created
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cat &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt; EOF | kubectl apply -f -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: Service
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: receiver
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: flux-system
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; type: ClusterIP
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; selector:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; app: notification-controller
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; ports:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - name: http
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; port: 80
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; protocol: TCP
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; targetPort: 9292
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This program is basically a CLI application and it uses the following &lt;a href="https://github.com/developer-guy/falco-event-listener/blob/master/falcoeventlistener.yaml#L12"&gt;arguments as&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;args&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#b44"&gt;&amp;#34;--owner&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#b44"&gt;&amp;#34;developer-guy&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;# this is the owner of the desired state repository&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#b44"&gt;&amp;#34;--repository&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#b44"&gt;&amp;#34;desired-state-repository&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;# this is the repository which we store desired state configurations&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#b44"&gt;&amp;#34;--file&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#b44"&gt;&amp;#34;alpine.yaml&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;# this is the file that we are going to update&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#b44"&gt;&amp;#34;--github-token&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#b44"&gt;&amp;#34;$(GITHUB_TOKEN)&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#b44"&gt;&amp;#34;--notify-url&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;- &lt;span style="color:#b44"&gt;&amp;#34;http://receiver.flux-system/$(WEBHOOK_URL)&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let us run our project on the Kubernetes cluster. To do that, we'll be using the &lt;code&gt;ko tool.&lt;/code&gt; &lt;code&gt;ko,&lt;/code&gt; created by Google, is a simple, fast container image builder for Go applications. For more information, see the &lt;a href="https://github.com/google/ko"&gt;official repository&lt;/a&gt; of the project.&lt;/p&gt;
&lt;p&gt;We'll use &lt;code&gt;Container Registry&lt;/code&gt; as an image repository service provided by the Google Cloud to store, manage, and secure our container images. Alternatively, we could also use &lt;code&gt;DockerHub,&lt;/code&gt; &lt;code&gt;quay.io,&lt;/code&gt; and so on.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f"&gt;export&lt;/span&gt; &lt;span style="color:#b8860b"&gt;WEBHOOK_URL&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;kubectl get receivers -n flux-system generic-receiver -ojsonpath&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;{.status.url}&amp;#39;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f"&gt;export&lt;/span&gt; &lt;span style="color:#b8860b"&gt;PROJECT_ID&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;gcloud config get-value project&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f"&gt;export&lt;/span&gt; &lt;span style="color:#b8860b"&gt;KO_DOCKER_REPO&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;gcr.io/&lt;span style="color:#b8860b"&gt;$PROJECT_ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;envsubst &amp;lt; falcoeventlistener.yaml | ko apply -f -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;If you are using a private container registry, don't forget to create a registry secret to pull and push images. You can follow the following guide to achieve this: &lt;br&gt;
&lt;a href="https://colinwilson.uk/2020/07/09/using-google-container-registry-with-kubernetes/"&gt;https://colinwilson.uk/2020/07/09/using-google-container-registry-with-kubernetes/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If everything works as expected, we should see an output as given below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods --namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-event-listener 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 59s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The last step we have to do is installing &lt;code&gt;Falco&lt;/code&gt; and &lt;code&gt;Falcosidekick&lt;/code&gt; with configuring &lt;code&gt;Falcodekick&lt;/code&gt; to forward events to our application.&lt;/p&gt;
&lt;h3 id="installing-falco-and-falcosidekick"&gt;Installing Falco and Falcosidekick&lt;/h3&gt;
&lt;p&gt;For an up-to-date and detailed guide to installing Falco and Falcosidekick, see &lt;a href="https://github.com/falcosecurity/charts/blob/master/falcosidekick/README.md#installing-the-chart"&gt;falcosidekick&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Let us enable &lt;code&gt;CloudEvents&lt;/code&gt; support of &lt;code&gt;Falcosidekick.&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm repo add falcosecurity https://falcosecurity.github.io/charts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm repo update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm upgrade --install falco falcosecurity/falco &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --namespace falco &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --set falcosidekick.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --set falcosidekick.webui.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --set falcosidekick.config.cloudevents.address&lt;span style="color:#666"&gt;=&lt;/span&gt;http://falco-event-listener
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Verify that everything is working as expected:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods --namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-event-listener 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 5m19s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-5854669c76-ddvrv 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 2m16s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-5854669c76-rdlqn 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 2m16s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-ui-7c5fc8dd54-q4qh9 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 2m16s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-vkl4f 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 2m16s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="test"&gt;Test&lt;/h2&gt;
&lt;p&gt;To test this, we have to connect a shell within the container.&lt;/p&gt;
&lt;p&gt;Let's list the pods that we already have.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alpine-deployment-77789455d6-m7flp 1/1 Running &lt;span style="color:#666"&gt;15&lt;/span&gt; 3h6m
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alpine-deployment-77789455d6-v7fkw 1/1 Running &lt;span style="color:#666"&gt;15&lt;/span&gt; 3h6m
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;podinfo-6df788c7b8-gs5qb 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 3h28m
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;podinfo-6df788c7b8-sfxvd 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 3h28m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, run the following command to connect a shell.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; -ti alpine-deployment-77789455d6-m7flp -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;uptime&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;19:35:58 up 3:04, load average: 3.12, 1.91, 1.22
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once you run the command above, &lt;code&gt;Falco&lt;/code&gt; will detect that malicious behavior and send it to the Falcosidekick via HTTP.&lt;/p&gt;
&lt;p&gt;You should see an output in the &lt;code&gt;Falco&lt;/code&gt; logs as given below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;{&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;output&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;19:35:58.532086161: Notice A shell was spawned in a container with an attached terminal (user=root user_loginuid=-1 k8s.ns=default k8s.pod=alpine-deployment-77789455d6-m7flp container=788861c3cf83 shell=sh parent=runc cmdline=sh -c uptime terminal=34816 container_id=788861c3cf83 image=alpine) k8s.ns=default k8s.pod=alpine-deployment-77789455d6-m7flp container=788861c3cf83&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;priority&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;Notice&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;rule&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;Terminal shell in container&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;2021-06-13T19:35:58.532086161Z&amp;#34;&lt;/span&gt;, &lt;span style="color:#b44"&gt;&amp;#34;output_fields&amp;#34;&lt;/span&gt;: &lt;span style="color:#666"&gt;{&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;container.id&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;788861c3cf83&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;container.image.repository&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;alpine&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;evt.time&amp;#34;&lt;/span&gt;:1623612958532086161,&lt;span style="color:#b44"&gt;&amp;#34;k8s.ns.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;k8s.pod.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;alpine-deployment-77789455d6-m7flp&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.cmdline&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;sh -c uptime&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;sh&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.pname&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;runc&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.tty&amp;#34;&lt;/span&gt;:34816,&lt;span style="color:#b44"&gt;&amp;#34;user.loginuid&amp;#34;&lt;/span&gt;:-1,&lt;span style="color:#b44"&gt;&amp;#34;user.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span style="color:#666"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and the similar output below in the &lt;code&gt;Falcosidekick&lt;/code&gt; logs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-5854669c76-ddvrv falcosidekick 2021/06/13 19:51:45 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : CloudEvents - Send OK
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and the similar output below in the &lt;code&gt;falco-event-listener&lt;/code&gt; logs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-event-listener falco-event-listener 2021/06/13 19:35:59 resp.Status&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#666"&gt;200&lt;/span&gt; OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-event-listener falco-event-listener 2021/06/13 19:35:59 resp.StatusCode&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#666"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-event-listener falco-event-listener 2021/06/13 19:35:59 &lt;span style="color:#666"&gt;[&lt;/span&gt;Terminal shell in container&lt;span style="color:#666"&gt;]&lt;/span&gt; scaled down to zero alpine-deployment-77789455d6-m7flp from default because 19:35:58.532086161: Notice A shell was spawned in a container with an attached terminal &lt;span style="color:#666"&gt;(&lt;/span&gt;&lt;span style="color:#b8860b"&gt;user&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;root &lt;span style="color:#b8860b"&gt;user_loginuid&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;-1 k8s.ns&lt;span style="color:#666"&gt;=&lt;/span&gt;default k8s.pod&lt;span style="color:#666"&gt;=&lt;/span&gt;alpine-deployment-77789455d6-m7flp &lt;span style="color:#b8860b"&gt;container&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;788861c3cf83 &lt;span style="color:#b8860b"&gt;shell&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;sh &lt;span style="color:#b8860b"&gt;parent&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;runc &lt;span style="color:#b8860b"&gt;cmdline&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;sh -c uptime &lt;span style="color:#b8860b"&gt;terminal&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#666"&gt;34816&lt;/span&gt; &lt;span style="color:#b8860b"&gt;container_id&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;788861c3cf83 &lt;span style="color:#b8860b"&gt;image&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;alpine&lt;span style="color:#666"&gt;)&lt;/span&gt; k8s.ns&lt;span style="color:#666"&gt;=&lt;/span&gt;default k8s.pod&lt;span style="color:#666"&gt;=&lt;/span&gt;alpine-deployment-77789455d6-m7flp &lt;span style="color:#b8860b"&gt;container&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;788861c3cf83
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/docs/images/kre_flux_v2_gitops_test_result.png" alt="kre_flux_v2_gitops_test_result" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;You should also notice that a new commit is available in the &lt;code&gt;desired-state-repository&lt;/code&gt; as given below:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/docs/images/kre_flux_v2_gitops_update_desired_state_repository.png" alt="kre_flux_v2_gitops_update_desired_state_repository" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;After the commit, &lt;code&gt;Flux (version 2)&lt;/code&gt; will detect the change and sync the current state of the cluster with the desired state in the GitHub repository so that &lt;code&gt;Flux (version 2)&lt;/code&gt; will terminate the alpine deployment pods.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods -l &lt;span style="color:#b8860b"&gt;app&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;alpine
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;No resources found in default namespace.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Blog: Kubernetes Response Engine, Part 7: Falcosidekick + Cloud Functions</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-7-cloud-functions/</link><pubDate>Tue, 29 Jun 2021 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-7-cloud-functions/</guid><description>
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This blog post is part of a series of articles about how to create a &lt;code&gt;Kubernetes&lt;/code&gt; response engine with &lt;code&gt;Falco&lt;/code&gt;, &lt;code&gt;Falcosidekick&lt;/code&gt; and a &lt;code&gt;FaaS&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;See other posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-1-kubeless/"&gt;Kubernetes Response Engine, Part 1 : Falcosidekick + Kubeless&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-2-openfaas/"&gt;Kubernetes Response Engine, Part 2 : Falcosidekick + OpenFaas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-3-knative/"&gt;Kubernetes Response Engine, Part 3 : Falcosidekick + Knative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-4-tekton/"&gt;Kubernetes Response Engine, Part 4 : Falcosidekick + Tekton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-5-argo/"&gt;Kubernetes Response Engine, Part 5 : Falcosidekick + Argo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/"&gt;Kubernetes Response Engine, Part 6 : Falcosidekick + Cloud Run&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Earlier in this series, we have seen how to use Argo, Tekton, and Knative to trigger a resource after getting input from Falcosidekick.
Recently, Falcosidekick received a new output type support for &lt;a href="https://github.com/falcosecurity/falcosidekick/pull/241"&gt;Cloud Functions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this part, let us learn how we can use Falcosidekick and Cloud Functions to detect and delete a compromised pod.&lt;/p&gt;
&lt;p&gt;We will not go through what Cloud Functions is in-depth, however, you can always find a good overview about it in the &lt;a href="https://cloud.google.com/functions"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is the high-level overview architecture that shows what we want to achieve at the end of the day:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/docs/images/cloud_functions_reference_arch.png" alt="cloud_functions_reference_arch" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;You can find all the related code and resources in &lt;a href="https://github.com/Dentrax/k8s-response-engine-gke-functions"&gt;this repository&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;gcloud 342.0.0&lt;/li&gt;
&lt;li&gt;kubectl 1.20.5&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tutorial"&gt;Tutorial&lt;/h2&gt;
&lt;h3 id="provision-google-kubernetes-engine-gke-cluster"&gt;Provision Google Kubernetes Engine (GKE) Cluster&lt;/h3&gt;
&lt;p&gt;As the blog title said already, we need to create a &lt;a href="https://cloud.google.com/kubernetes-engine"&gt;GKE cluster&lt;/a&gt; with workload identity enabled:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#b8860b"&gt;GOOGLE_PROJECT_ID&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;gcloud config get-value project&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#b8860b"&gt;CLUSTER_NAME&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;falco-falcosidekick-demo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gcloud container clusters create &lt;span style="color:#b8860b"&gt;$CLUSTER_NAME&lt;/span&gt; --workload-pool &lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;GOOGLE_PROJECT_ID&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;.svc.id.goog
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gcloud container clusters get-credentials &lt;span style="color:#b8860b"&gt;$CLUSTER_NAME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="configure-iam-service-accounts"&gt;Configure IAM Service Accounts&lt;/h3&gt;
&lt;p&gt;We need to create a new &lt;a href="https://cloud.google.com/iam/docs/service-accounts"&gt;Service Account&lt;/a&gt; for target &lt;code&gt;$GOOGLE_PROJECT_ID&lt;/code&gt; using IAM Binding &lt;a href="https://cloud.google.com/iam/docs/policies"&gt;policies&lt;/a&gt; to get access our Cloud Function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#b8860b"&gt;SA_ACCOUNT&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;falco-falcosidekick-sa
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gcloud iam service-accounts create &lt;span style="color:#b8860b"&gt;$SA_ACCOUNT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gcloud projects add-iam-policy-binding &lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;GOOGLE_PROJECT_ID&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--member&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;serviceAccount:&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;SA_ACCOUNT&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#b44"&gt;@&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;GOOGLE_PROJECT_ID&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#b44"&gt;.iam.gserviceaccount.com&amp;#34;&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--role&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;roles/cloudfunctions.developer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gcloud projects add-iam-policy-binding &lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;GOOGLE_PROJECT_ID&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--member&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;serviceAccount:&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;SA_ACCOUNT&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#b44"&gt;@&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;GOOGLE_PROJECT_ID&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#b44"&gt;.iam.gserviceaccount.com&amp;#34;&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--role&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;roles/cloudfunctions.invoker&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the beginning, we already enabled &lt;a href="https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity"&gt;WorkloadIdentity&lt;/a&gt; feature for our GKE Cluster by setting &lt;code&gt;--workload-pool&lt;/code&gt; flag. What we need to do here is to add a &lt;code&gt;iam.workloadIdentityUser&lt;/code&gt; role for the given Service Account.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gcloud iam service-accounts add-iam-policy-binding &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --role roles/iam.workloadIdentityUser &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --member &lt;span style="color:#b44"&gt;&amp;#34;serviceAccount:&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;GOOGLE_PROJECT_ID&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#b44"&gt;.svc.id.goog[&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;FALCO_NAMESPACE&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#b44"&gt;/falco-falcosidekick]&amp;#34;&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;SA_ACCOUNT&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;@&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;GOOGLE_PROJECT_ID&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;.iam.gserviceaccount.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We need to &lt;em&gt;annotate&lt;/em&gt; the &lt;code&gt;falco-falcosidekick&lt;/code&gt; resource. So it can grant access for our Cluster. Set up the Falcosidekick SA to impersonate a GCP SA:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl annotate serviceaccount &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --namespace &lt;span style="color:#b8860b"&gt;$FALCO_NAMESPACE&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; falco-falcosidekick &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; iam.gke.io/gcp-service-account&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;SA_ACCOUNT&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;@&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;GOOGLE_PROJECT_ID&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;.iam.gserviceaccount.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="create-necessary-cluster-role"&gt;Create Necessary Cluster Role&lt;/h3&gt;
&lt;p&gt;To limit function role access in the particular cluster, ensure that only SA has limited permissions within a particular namespace by using &lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/rbac/#rolebinding-and-clusterrolebinding"&gt;Role Bindings&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl create serviceaccount pod-destroyer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl create clusterrole pod-destroyer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --verb&lt;span style="color:#666"&gt;=&lt;/span&gt;delete
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --resource&lt;span style="color:#666"&gt;=&lt;/span&gt;pod &lt;span style="color:#080;font-style:italic"&gt;# give only pod resource access for delete op &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl create clusterrolebinding pod-destroyer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --clusterrole pod-destroyer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --serviceaccount default:pod-destroyer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To obtain the Token from secret, we need to get &lt;code&gt;pod-deleter&lt;/code&gt; ServiceAccount resource first:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#b8860b"&gt;POD_DESTROYER_TOKEN&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;kubectl get secrets &lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;kubectl get serviceaccounts pod-deleter -o json &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | jq -r &lt;span style="color:#b44"&gt;&amp;#39;.secrets[0].name&amp;#39;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt; -o json &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | jq -r &lt;span style="color:#b44"&gt;&amp;#39;.data.token&amp;#39;&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | base64 -D&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add the &lt;code&gt;pod-destroyer&lt;/code&gt; user to your &lt;em&gt;KUBECONFIG&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Generate your KUBECONFIG&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl config view --minify --flatten &amp;gt; kubeconfig_pod-destroyer.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Set the token at the end of yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cat &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt; EOF &amp;gt;&amp;gt; kubeconfig_pod-destroyer.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;users:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;- name: user.name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; user:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; token: $POD_DE&lt;/span&gt;STROYER_TOKEN
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can test it with &lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/authorization/#checking-api-access"&gt;auth can-i&lt;/a&gt; to check if roles are set correctly&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl auth can-i list deployments &lt;span style="color:#080;font-style:italic"&gt;# no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl auth can-i delete pod &lt;span style="color:#080;font-style:italic"&gt;# yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl access-matrix &lt;span style="color:#080;font-style:italic"&gt;# github.com/corneliusweig/rakkess&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="create-secret-manager"&gt;Create Secret Manager&lt;/h3&gt;
&lt;p&gt;The main reason Secret Manager get involved our architecture is because we had to find a way out to initialize our &lt;em&gt;kubeclient&lt;/em&gt; in our function by getting &lt;code&gt;pod-destroyer&lt;/code&gt;'s &lt;em&gt;KUBECONFIG&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We need to create a new &lt;em&gt;secrets IAM policy&lt;/em&gt; for the SA member to enable &lt;a href="https://cloud.google.com/secret-manager/docs/managing-secrets"&gt;Managing Secrets&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gcloud secrets add-iam-policy-binding pod-destroyer &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --role roles/secretmanager.secretAccessor &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --member serviceAccount:&lt;span style="color:#b8860b"&gt;$SA_ACCOUNT&lt;/span&gt;@&lt;span style="color:#b8860b"&gt;$GOOLE_PROJECT_ID&lt;/span&gt;.iam.gserviceaccount.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create a new secret, called &lt;code&gt;pod-destroyer&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gcloud secrets create pod-destroyer --replication-policy&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;automatic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Push the our generated &lt;code&gt;kubeconfig_pod-destroyer.yaml&lt;/code&gt; file as a new version:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gcloud secrets versions add pod-destroyer --data-file&lt;span style="color:#666"&gt;=&lt;/span&gt;kubeconfig_pod-destroyer.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally, we are ready to deploy our Cloud Run function!&lt;/p&gt;
&lt;h3 id="deploy-google-cloud-function"&gt;Deploy Google Cloud Function&lt;/h3&gt;
&lt;p&gt;In this demonstration our function will simply &lt;em&gt;delete the pwned Pod&lt;/em&gt;, as we already pointed it out in the architecture diagram.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Go code&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;package&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kill_the_pwned_pod&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;import&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;secretmanager&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;cloud.google.com/go/secretmanager/apiv1&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;context&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;encoding/json&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;secretmanagerpb&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;google.golang.org/genproto/googleapis/cloud/secretmanager/v1&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;io/ioutil&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;metaV1&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;k8s.io/apimachinery/pkg/apis/meta/v1&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;k8s.io/client-go/kubernetes&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;k8s.io/client-go/tools/clientcmd&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;os&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;// Alert falco data structure&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Alert&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Output&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;output&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Priority&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;priority&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Rule&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;rule&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Time&lt;span style="color:#bbb"&gt; &lt;/span&gt;time.Time&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;time&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;OutputFields&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ContainerID&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;container.id&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ContainerImageRepository&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;interface&lt;/span&gt;{}&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;container.image.repository&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ContainerImageTag&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;interface&lt;/span&gt;{}&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;container.image.tag&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;EvtTime&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;int64&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;evt.time&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;FdName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;fd.name&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;K8SNsName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;k8s.ns.name&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;K8SPodName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;k8s.pod.name&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ProcCmdline&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;proc.cmdline&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;output_fields&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;op&lt;span style="color:#bbb"&gt; &lt;/span&gt;Operation&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Operation&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;clientSet&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;*&lt;/span&gt;kubernetes.Clientset&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;// init initializes new Kubernetes ClientSet with given config&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;init&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// The resource name of the KUBECONFIG_SECRET_NAME in the format&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// `projects/*/secrets/*/versions/*`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;resource&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;os.&lt;span style="color:#00a000"&gt;Getenv&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;KUBECONFIG_SECRET_NAME&amp;#34;&lt;/span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f"&gt;len&lt;/span&gt;(resource)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;==&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;0&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f"&gt;panic&lt;/span&gt;(fmt.&lt;span style="color:#00a000"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;$KUBECONFIG_SECRET_NAME env variable did not set&amp;#34;&lt;/span&gt;))&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;secret,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;GetSecret&lt;/span&gt;(resource)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f"&gt;panic&lt;/span&gt;(fmt.&lt;span style="color:#00a000"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;get secret: %q&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err))&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubeCfg,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;clientcmd.&lt;span style="color:#00a000"&gt;NewClientConfigFromBytes&lt;/span&gt;(secret)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f"&gt;panic&lt;/span&gt;(fmt.&lt;span style="color:#00a000"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;new client config: %q&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err))&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;restCfg,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubeCfg.&lt;span style="color:#00a000"&gt;ClientConfig&lt;/span&gt;()&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f"&gt;panic&lt;/span&gt;(fmt.&lt;span style="color:#00a000"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;client config: %q&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err))&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;cs,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubernetes.&lt;span style="color:#00a000"&gt;NewForConfig&lt;/span&gt;(restCfg)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f"&gt;panic&lt;/span&gt;(fmt.&lt;span style="color:#00a000"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;unable to initialize config: %q&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err))&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;op&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;Operation{clientSet:&lt;span style="color:#bbb"&gt; &lt;/span&gt;cs}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;// KillThePwnedPod will executed for each Falco event&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;KillThePwnedPod&lt;/span&gt;(w&lt;span style="color:#bbb"&gt; &lt;/span&gt;http.ResponseWriter,&lt;span style="color:#bbb"&gt; &lt;/span&gt;r&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;*&lt;/span&gt;http.Request)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;body,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ioutil.&lt;span style="color:#00a000"&gt;ReadAll&lt;/span&gt;(r.Body)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;http.&lt;span style="color:#00a000"&gt;Error&lt;/span&gt;(w,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;cannot read body&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;http.StatusBadRequest)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;event&lt;span style="color:#bbb"&gt; &lt;/span&gt;Alert&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;json.&lt;span style="color:#00a000"&gt;Unmarshal&lt;/span&gt;(body,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;&amp;amp;&lt;/span&gt;event)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;http.&lt;span style="color:#00a000"&gt;Error&lt;/span&gt;(w,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;cannot parse body&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;http.StatusBadRequest)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;op.&lt;span style="color:#00a000"&gt;PodDestroy&lt;/span&gt;(event.OutputFields.K8SPodName,&lt;span style="color:#bbb"&gt; &lt;/span&gt;event.OutputFields.K8SNsName)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;http.&lt;span style="color:#00a000"&gt;Error&lt;/span&gt;(w,&lt;span style="color:#bbb"&gt; &lt;/span&gt;fmt.&lt;span style="color:#00a000"&gt;Sprintf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;cannot delete pod: %q&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err),&lt;span style="color:#bbb"&gt; &lt;/span&gt;http.StatusInternalServerError)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;w.&lt;span style="color:#00a000"&gt;WriteHeader&lt;/span&gt;(http.StatusOK)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;// PodDestroy destroys the given pod name in the given namespace&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(d&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;*&lt;/span&gt;Operation)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;PodDestroy&lt;/span&gt;(name,&lt;span style="color:#bbb"&gt; &lt;/span&gt;namespace&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;error&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;d.clientSet.&lt;span style="color:#00a000"&gt;CoreV1&lt;/span&gt;().&lt;span style="color:#00a000"&gt;Pods&lt;/span&gt;(namespace).&lt;span style="color:#00a000"&gt;Delete&lt;/span&gt;(context.&lt;span style="color:#00a000"&gt;TODO&lt;/span&gt;(),&lt;span style="color:#bbb"&gt; &lt;/span&gt;name,&lt;span style="color:#bbb"&gt; &lt;/span&gt;metaV1.DeleteOptions{})&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;fmt.&lt;span style="color:#00a000"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;unable to delete pod %s: %q&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;name,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;// GetSecret returns the secret data.&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;GetSecret&lt;/span&gt;(name&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;([]&lt;span style="color:#0b0;font-weight:bold"&gt;byte&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;error&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ctx&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;context.&lt;span style="color:#00a000"&gt;Background&lt;/span&gt;()&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;client,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;secretmanager.&lt;span style="color:#00a000"&gt;NewClient&lt;/span&gt;(ctx)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;fmt.&lt;span style="color:#00a000"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;failed to create secretmanager client: %v&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;defer&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;client.&lt;span style="color:#00a000"&gt;Close&lt;/span&gt;()&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;result,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;client.&lt;span style="color:#00a000"&gt;AccessSecretVersion&lt;/span&gt;(ctx,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;&amp;amp;&lt;/span&gt;secretmanagerpb.AccessSecretVersionRequest{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Name:&lt;span style="color:#bbb"&gt; &lt;/span&gt;name,&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;})&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;fmt.&lt;span style="color:#00a000"&gt;Errorf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;failed to access secret version: %v&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;result.Payload.Data,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you rather see it in &lt;a href="https://github.com/Dentrax/k8s-response-engine-gke-functions.git"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git clone https://github.com/Dentrax/k8s-response-engine-gke-functions.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#a2f"&gt;cd&lt;/span&gt; kubernetes-response-engine-based-on-gke-and-gcloudfunctions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We need to pass extra &lt;code&gt;--service-account&lt;/code&gt; flag in order to get access to Secret Manager.&lt;/p&gt;
&lt;p&gt;Deploy the function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#b8860b"&gt;FUNCTION_NAME&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;KillThePwnedPod
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gcloud functions deploy &lt;span style="color:#b8860b"&gt;$FUNCTION_NAME&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--runtime go113 --trigger-http &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--service-account &lt;span style="color:#b8860b"&gt;$SA_ACCOUNT&lt;/span&gt;@&lt;span style="color:#b8860b"&gt;$GOOLE_PROJECT_ID&lt;/span&gt;.iam.gserviceaccount.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Allow unauthenticated invocations of new &lt;span style="color:#a2f;font-weight:bold"&gt;function&lt;/span&gt; &lt;span style="color:#666"&gt;[&lt;/span&gt;KillThePwnedPod&lt;span style="color:#666"&gt;]&lt;/span&gt;? &lt;span style="color:#666"&gt;(&lt;/span&gt;y/N&lt;span style="color:#666"&gt;)&lt;/span&gt;? N
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, get the name of the function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#b8860b"&gt;CLOUD_FUNCTION_NAME&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;gcloud functions describe --format&lt;span style="color:#666"&gt;=&lt;/span&gt;json &lt;span style="color:#b8860b"&gt;$FUNCTION_NAME&lt;/span&gt; | jq -r &lt;span style="color:#b44"&gt;&amp;#39;.name&amp;#39;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="install-falco-falcosidekick"&gt;Install Falco + Falcosidekick&lt;/h3&gt;
&lt;p&gt;It is time to install &lt;code&gt;Falco&lt;/code&gt;, &lt;code&gt;Falcosidekick&lt;/code&gt; with &lt;code&gt;Cloud Function&lt;/code&gt; output type enabled:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#a2f"&gt;export&lt;/span&gt; &lt;span style="color:#b8860b"&gt;FALCO_NAMESPACE&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl create namespace &lt;span style="color:#b8860b"&gt;$FALCO_NAMESPACE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ helm upgrade --install falco falcosecurity/falco &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--namespace &lt;span style="color:#b8860b"&gt;$FALCO_NAMESPACE&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set ebpf.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falcosidekick.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falcosidekick.config.gcp.cloudfunctions.name&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;CLOUD_FUNCTION_NAME&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falcosidekick.webui.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="test"&gt;Test&lt;/h3&gt;
&lt;p&gt;Try to run a busybox image and execute a command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl run busybox --image&lt;span style="color:#666"&gt;=&lt;/span&gt;busybox --restart&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;Never&amp;#39;&lt;/span&gt; -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;sleep 600&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Try to exec into:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; -it busybox -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;uptime&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can check the logs of the &lt;code&gt;Falco&lt;/code&gt;, and &lt;code&gt;Falcosidekick&lt;/code&gt; to see what happened:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/docs/images/cloud_function_output.png" alt="cloud_function_output" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;For &lt;code&gt;Falcosidekick&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl logs deployment/falco-falcosidekick --namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/06/14 21:01:24 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : GCPCloudFunctions - Call Cloud Function OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;..
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;We got another way to create a Response Engine with amazing pieces of software from Open Source world. Of course, it's just the beginning, feel free to share your functions and workflows with the community for starting the creation of a true library of remediation methods.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you would like to find out more about Falco:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get started in &lt;a href="http://falco.org/"&gt;Falco.org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out the
&lt;a href="https://github.com/falcosecurity/falco"&gt;Falco project in GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Get involved in the &lt;a href="https://falco.org/community/"&gt;Falco community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Meet the maintainers on the
&lt;a href="https://kubernetes.slack.com/?redir=%2Farchives%2FCMWH3EH32"&gt;Falco Slack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Follow &lt;a href="https://twitter.com/falco_org"&gt;@falco_org on Twitter&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Blog: Kubernetes Response Engine, Part 6: Falcosidekick + Cloud Run</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/</link><pubDate>Fri, 25 Jun 2021 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/</guid><description>
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This blog post is part of a series of articles about how to create a &lt;code&gt;Kubernetes&lt;/code&gt; response engine with &lt;code&gt;Falco&lt;/code&gt;, &lt;code&gt;Falcosidekick&lt;/code&gt; and a &lt;code&gt;FaaS&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;See other posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-1-kubeless/"&gt;Kubernetes Response Engine, Part 1 : Falcosidekick + Kubeless&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-2-openfaas/"&gt;Kubernetes Response Engine, Part 2 : Falcosidekick + OpenFaas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-3-knative/"&gt;Kubernetes Response Engine, Part 3 : Falcosidekick + Knative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-4-tekton/"&gt;Kubernetes Response Engine, Part 4 : Falcosidekick + Tekton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-5-argo/"&gt;Kubernetes Response Engine, Part 5 : Falcosidekick + Argo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-7-cloud-functions/"&gt;Kubernetes Response Engine, Part 7: Falcosidekick + Cloud Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Recently, we added two new output-type support to Falcosidekick, and they are Cloud Functions, and Cloud Run. This blog post will discuss how to set up Kubernetes Response Engine on GKE (Google Kubernetes Engine) by using Cloud Run.&lt;/p&gt;
&lt;p&gt;Let's start by explaining a little bit about Cloud Run. &lt;code&gt;Cloud Run&lt;/code&gt; is a managed compute platform that enables you to run containers that are invocable via requests or events. &lt;code&gt;Cloud Run&lt;/code&gt; is serverless: it abstracts away all infrastructure management, so you can focus on what matters most — building great applications.&lt;/p&gt;
&lt;p&gt;For more information, see &lt;a href="https://cloud.google.com/run/docs"&gt;Cloud Run&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Given below is a reference architecture of what's being explained in this blog.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/docs/images/cloud_run_reference_arch.png" alt="cloud_run_reference_arch" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;This demo might be useful for Google Cloud users who might already be using GKE with &lt;code&gt;Falco&lt;/code&gt; to protect container runtime against malicious behaviors, and wants to take any action for them with &lt;code&gt;Cloud Run&lt;/code&gt;.&lt;/p&gt;
&lt;!-- START doctoc generated TOC please keep comment here to allow auto update --&gt;
&lt;!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --&gt;
&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/#prerequisites"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/#tutorial"&gt;Tutorial&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/#provision-gke-google-kubernetes-engine-cluster"&gt;Provision GKE (Google Kubernetes Engine) Cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/#deploy-cloud-run-function"&gt;Deploy Cloud Run Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/#install-falco--falcosidekick"&gt;Install Falco + Falcosidekick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/#test"&gt;Test&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- END doctoc generated TOC please keep comment here to allow auto update --&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;gcloud 342.0.0&lt;/li&gt;
&lt;li&gt;ko 0.8.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tutorial"&gt;Tutorial&lt;/h2&gt;
&lt;h3 id="provision-gke-google-kubernetes-engine-cluster"&gt;Provision GKE (Google Kubernetes Engine) Cluster&lt;/h3&gt;
&lt;p&gt;First, let us create a GKE cluster.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#b8860b"&gt;GKE_CLUSTER_NAME&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;cloud-run-demo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gcloud container clusters create &lt;span style="color:#b8860b"&gt;$GKE_CLUSTER_NAME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To learn more about the setup GKE Cluster, see &lt;a href="https://cloud.google.com/kubernetes-engine/docs/quickstart#create_cluster"&gt;quickstart guide&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="deploy-cloud-run-function"&gt;Deploy Cloud Run Function&lt;/h3&gt;
&lt;p&gt;Once GKE is set up, we are ready to deploy Cloud Run. But before doing that, let us examine the responsibility of the Cloud Run function. As you can see in the reference architecture, this function will delete the pwned pods. To be able to do that, Cloud Run should be given appropriate permissions.&lt;/p&gt;
&lt;p&gt;There are two approaches to obtain these permissions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The first approach is creating a Kubernetes Service Account, an appropriate Role with granted permissions to delete pod resource, and a RoleBinding to bind Role to Service Account. Then create the kubeconfig file, package it up with the function code while deploying the Cloud Run function, and use this file to create a Kubernetes client.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To learn more about the kubeconfig files, see &lt;a href="https://ahmet.im/blog/mastering-kubeconfig/"&gt;kubeconfig&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The second approach is producing a valid ~/.kube/config with a library called google.golang.org/api/ within the function code. We are doing this because the representation of the valid ~/.kube/config file is &lt;a href="https://pkg.go.dev/k8s.io/client-go@v0.21.1/tools/clientcmd/api#Config"&gt;clientcmd/api/Config&lt;/a&gt; in Go.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We'll go with the second approach in this demo. Thanks to Scott Blum and his detailed &lt;a href="https://bionic.fullstory.com/connect-to-google-kubernetes-with-gcp-credentials-and-pure-golang/"&gt;blog post&lt;/a&gt; on this topic. I highly recommend that you check that out.&lt;/p&gt;
&lt;p&gt;Let's deploy the function. If you want to take a look at the function code, see the &lt;a href="#ZgotmplZ"&gt;repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that we're going to use the ko tool to build and push our container image which is created by Google. ko is a simple and fast container image builder for Go applications.&lt;/p&gt;
&lt;p&gt;To learn more, see the &lt;a href="https://github.com/google/ko"&gt;official repository&lt;/a&gt; of the project.&lt;/p&gt;
&lt;p&gt;We are also going to use Container Registry as an image repository service provided by the Google Cloud to store, manage, and secure your Docker container images. Alternatively, you can also use DockerHub, quay.io, etc.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git clone https://github.com/developer-guy/kubernetes-response-engine-based-on-gke-and-cloud-run.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#a2f"&gt;cd&lt;/span&gt; kubernetes-response-engine-based-on-gke-and-cloud-run
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#b8860b"&gt;GKE_CLUSTER_NAME&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;kubectl config view --minify -o &lt;span style="color:#b8860b"&gt;jsonpath&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;{.clusters[].name}{&amp;#34;\n&amp;#34;}&amp;#39;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#b8860b"&gt;PROJECT_ID&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;gcloud config get-value project&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#b8860b"&gt;FUNCTION_NAME&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;pod-deleter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#a2f"&gt;export&lt;/span&gt; &lt;span style="color:#b8860b"&gt;KO_DOCKER_REPO&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;gcr.io/&lt;span style="color:#b8860b"&gt;$PROJECT_ID&lt;/span&gt; &lt;span style="color:#080;font-style:italic"&gt;# Please, change this variable if you are not using Container Registry.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gcloud config &lt;span style="color:#a2f"&gt;set&lt;/span&gt; run/region us-west1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gcloud config &lt;span style="color:#a2f"&gt;set&lt;/span&gt; run/platform managed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gcloud run deploy &lt;span style="color:#b8860b"&gt;$FUNCTION_NAME&lt;/span&gt; --image&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;ko publish .&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --set-env-vars &lt;span style="color:#b8860b"&gt;GKE_CLUSTER_NAME&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b8860b"&gt;$GKE_CLUSTER_NAME&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --set-env-vars &lt;span style="color:#b8860b"&gt;PROJECT_ID&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b8860b"&gt;$PROJECT_ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Allow unauthenticated invocations to &lt;span style="color:#666"&gt;[&lt;/span&gt;pod-deleter&lt;span style="color:#666"&gt;]&lt;/span&gt; &lt;span style="color:#666"&gt;(&lt;/span&gt;y/N&lt;span style="color:#666"&gt;)&lt;/span&gt;? N
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Deploying container to Cloud Run service &lt;span style="color:#666"&gt;[&lt;/span&gt;pod-deleter&lt;span style="color:#666"&gt;]&lt;/span&gt; in project &lt;span style="color:#666"&gt;[&lt;/span&gt;developerguy-311909&lt;span style="color:#666"&gt;]&lt;/span&gt; region &lt;span style="color:#666"&gt;[&lt;/span&gt;us-west1&lt;span style="color:#666"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;✓ Deploying... Done.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ✓ Creating Revision...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ✓ Routing traffic...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Done.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Service &lt;span style="color:#666"&gt;[&lt;/span&gt;pod-deleter&lt;span style="color:#666"&gt;]&lt;/span&gt; revision &lt;span style="color:#666"&gt;[&lt;/span&gt;pod-deleter-00002-cej&lt;span style="color:#666"&gt;]&lt;/span&gt; has been deployed and is serving &lt;span style="color:#666"&gt;100&lt;/span&gt; percent of traffic.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Service URL: https://pod-deleter-uoz6q2wria-uw.a.run.app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="install-falco-falcosidekick"&gt;Install Falco + Falcosidekick&lt;/h3&gt;
&lt;p&gt;Now, it is time to set up &lt;code&gt;Falco&lt;/code&gt;, &lt;code&gt;Falcosidekick&lt;/code&gt; with the &lt;code&gt;Cloud Run&lt;/code&gt; output type enabled.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl create namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ helm repo add falcosecurity https://falcosecurity.github.io/charts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ helm repo update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ helm install falco falcosecurity/falco --namespace falco &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set ebpf.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falcosidekick.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falcosidekick.webui.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falcosidekick.config.gcp.cloudrun.endpoint&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;gcloud run services list --format json | jq -r &lt;span style="color:#b44"&gt;&amp;#34;.[] | select(.metadata.name==\&amp;#34;&lt;/span&gt;&lt;span style="color:#b8860b"&gt;$FUNCTION_NAME&lt;/span&gt;&lt;span style="color:#b44"&gt;\&amp;#34;) | .status.address.url&amp;#34;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falcosidekick.config.gcp.cloudrun.jwt&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;gcloud auth print-identity-token&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check the logs to see if &lt;code&gt;Cloud Run&lt;/code&gt; output enabled for Falcosidekick.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl logs -f falco-falcosidekick-7cd7bc6859-2nd9t --namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-7cd7bc6859-2nd9t falcosidekick 2021/06/07 16:03:14 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : Enabled Outputs : &lt;span style="color:#666"&gt;[&lt;/span&gt;GCPCloudRun WebUI&lt;span style="color:#666"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-7cd7bc6859-2nd9t falcosidekick 2021/06/07 16:03:14 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : Falco Sidekick is up and listening on :2801
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you see the GCPCloudRun in the list of enabled outputs, you can confirm that everything is working as expected 👍.&lt;/p&gt;
&lt;h3 id="test"&gt;Test&lt;/h3&gt;
&lt;p&gt;Let us start by creating a test pod:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl run alpine --namespace default --image&lt;span style="color:#666"&gt;=&lt;/span&gt;alpine --restart&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;Never&amp;#39;&lt;/span&gt; -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;sleep 600&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pod/alpine created
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods --namespace default
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alpine 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 11s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let's run a &lt;em&gt;shell&lt;/em&gt; command inside and see what happens:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; -i --tty alpine --namespace default -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;uptime&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;19:27:21 up &lt;span style="color:#666"&gt;50&lt;/span&gt; min, load average: 0.11, 0.12, 0.11
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As expected the command returned the output. However, the status of the pod we retrieved is Terminating as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods --namespace default
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alpine 1/1 Terminating &lt;span style="color:#666"&gt;0&lt;/span&gt; 103s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To investigate further, check the logs of the Cloud Run function from the Google Cloud Console:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/docs/images/cloud_run_function_outout.png" alt="cloud_run_function_output" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;Let us check the logs of Falco and Falcosidekick to see what happened.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $ kubectl logs daemonset/falco --namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;..
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;{&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;output&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;19:27:21.002873265: Notice A shell was spawned in a container with an attached terminal (user=root user_loginuid=-1 k8s.ns=default k8s.pod=alpine container=97c9868ea832 shell=sh parent=runc cmdline=sh -c uptime terminal=34816 container_id=97c9868ea832 image=alpine) k8s.ns=default k8s.pod=alpine container=97c9868ea832&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;priority&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;Notice&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;rule&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;Terminal shell in container&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;2021-04-10T19:27:21.002873265Z&amp;#34;&lt;/span&gt;, &lt;span style="color:#b44"&gt;&amp;#34;output_fields&amp;#34;&lt;/span&gt;: &lt;span style="color:#666"&gt;{&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;container.id&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;97c9868ea832&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;container.image.repository&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;alpine&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;evt.time&amp;#34;&lt;/span&gt;:1618082841002873265,&lt;span style="color:#b44"&gt;&amp;#34;k8s.ns.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;k8s.pod.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;alpine&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.cmdline&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;sh -c uptime&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;sh&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.pname&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;runc&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.tty&amp;#34;&lt;/span&gt;:34816,&lt;span style="color:#b44"&gt;&amp;#34;user.loginuid&amp;#34;&lt;/span&gt;:-1,&lt;span style="color:#b44"&gt;&amp;#34;user.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span style="color:#666"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For &lt;code&gt;Falcosidekick&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl logs deployment/falco-falcosidekick --namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/06/07 16:03:15 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : GCPCloudRun - Post OK &lt;span style="color:#666"&gt;(&lt;/span&gt;200&lt;span style="color:#666"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/06/07 16:03:15 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : GCPCloudRun - Function Response : OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;..
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;We got another way to create a Response Engine with amazing pieces of software from the Open Source world. Of course, it's just the beginning, feel free to share your functions and workflows with the community for creating a library of remediation methods.&lt;/p&gt;
&lt;p&gt;If you would like to find out more about Falco:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get started in &lt;a href="http://falco.org/"&gt;Falco.org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out the
&lt;a href="https://github.com/falcosecurity/falco"&gt;Falco project in GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Get involved in the &lt;a href="https://falco.org/community/"&gt;Falco community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Meet the maintainers on the
&lt;a href="https://kubernetes.slack.com/?redir=%2Farchives%2FCMWH3EH32"&gt;Falco Slack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Follow &lt;a href="https://twitter.com/falco_org"&gt;@falco_org on Twitter&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Blog: Kubernetes Response Engine, Part 5: Falcosidekick + Argo</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-5-argo/</link><pubDate>Sun, 23 May 2021 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-5-argo/</guid><description>
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This blog post is part of a series of articles about how to create a &lt;code&gt;Kubernetes&lt;/code&gt; response engine with &lt;code&gt;Falco&lt;/code&gt;, &lt;code&gt;Falcosidekick&lt;/code&gt; and a &lt;code&gt;FaaS&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;See other posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-1-kubeless/"&gt;Kubernetes Response Engine, Part 1 : Falcosidekick + Kubeless&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-2-openfaas/"&gt;Kubernetes Response Engine, Part 2 : Falcosidekick + OpenFaas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-3-knative/"&gt;Kubernetes Response Engine, Part 3 : Falcosidekick + Knative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-4-tekton/"&gt;Kubernetes Response Engine, Part 4 : Falcosidekick + Tekton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/"&gt;Kubernetes Response Engine, Part 6 : Falcosidekick + Cloud Run&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-7-cloud-functions/"&gt;Kubernetes Response Engine, Part 7: Falcosidekick + Cloud Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;The Open Source ecosystem is very vibrant, there are many ways to create a Kubernetes Response Engine based on our dynamic duo, &lt;code&gt;Falco&lt;/code&gt; + &lt;code&gt;Falcosidekick&lt;/code&gt;.
Today, we will use two components of the CNCF project &lt;code&gt;Argo&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://argoproj.github.io/projects/argo-events"&gt;&lt;code&gt;Argo Events&lt;/code&gt;&lt;/a&gt;, will receive events from &lt;code&gt;Falcosidekick&lt;/code&gt; and push into it event bus.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://argoproj.github.io/projects/argo"&gt;&lt;code&gt;Argo Workflow&lt;/code&gt;&lt;/a&gt;, will listen the event bus and then trigger the workflow if certain criteria are encountered.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Like we did for previous examples with &lt;code&gt;Kubeless&lt;/code&gt;, &lt;code&gt;OpenFaas&lt;/code&gt; and &lt;code&gt;Knative&lt;/code&gt;, we'll address the situation where a shell is spawned in a pod and we want to remediate that by deleting it.&lt;/p&gt;
&lt;p&gt;This is how we will set this up:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;┌─────────────┐ ┌─────────┐ ┌────────────────┐
│ │ detect │ │ push │ │
│ pwned pod ├───────────► falco ├──────────► falcosidekick ├────┐
│ │ │ │ │ │ │
└──────▲──────┘ └─────────┘ └────────────────┘ │ notify
│ │
│ │
delete │ ┌──────────────┐ ┌───────────────┐ ┌──────▼──────┐
│ │ │ │ │ │ │
└───┤ deletion pod ◄──────────┤ argo workflow │ │ argo events │
│ │ create │ │ │ │
└──────────────┘ └────────────▲──┘ └─┬───────────┘
│ │
trigger │ │ push
│ │
┌─┴─────────────▼──┐
│ bus │
└──────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;p&gt;We require a &lt;code&gt;kubernetes&lt;/code&gt; cluster running at least &lt;code&gt;1.17&lt;/code&gt; release, &lt;a href="https://helm.sh"&gt;&lt;code&gt;helm&lt;/code&gt;&lt;/a&gt; and &lt;code&gt;kubectl&lt;/code&gt; installed in your locale environment.&lt;/p&gt;
&lt;h2 id="installation-of-argo-events"&gt;Installation of Argo Events&lt;/h2&gt;
&lt;p&gt;We simply follow the &lt;a href="https://argoproj.github.io/argo-events/installation/"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;kubectl create namespace argo-events
kubectl apply -n argo-events -f https://raw.githubusercontent.com/argoproj/argo-events/stable/manifests/install.yaml
kubectl apply -n argo-events -f https://raw.githubusercontent.com/argoproj/argo-events/stable/manifests/install-validating-webhook.yaml
kubectl apply -n argo-events -f https://raw.githubusercontent.com/argoproj/argo-events/stable/examples/eventbus/native.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="installation-of-argo-workflow"&gt;Installation of Argo Workflow&lt;/h2&gt;
&lt;p&gt;Again, the &lt;a href="https://argoproj.github.io/argo-workflows/installation/"&gt;official documentation&lt;/a&gt; will help us.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;kubectl create namespace argo
kubectl apply -n argo -f https://raw.githubusercontent.com/argoproj/argo-workflows/stable/manifests/install.yaml
kubectl patch -n argo cm workflow-controller-configmap -p &amp;#39;{&amp;#34;data&amp;#34;: {&amp;#34;containerRuntimeExecutor&amp;#34;: &amp;#34;pns&amp;#34;}}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;kubectl patch&lt;/code&gt; is there for allowing the workflows to run in &lt;code&gt;minikube&lt;/code&gt;, &lt;code&gt;kind&lt;/code&gt;, etc. See &lt;a href="https://argoproj.github.io/argo-workflows/workflow-executors/"&gt;docs&lt;/a&gt; about Workflow Executors to learn more about.&lt;/p&gt;
&lt;p&gt;After a while, you should have access to &lt;code&gt;Argo Workflow&lt;/code&gt; UI through a dport-forward:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;kubectl port-forward svc/argo-server -n argo 2746:2746 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The link is &lt;a href="https://localhost:2746"&gt;https://localhost:2746&lt;/a&gt; (you can ignore the certificate error, we're in a lab 😉).&lt;/p&gt;
&lt;h2 id="creation-of-the-event-source"&gt;Creation of the Event Source&lt;/h2&gt;
&lt;p&gt;We'll use an &lt;code&gt;Event Source&lt;/code&gt; with &lt;code&gt;Webhook&lt;/code&gt; type. It will receive &lt;code&gt;Falco&lt;/code&gt; events from &lt;code&gt;Falcosidekick&lt;/code&gt; and push them then into the Event Bus.&lt;/p&gt;
&lt;p&gt;This component is pretty easy to understand. &lt;code&gt;Falcosidekick&lt;/code&gt; will have to &lt;strong&gt;POST&lt;/strong&gt; the events to an endpoint &lt;strong&gt;/falco&lt;/strong&gt; of a service opened on port &lt;strong&gt;12000&lt;/strong&gt;. &lt;em&gt;Easy&lt;/em&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-yaml+" data-lang="yaml+"&gt;cat &amp;lt;&amp;lt;EOF | kubectl apply -n argo-events -f -
apiVersion: argoproj.io/v1alpha1
kind: EventSource
metadata:
name: webhook-falco
namespace: argo-events
spec:
service:
ports:
- port: 12000
targetPort: 12000
webhook:
# event-source can run multiple HTTP servers. Simply define a unique port to start a new HTTP server
falco-event:
# port to run HTTP server on
port: &amp;#34;12000&amp;#34;
# endpoint to listen to
endpoint: /falco
# HTTP request method to allow. In this case, only POST requests are accepted
method: POST
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As expected, we now have a new service which will listen events from &lt;code&gt;Falcosidekick&lt;/code&gt; on port &lt;strong&gt;12000&lt;/strong&gt; and endpoint &lt;strong&gt;/falco&lt;/strong&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;kubectl get svc -n argo-events
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
webhook-falco-eventsource-svc ClusterIP 10.43.117.26 &amp;lt;none&amp;gt; 12000/TCP 11m
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="creation-of-the-sensor"&gt;Creation of the Sensor&lt;/h2&gt;
&lt;p&gt;In &lt;code&gt;Argo Events&lt;/code&gt; architecture, &lt;code&gt;Sensors&lt;/code&gt; are responsible for listening to the Event Bus and triggering &lt;em&gt;something&lt;/em&gt; should the criteria we set match.
In our case, our &lt;code&gt;Sensor&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;listen only events for pushed by &lt;strong&gt;webhook-falco&lt;/strong&gt; &lt;code&gt;Event Source&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;consider only events where the &lt;strong&gt;body&lt;/strong&gt; (in JSON) contains the value &lt;strong&gt;Terminal shell in container&lt;/strong&gt; for field with key &lt;strong&gt;rule&lt;/strong&gt;, we want to match for only this &lt;strong&gt;Falco&lt;/strong&gt; rule in one word.&lt;/li&gt;
&lt;li&gt;trigger a &lt;strong&gt;workflow&lt;/strong&gt; based on a template with our event as input&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First, create the &lt;strong&gt;Service Account&lt;/strong&gt; which allows our &lt;code&gt;Sensor&lt;/code&gt; will.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;cat &amp;lt;&amp;lt;EOF | kubectl apply -n argo-events -f -
apiVersion: v1
kind: ServiceAccount
metadata:
namespace: argo-events
name: sensor-terminal-shell-container-sa
---
# Similarly you can use a ClusterRole and ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: sensor-terminal-shell-container-role
namespace: argo-events
rules:
- apiGroups:
- argoproj.io
verbs:
- &amp;#34;*&amp;#34;
resources:
- workflows
- workflowtemplates
- cronworkflows
- clusterworkflowtemplates
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: sensor-terminal-shell-container-role-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: sensor-terminal-shell-container-role
subjects:
- kind: ServiceAccount
name: sensor-terminal-shell-container-sa
namespace: argo-events
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And now we deploy our &lt;code&gt;Sensor&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;cat &amp;lt;&amp;lt;EOF | kubectl apply -n argo-events -f -
apiVersion: argoproj.io/v1alpha1
kind: Sensor
metadata:
name: terminal-shell-container
namespace: argo-events
spec:
template:
serviceAccountName: sensor-terminal-shell-container-sa
dependencies:
- name: falco-event
eventSourceName: webhook-falco
eventName: falco-event
filters:
data:
- path: body.rule
type: string
value:
- &amp;#34;Terminal shell in container&amp;#34;
triggers:
- template:
name: delete-pod-trigger
argoWorkflow:
group: argoproj.io
version: v1alpha1
resource: workflows
operation: submit
parameters:
- src:
dependencyName: falco-event
dest: spec.arguments.parameters.0.value
source:
resource:
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: delete-pod-
namespace: argo
spec:
workflowTemplateRef:
name: delete-pod-template
arguments:
parameters:
- name: falco-event
value: {}
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="creation-of-the-workflow-template"&gt;Creation of the Workflow Template&lt;/h2&gt;
&lt;p&gt;There is one piece missing in our &lt;code&gt;Argo&lt;/code&gt; stack, we mentioned a template above, we logically need to create it too, with the service account it needs.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;cat &amp;lt;&amp;lt;EOF | kubectl apply -n argo -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: delete-pod-sa
namespace: argo
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: delete-pod-sa-cluster-role
rules:
- apiGroups: [&amp;#34;&amp;#34;]
resources: [&amp;#34;pods&amp;#34;]
verbs: [&amp;#34;get&amp;#34;, &amp;#34;list&amp;#34;, &amp;#34;delete&amp;#34;, &amp;#34;patch&amp;#34;, &amp;#34;watch&amp;#34;]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: delete-pod-sa-cluster-role-binding
roleRef:
kind: ClusterRole
name: delete-pod-sa-cluster-role
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: delete-pod-sa
namespace: argo
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;cat &amp;lt;&amp;lt;EOF | kubectl apply -n argo -f -
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
name: delete-pod-template
namespace: argo
spec:
entrypoint: delete-pod
serviceAccountName: delete-pod-sa
arguments:
parameters:
- name: falco-event
value: &amp;#34;{}&amp;#34;
templates:
- name: delete-pod
inputs:
parameters:
- name: falco-event
container:
image: devopps/kubernetes-response-engine-based-on-event-driven-workflow@sha256:22ee203a33fe88f0f99968daebdcea0ca52c8a3d6f7af4c823ed78ac15b7c5db
env:
- name: BODY
value: &amp;#34;{{inputs.parameters.falco-event}}&amp;#34;
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;Argo Workflow&lt;/code&gt; runs all workflow steps inside their own pods, we'll use for this tutorial a &lt;em&gt;Golang&lt;/em&gt; image developped by &lt;a href="https://github.com/developer-guy"&gt;@developer-guy&lt;/a&gt; (who wrote the &lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-2-openfaas/"&gt;Part 2&lt;/a&gt; of this series 😄), the sources are &lt;a href="https://github.com/developer-guy/kubernetes-response-engine-based-on-event-driven-workflow/blob/master/main.go"&gt;there&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At this stage, everything is ready to receive events from &lt;code&gt;Falco&lt;/code&gt; and protect our cluster.
If you go in &lt;code&gt;Argo Workflow&lt;/code&gt; UI you will find the architecture we described at beginning.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/img/argo-workflow-response-engine-event-flow.png" alt="Event Flow for our Response Engine" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h2 id="installation-of-falco-and-falcosidekick"&gt;Installation of Falco and Falcosidekick&lt;/h2&gt;
&lt;p&gt;Last but not least, it's time to install our beloved &lt;code&gt;Falco&lt;/code&gt; and &lt;code&gt;Falcosidekick&lt;/code&gt; and connect them to our shiny new Response Engine.&lt;/p&gt;
&lt;p&gt;As with other posts of this series we'll use &lt;code&gt;Helm&lt;/code&gt; as conveniant installation method.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;kubectl create ns falco
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm install falco falcosecurity/falco \
--namespace falco \
--set falcosidekick.enabled=true \
--set falcosidekick.config.webhook.address=http://webhook-falco-eventsource-svc.argo-events.svc.cluster.local:12000/falco
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Remember the service we &amp;quot;mentioned&amp;quot; earlier? This is it in its FQDN format as an endpoint.&lt;/p&gt;
&lt;h2 id="test-our-response-engine"&gt;Test our Response Engine&lt;/h2&gt;
&lt;p&gt;Let's delete pwned pod !&lt;/p&gt;
&lt;p&gt;We'll simulate a &lt;em&gt;webshell&lt;/em&gt; by executing a shell command into a running pod.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;kubectl run alpine -n default --image=alpine --restart=&amp;#39;Never&amp;#39; -- sh -c &amp;#34;sleep 6000&amp;#34;
kubectl get pods -n default
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;NAME READY STATUS RESTARTS AGE
alpine 1/1 Running 0 8s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Run a &lt;em&gt;shell&lt;/em&gt; command inside.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;kubectl exec -i --tty alpine -n default -- sh -c &amp;#34;uptime&amp;#34;
22:03:23 up 44 min, load average: 0.07, 0.13, 0.19
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you're quick enough, you may see the termination of the pod.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;kubectl get pods -n default
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-shell+" data-lang="shell+"&gt;NAME READY STATUS RESTARTS AGE
alpine 1/1 Terminating 0 8s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And in &lt;code&gt;Argo Workflow&lt;/code&gt; UI.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/img/argo-workflow-response-engine-deletion-1.png" alt="Deletion 1 for our Response Engine" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/img/argo-workflow-response-engine-deletion-2.png" alt="Deletion 2 for our Response Engine" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/img/argo-workflow-response-engine-deletion-3.png" alt="Deletion 3 for our Response Engine" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;👍&lt;/p&gt;
&lt;h2 id="go-a-little-further-with-argo"&gt;Go a little further with Argo&lt;/h2&gt;
&lt;p&gt;We can even go further by deploying all components with &lt;code&gt;Argo CD&lt;/code&gt;, another project from &lt;code&gt;Argo&lt;/code&gt; team.
You can find out all you need in this &lt;a href="https://github.com/Issif/argo-falco"&gt;repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here a quick demo of the results with the exact same workflow we just created in this tutorial.
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/X3GE3rHBFNM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;We got another way to create a Response Engine with amazing pieces of software from Open Source world. Of course, it's just the beginning, feel free to share your functions and workflows with the community for starting the creation of a true library of remediation methods.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If you would like to find out more about Falco:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get started in &lt;a href="http://falco.org/"&gt;Falco.org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out the
&lt;a href="https://github.com/falcosecurity/falco"&gt;Falco project in GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Get involved in the &lt;a href="https://falco.org/community/"&gt;Falco community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Meet the maintainers on the
&lt;a href="https://kubernetes.slack.com/?redir=%2Farchives%2FCMWH3EH32"&gt;Falco Slack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Follow &lt;a href="https://twitter.com/falco_org"&gt;@falco_org on Twitter&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Blog: Kubernetes Response Engine, Part 4: Falcosidekick + Tekton</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-4-tekton/</link><pubDate>Fri, 14 May 2021 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-4-tekton/</guid><description>
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This blog post is part of a series of articles about how to create a &lt;code&gt;Kubernetes&lt;/code&gt; response engine with &lt;code&gt;Falco&lt;/code&gt;, &lt;code&gt;Falcosidekick&lt;/code&gt; and a &lt;code&gt;FaaS&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;See other posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-1-kubeless/"&gt;Kubernetes Response Engine, Part 1 : Falcosidekick + Kubeless&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-2-openfaas/"&gt;Kubernetes Response Engine, Part 2 : Falcosidekick + OpenFaas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-3-knative/"&gt;Kubernetes Response Engine, Part 3 : Falcosidekick + Knative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-5-argo/"&gt;Kubernetes Response Engine, Part 5 : Falcosidekick + Argo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/"&gt;Kubernetes Response Engine, Part 6 : Falcosidekick + Cloud Run&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-7-cloud-functions/"&gt;Kubernetes Response Engine, Part 7: Falcosidekick + Cloud Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="falcosidekick-tekton"&gt;Falcosidekick + Tekton&lt;/h2&gt;
&lt;p&gt;Earler in this series we have seen how to use &lt;a href="https://kubeless.io/"&gt;Kubeless&lt;/a&gt;, &lt;a href="https://www.openfaas.com/"&gt;OpenFaas&lt;/a&gt;
and &lt;a href="https://knative.dev/"&gt;Knative&lt;/a&gt; to trigger a pod after getting input from falcosidekick to delete a compromised pod.&lt;/p&gt;
&lt;p&gt;In this part I will showcase how we can use &lt;a href="https://tekton.dev"&gt;Tekton&lt;/a&gt; and not have to add any extra complexity to your cluster by adding a serverless runtime.&lt;/p&gt;
&lt;p&gt;I won't go through how Tekton works in depth but, you can find a good overview in the &lt;a href="https://tekton.dev/docs/overview/"&gt;official docs&lt;/a&gt;.
But here is the crash course:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tekton is built to be reusable.&lt;/li&gt;
&lt;li&gt;The smallest part of tekton is a &lt;strong&gt;step&lt;/strong&gt;, a step can be something like this:
&lt;ul&gt;
&lt;li&gt;Run unit tests&lt;/li&gt;
&lt;li&gt;Run linting&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In a &lt;strong&gt;task&lt;/strong&gt; you can have multiple steps.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;pipeline&lt;/strong&gt; consist of one or multiple tasks.&lt;/li&gt;
&lt;li&gt;To trigger a pipeline to actually run you need a &lt;strong&gt;pipelinerun&lt;/strong&gt; or a &lt;strong&gt;trigger-template&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tekton also supports eventlisteners that is used to listen for webhooks.
Normally these webhooks listen for incoming changes to a git repo, for example a PR.
But we will use it to listen for Falco events.&lt;/p&gt;
&lt;p&gt;You can find all the yaml and code in my &lt;a href="https://github.com/NissesSenap/falcosidekick-tekton/tree/falco"&gt;repo&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="prerequisites"&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;As always within Kubernetes we need a few tools, I have used the following versions of Helm, Minikube and kubectl in my setup.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Minikube v1.19.0&lt;/li&gt;
&lt;li&gt;Helm v3.4.2&lt;/li&gt;
&lt;li&gt;kubectl v1.20.5&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="provision-local-kubernetes-cluster"&gt;Provision local Kubernetes Cluster&lt;/h3&gt;
&lt;p&gt;I'm sure you can use a &lt;a href="https://github.com/kubernetes-sigs/kind"&gt;kind&lt;/a&gt; cluster as well to follow along,
but falco complained a bit when I tried and I was too lazy to check out what extra flags I need so I went with minikube.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;minikube start --cpus &lt;span style="color:#666"&gt;3&lt;/span&gt; --memory &lt;span style="color:#666"&gt;8192&lt;/span&gt; --vm-driver virtualbox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="install-tekton"&gt;Install Tekton&lt;/h3&gt;
&lt;p&gt;Install Tekton pipelines and triggers.
When doing this in production I recommend the &lt;a href="https://github.com/tektoncd/operator"&gt;Tekton operator&lt;/a&gt; but for now let us use some pure yaml.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply --filename https://storage.googleapis.com/tekton-releases/triggers/latest/release.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Within a few seconds you should be able to see a few pods in the tekton-pipelines namespace.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl get pods -n tekton-pipelines
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tekton-pipelines-controller-6b94f5f96-cmf8m 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 1h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tekton-pipelines-webhook-5bfbbd6475-fmjp4 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 1h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tekton-triggers-controller-7cbd49fbb8-p4lrz 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 1h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tekton-triggers-webhook-748fb7778c-w6zxv 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 1h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you want a deeper understanding how Tekton triggers work check out the &lt;a href="https://github.com/tektoncd/triggers/tree/v0.13.0/docs/getting-started"&gt;getting-started guide&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="install-falco-falcosidekick"&gt;Install Falco + Falcosidekick&lt;/h3&gt;
&lt;p&gt;Create the falco namespace and add the helm repo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl create namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm repo add falcosecurity https://falcosecurity.github.io/charts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm repo update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For simplicity and long term usability let us create a custom values file and start falco.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt;&amp;gt; values.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;falcosidekick:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; config:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; webhook:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; address: http://el-falco-listener.falcoresponse.svc.cluster.local:8080
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; enabled: true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;customRules:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; # Applications which are expected to communicate with the Kubernetes API
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; rules_user_known_k8s_api_callers.yaml: |-
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - macro: user_known_contact_k8s_api_server_activities
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; condition: &amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; (container.image.repository = &amp;#34;gcr.io/tekton-releases/github.com/tektoncd/triggers/cmd/eventlistenersink&amp;#34;) or
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; (container.image.repository = &amp;#34;quay.io/nissessenap/poddeleter&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Install falco&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm upgrade --install falco falcosecurity/falco --namespace falco -f values.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Note the customRules and the webhook address.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We haven't setup this webhook address nor is there currently any reason for us to have customRules for eventlistenersink or poddeleter, but it will come.
Both the Tekton event listener and my poddeleter does a few kubernetes API calls and we don't want falco generate alarms for our own infrastructure.&lt;/p&gt;
&lt;p&gt;You should be able to see falco and falcosidekick pods in the falco namespace:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl get pods --namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-44p4v 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 64m
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-779b87f446-8zf9m 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 2h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-779b87f446-fdk55 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 2h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="protect-me-falco"&gt;Protect me Falco&lt;/h3&gt;
&lt;p&gt;My current setup is rather harsh and will delete any pods that breaks any falco rule.
In the future I plan to make both the go code and the tekton setup better and more flexible, hopefully this is something that we can do in the community.&lt;/p&gt;
&lt;p&gt;During this demo I will use the &lt;a href="https://github.com/falcosecurity/falco/blob/0d7068b048772b1e2d3ca5c86c30b3040eac57df/rules/falco_rules.yaml#L2063"&gt;Terminal Shell in container&lt;/a&gt; since it's very easy to reproduce.&lt;/p&gt;
&lt;p&gt;So how does all this work?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We start a random pod and perform a simple exec.&lt;/li&gt;
&lt;li&gt;Falco will notice that a pod have broken the rule&lt;/li&gt;
&lt;li&gt;Sends an event to Falcosidekick&lt;/li&gt;
&lt;li&gt;Sends a webhook to tekton event-listener&lt;/li&gt;
&lt;li&gt;Tekton triggers a new pipeline&lt;/li&gt;
&lt;li&gt;A task is started with a small go program that deletes the pod&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So let us look at some yaml.&lt;/p&gt;
&lt;h4 id="the-go-code"&gt;The go code&lt;/h4&gt;
&lt;p&gt;I have adapted the code that Batuhan Apaydın wrote in &lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-2-openfaas/"&gt;Falcosidekick + OpenFaas = a Kubernetes Response Engine, Part 2&lt;/a&gt; to listen for json in an environment variable instead of a http request.&lt;/p&gt;
&lt;p&gt;Below you can see the code, in short it does the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check for environment variable BODY.&lt;/li&gt;
&lt;li&gt;Unmarshal the data according to the Alert struct.&lt;/li&gt;
&lt;li&gt;Setups a kubernetes client, by calling setupKubeClient function.&lt;/li&gt;
&lt;li&gt;Calls the deletePod with a kubernetes client, the falcoEvent we gotten and a hash map of critical Namespaces.&lt;/li&gt;
&lt;li&gt;Check in the event that we got from falcosidekick and see if the pod that triggered the event is in our critical namespaces hash map.&lt;/li&gt;
&lt;li&gt;If it is return to the main and shutdown the application.&lt;/li&gt;
&lt;li&gt;Else deletes the pod in the namespace specified in the falcosidekick event.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-main.go" data-lang="main.go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;package&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;main&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;import&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;context&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;encoding/json&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;log&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;os&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;metaV1&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;k8s.io/apimachinery/pkg/apis/meta/v1&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;k8s.io/client-go/kubernetes&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;k8s.io/client-go/rest&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;// Alert falco data structure&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Alert&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Output&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;output&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Priority&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;priority&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Rule&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;rule&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Time&lt;span style="color:#bbb"&gt; &lt;/span&gt;time.Time&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;time&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;OutputFields&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ContainerID&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;container.id&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ContainerImageRepository&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;interface&lt;/span&gt;{}&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;container.image.repository&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ContainerImageTag&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;interface&lt;/span&gt;{}&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;container.image.tag&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;EvtTime&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;int64&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;evt.time&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;FdName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;fd.name&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;K8SNsName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;k8s.ns.name&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;K8SPodName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;k8s.pod.name&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ProcCmdline&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;proc.cmdline&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;output_fields&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;main&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;criticalNamespaces&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;map&lt;/span&gt;[&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;]&lt;span style="color:#0b0;font-weight:bold"&gt;bool&lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;kube-system&amp;#34;&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;true&lt;/span&gt;,&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;kube-public&amp;#34;&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;true&lt;/span&gt;,&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;kube-node-lease&amp;#34;&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;true&lt;/span&gt;,&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;falco&amp;#34;&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;true&lt;/span&gt;,&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;falcoEvent&lt;span style="color:#bbb"&gt; &lt;/span&gt;Alert&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;bodyReq&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;os.&lt;span style="color:#00a000"&gt;Getenv&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;BODY&amp;#34;&lt;/span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;bodyReq&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;==&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Fatalf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;Need to get environment variable BODY&amp;#34;&lt;/span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;bodyReqByte&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;[]&lt;span style="color:#a2f"&gt;byte&lt;/span&gt;(bodyReq)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;json.&lt;span style="color:#00a000"&gt;Unmarshal&lt;/span&gt;(bodyReqByte,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;&amp;amp;&lt;/span&gt;falcoEvent)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Fatalf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;The data doesent match the struct %v&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubeClient,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;setupKubeClient&lt;/span&gt;()&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Fatalf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;Unable to create in-cluster config: %v&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;deletePod&lt;/span&gt;(kubeClient,&lt;span style="color:#bbb"&gt; &lt;/span&gt;falcoEvent,&lt;span style="color:#bbb"&gt; &lt;/span&gt;criticalNamespaces)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Fatalf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;Unable to delete pod due to err %v&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;// setupKubeClient&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;setupKubeClient&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="color:#666"&gt;*&lt;/span&gt;kubernetes.Clientset,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;error&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;config,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;rest.&lt;span style="color:#00a000"&gt;InClusterConfig&lt;/span&gt;()&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// creates the clientset&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubeClient,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubernetes.&lt;span style="color:#00a000"&gt;NewForConfig&lt;/span&gt;(config)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubeClient,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;// deletePod, if not part of the criticalNamespaces the pod will be deleted&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;deletePod&lt;/span&gt;(kubeClient&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;*&lt;/span&gt;kubernetes.Clientset,&lt;span style="color:#bbb"&gt; &lt;/span&gt;falcoEvent&lt;span style="color:#bbb"&gt; &lt;/span&gt;Alert,&lt;span style="color:#bbb"&gt; &lt;/span&gt;criticalNamespaces&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;map&lt;/span&gt;[&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;]&lt;span style="color:#0b0;font-weight:bold"&gt;bool&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;error&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;podName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;falcoEvent.OutputFields.K8SPodName&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;namespace&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;falcoEvent.OutputFields.K8SNsName&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;PodName: %v &amp;amp; Namespace: %v&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;podName,&lt;span style="color:#bbb"&gt; &lt;/span&gt;namespace)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;Rule: %v&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;falcoEvent.Rule)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;criticalNamespaces[namespace]&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;The pod %v won&amp;#39;t be deleted due to it&amp;#39;s part of the critical ns list: %v &amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;podName,&lt;span style="color:#bbb"&gt; &lt;/span&gt;namespace)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;Deleting pod %s from namespace %s&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;podName,&lt;span style="color:#bbb"&gt; &lt;/span&gt;namespace)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubeClient.&lt;span style="color:#00a000"&gt;CoreV1&lt;/span&gt;().&lt;span style="color:#00a000"&gt;Pods&lt;/span&gt;(namespace).&lt;span style="color:#00a000"&gt;Delete&lt;/span&gt;(context.&lt;span style="color:#00a000"&gt;Background&lt;/span&gt;(),&lt;span style="color:#bbb"&gt; &lt;/span&gt;podName,&lt;span style="color:#bbb"&gt; &lt;/span&gt;metaV1.DeleteOptions{})&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you rather see it in &lt;a href="https://raw.githubusercontent.com/NissesSenap/falcosidekick-tekton/falco/main.go"&gt;github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now that you know what I will make run in your cluster let us take a look at the Tekton yaml.&lt;/p&gt;
&lt;h4 id="tekton-pipeline"&gt;Tekton pipeline&lt;/h4&gt;
&lt;p&gt;Create the falcoresponse namespace to do our tests in.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl create ns falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="task"&gt;Task&lt;/h5&gt;
&lt;p&gt;So let us start with the smallest part, the task.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt;EOF | kubectl apply -f -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: tekton.dev/v1beta1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: Task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; params:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - name: falco-event
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; description: The entire msg from falco
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; steps:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - name: pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; image: quay.io/nissessenap/poddeleter@sha256:ae94ec2c9f005573e31e4944d1055a0dd92ee7594e7e7e36a4540a1811977270
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; env:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - name: BODY
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; value: \$(params.falco-event)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;The task needs a input variable falco-event.&lt;/li&gt;
&lt;li&gt;The step called pod-delete uses the poddeleter image.&lt;/li&gt;
&lt;li&gt;Step pod-delete sets the environment BODY from the input parameter called falco-event.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="pipeline"&gt;Pipeline&lt;/h5&gt;
&lt;p&gt;Here you can see the reusability of tekton.
This pipeline can easily add more tasks and other pipelines can use the exact same task as this one.&lt;/p&gt;
&lt;p&gt;Just like the task this pipeline expects a parameter called falco-event which it sends in to the pod-delete task.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt;EOF | kubectl apply -f -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: tekton.dev/v1beta1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: Pipeline
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: pod-delete-pipeline
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; params:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - name: falco-event
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; description: The entire msg from falco
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; tasks:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - name: run-pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; taskRef:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; params:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - name: falco-event
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; value: \$(params.falco-event)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="rbac"&gt;RBAC&lt;/h5&gt;
&lt;p&gt;We will be using two separate serviceAccounts, one for the event-listener and one for the poddeleter it self.&lt;/p&gt;
&lt;p&gt;So let us create these serviceAccounts and give them some access.&lt;/p&gt;
&lt;p&gt;Below you can find the event listener RBAC config.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt;EOF | kubectl apply -f -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: ServiceAccount
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: tekton-triggers-example-sa
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: rbac.authorization.k8s.io/v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: Role
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: tekton-triggers-example-minimal
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;rules:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; # EventListeners need to be able to fetch all namespaced resources
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - apiGroups: [&amp;#34;triggers.tekton.dev&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; resources:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; [&amp;#34;eventlisteners&amp;#34;, &amp;#34;triggerbindings&amp;#34;, &amp;#34;triggertemplates&amp;#34;, &amp;#34;triggers&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; verbs: [&amp;#34;get&amp;#34;, &amp;#34;list&amp;#34;, &amp;#34;watch&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - apiGroups: [&amp;#34;&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; # configmaps is needed for updating logging config
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; resources: [&amp;#34;configmaps&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; verbs: [&amp;#34;get&amp;#34;, &amp;#34;list&amp;#34;, &amp;#34;watch&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; # Permissions to create resources in associated TriggerTemplates
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - apiGroups: [&amp;#34;tekton.dev&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; resources: [&amp;#34;pipelineruns&amp;#34;, &amp;#34;pipelineresources&amp;#34;, &amp;#34;taskruns&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; verbs: [&amp;#34;create&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - apiGroups: [&amp;#34;&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; resources: [&amp;#34;serviceaccounts&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; verbs: [&amp;#34;impersonate&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - apiGroups: [&amp;#34;policy&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; resources: [&amp;#34;podsecuritypolicies&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; resourceNames: [&amp;#34;tekton-triggers&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; verbs: [&amp;#34;use&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: rbac.authorization.k8s.io/v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: RoleBinding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: tekton-triggers-example-binding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;subjects:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - kind: ServiceAccount
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: tekton-triggers-example-sa
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;roleRef:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; apiGroup: rbac.authorization.k8s.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; kind: Role
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: tekton-triggers-example-minimal
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: ClusterRole
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: rbac.authorization.k8s.io/v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: tekton-triggers-example-clusterrole
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;rules:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; # EventListeners need to be able to fetch any clustertriggerbindings
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - apiGroups: [&amp;#34;triggers.tekton.dev&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; resources: [&amp;#34;clustertriggerbindings&amp;#34;, &amp;#34;clusterinterceptors&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; verbs: [&amp;#34;get&amp;#34;, &amp;#34;list&amp;#34;, &amp;#34;watch&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: rbac.authorization.k8s.io/v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: ClusterRoleBinding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: tekton-triggers-example-clusterbinding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;subjects:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - kind: ServiceAccount
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: tekton-triggers-example-sa
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;roleRef:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; apiGroup: rbac.authorization.k8s.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; kind: ClusterRole
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: tekton-triggers-example-clusterrole
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And here is the poddeleter serviceAccount:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt;EOF | kubectl apply -f -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: ServiceAccount
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: ClusterRole
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: rbac.authorization.k8s.io/v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete-cluster-role
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;rules:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - apiGroups: [&amp;#34;&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; resources: [&amp;#34;pods&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; verbs: [&amp;#34;get&amp;#34;, &amp;#34;list&amp;#34;, &amp;#34;delete&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: ClusterRoleBinding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: rbac.authorization.k8s.io/v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete-cluster-role-binding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;roleRef:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; kind: ClusterRole
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete-cluster-role
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; apiGroup: rbac.authorization.k8s.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;subjects:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - kind: ServiceAccount
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="event-listener"&gt;Event listener&lt;/h5&gt;
&lt;p&gt;Finally time to configure the tekton webhook receiver.
Just like rest of Tekton the event listener builds on multiple parts.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt;EOF | kubectl apply -f -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: triggers.tekton.dev/v1alpha1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: EventListener
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-listener
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; serviceAccountName: tekton-triggers-example-sa
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; triggers:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - name: cel-trig
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; bindings:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - ref: falco-pod-delete-binding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; template:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; ref: falco-pod-delete-trigger-template
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It is possible to expose a event listener using a ingress, this is a rather normal use case if you want github to trigger a pipeline for example.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I cannot stress this enough DO &lt;strong&gt;NOT&lt;/strong&gt; MAKE THE EVENT LISTENER PUBLIC TO THE INTERNET.
We haven't added any protection and this task have the power to kill pods in your cluster. Don't give a potential hacker this power!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The event listener is rather complex and can do &lt;a href="https://tekton.dev/docs/triggers/eventlisteners/"&gt;allot&lt;/a&gt;.
For example one way to improve this tekton pipeline could be to check for a specific Priority from Falco.
This could be done with a &lt;a href="https://tekton.dev/docs/triggers/eventlisteners/#cel-interceptors"&gt;cel interceptor&lt;/a&gt;
and filter on body.Priority.&lt;/p&gt;
&lt;p&gt;But for now let us just trigger on everything.&lt;/p&gt;
&lt;p&gt;The triggerBinding let us you define what data should be gathered from the incoming webhook.
In this case I take the entire request body.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt;EOF | kubectl apply -f -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: triggers.tekton.dev/v1alpha1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: TriggerBinding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete-binding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; params:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - name: falco-event
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; value: \$(body)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We use the TriggerTemplate to call on the pipeline that we defined earlier using the parameter that the TriggerBinding gives us.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt;EOF | kubectl apply -f -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: triggers.tekton.dev/v1alpha1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: TriggerTemplate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete-trigger-template
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; annotations:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; triggers.tekton.dev/old-escape-quotes: &amp;#34;true&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; params:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - name: falco-event
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; description: The entire msg from falco
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; resourcetemplates:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - apiVersion: tekton.dev/v1beta1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; kind: PipelineRun
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; generateName: falco-pod-delete-pipeline-run-
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; serviceAccountName: falco-pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; pipelineRef:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: pod-delete-pipeline
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; params:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - name: falco-event
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; value: \$(tt.params.falco-event)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Notice the &lt;a href="https://tekton.dev/docs/triggers/triggertemplates/#escaping-quoted-strings"&gt;annotations&lt;/a&gt;, without it the pipeline will never get triggered.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We define the serviceAccount to use in our pipeline/task, point to the pipeline that we should use.
And what parameter to send down to the pipeline, notice the &lt;strong&gt;tt&lt;/strong&gt; in front of parma. This is special syntax for TriggerBindings.&lt;/p&gt;
&lt;p&gt;The triggerTemplate was the final piece needed and you should see a pod spinning up in the falcoresponse namespace.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl get pods -n falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;el-falco-listener-557786f598-zdmw2 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 2h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="trigger-job"&gt;Trigger job&lt;/h3&gt;
&lt;p&gt;Finally it's time to test our setup.&lt;/p&gt;
&lt;p&gt;I would recommend that you start a second terminal for this part.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Terminal 1&lt;/strong&gt; follow the falco logs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl logs -f &lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;kubectl get pods -l &lt;span style="color:#b8860b"&gt;app&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;falco -o &lt;span style="color:#b8860b"&gt;jsonpath&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;{.items[0].metadata.name}&amp;#34;&lt;/span&gt; -n falco&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt; -n falco
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Terminal 2&lt;/strong&gt; let us trigger the Terminal Shell in container falco rule&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Start a alpine pod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl run alpine --namespace falcoresponse --image&lt;span style="color:#666"&gt;=&lt;/span&gt;alpine --restart&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;Never&amp;#39;&lt;/span&gt; -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;sleep 600&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Trigger the rule breaking behavior&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; -i --tty alpine --namespace falcoresponse -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;uptime&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Watch for pods in falcoresponse namespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl get pods -n falcoresponse -w
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In &lt;strong&gt;Terminal 1&lt;/strong&gt; you should see something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Setting up /usr/src links from host
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Running falco-driver-loader for: falco version=0.28.0, driver version=5c0b863ddade7a45568c0ac97d037422c9efb750
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Running falco-driver-loader with: driver=module, compile=yes, download=yes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Unloading falco module, if present
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Trying to load a system falco module, if present
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Success: falco module found and loaded with modprobe
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sun May 2 18:00:10 2021: Falco version 0.28.0 (driver version 5c0b863ddade7a45568c0ac97d037422c9efb750)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sun May 2 18:00:10 2021: Falco initialized with configuration file /etc/falco/falco.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sun May 2 18:00:10 2021: Loading rules from file /etc/falco/falco_rules.yaml:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sun May 2 18:00:10 2021: Loading rules from file /etc/falco/falco_rules.local.yaml:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sun May 2 18:00:10 2021: Loading rules from file /etc/falco/rules.d/rules_user_known_k8s_api_callers.yaml:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sun May 2 18:00:10 2021: Starting internal webserver, listening on port 8765
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&amp;#34;output&amp;#34;:&amp;#34;20:24:10.361728219: Notice A shell was spawned in a container with an attached terminal (user=root user_loginuid=-1 k8s.ns=falcoresponse k8s.pod=alpine container=6ac7d190134e shell=sh parent=runc cmdline=sh -c uptime terminal=34816 container_id=6ac7d190134e image=alpine) k8s.ns=falcoresponse k8s.pod=alpine container=6ac7d190134e k8s.ns=falcoresponse k8s.pod=alpine container=6ac7d190134e&amp;#34;,&amp;#34;priority&amp;#34;:&amp;#34;Notice&amp;#34;,&amp;#34;rule&amp;#34;:&amp;#34;Terminal shell in container&amp;#34;,&amp;#34;time&amp;#34;:&amp;#34;2021-05-02T20:24:10.361728219Z&amp;#34;, &amp;#34;output_fields&amp;#34;: {&amp;#34;container.id&amp;#34;:&amp;#34;6ac7d190134e&amp;#34;,&amp;#34;container.image.repository&amp;#34;:&amp;#34;alpine&amp;#34;,&amp;#34;evt.time&amp;#34;:1619987050361728219,&amp;#34;k8s.ns.name&amp;#34;:&amp;#34;falcoresponse&amp;#34;,&amp;#34;k8s.pod.name&amp;#34;:&amp;#34;alpine&amp;#34;,&amp;#34;proc.cmdline&amp;#34;:&amp;#34;sh -c uptime&amp;#34;,&amp;#34;proc.name&amp;#34;:&amp;#34;sh&amp;#34;,&amp;#34;proc.pname&amp;#34;:&amp;#34;runc&amp;#34;,&amp;#34;proc.tty&amp;#34;:34816,&amp;#34;user.loginuid&amp;#34;:-1,&amp;#34;user.name&amp;#34;:&amp;#34;root&amp;#34;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In &lt;strong&gt;Terminal 2&lt;/strong&gt; you should see a pod starting and hopefully Complete without any errors and the alpine pod getting killed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alpine 0/1 Terminating &lt;span style="color:#666"&gt;0&lt;/span&gt; 1m7s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;el-falco-listener-557786f598-znzk9 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 10m
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-pod-delete-pipeline-run-w2vf8-run-pod-delete-jlxl7--mk44k 0/1 Completed &lt;span style="color:#666"&gt;0&lt;/span&gt; 59s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Hurray our &amp;quot;hacked&amp;quot; pod have been killed&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you look in the logs of the task&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl logs -f &lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;kubectl get pods -l tekton.dev/task&lt;span style="color:#666"&gt;=&lt;/span&gt;pod-delete -o &lt;span style="color:#b8860b"&gt;jsonpath&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;{.items[0].metadata.name}&amp;#34;&lt;/span&gt; -n falcoresponse&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt; -n falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/05/02 18:11:00 PodName: alpine &amp;amp; Namespace: falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/05/02 18:11:00 Rule: Terminal shell in container
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/05/02 18:11:00 Deleting pod alpine from namespace falcoresponse
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;This was a rather simple example on how we can use the power of tekton together with Falco to protect us from bad actors that is trying to take over pods in our cluster.&lt;/p&gt;
&lt;p&gt;As noted during this post there are a lot of potential improvements before this is production ready:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The criticalNamespaces in our go code is currently hard-coded and needs to be input variable of some kind.&lt;/li&gt;
&lt;li&gt;We need to be able to delete pods depending on priority level, rule or something similar.&lt;/li&gt;
&lt;li&gt;To be able to debug pods we might need to shell in to them, we need a way to ignore pods temporary without the pod getting restarted. Probably a annotation to look for in the pod before deleting it.&lt;/li&gt;
&lt;li&gt;And probably many other needs that you can come up with.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have any ideas/issues come and share them in the falco slack &lt;a href="https://kubernetes.slack.com"&gt;https://kubernetes.slack.com&lt;/a&gt; #falco.&lt;/p&gt;
&lt;h4 id="tekton"&gt;Tekton&lt;/h4&gt;
&lt;p&gt;If you would like to find out more about Tekton:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get started in &lt;a href="https://tekton.dev/"&gt;tekton.dev&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out the &lt;a href="https://github.com/tektoncd"&gt;Tekton Project in GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Meet the maintainers on the &lt;a href="https://tektoncd.slack.com//"&gt;TektonCD Slack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Follow &lt;a href="https://twitter.com/tektoncd"&gt;@tektoncd on Twitter&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="falco"&gt;Falco&lt;/h4&gt;
&lt;p&gt;If you would like to find out more about Falco:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get started in &lt;a href="https://falco.org/"&gt;Falco.org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out the
&lt;a href="https://github.com/falcosecurity/falco"&gt;Falco project in GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Get involved in the &lt;a href="https://falco.org/community/"&gt;Falco community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Meet the maintainers on the
&lt;a href="https://kubernetes.slack.com/?redir=%2Farchives%2FCMWH3EH32"&gt;Falco Slack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Follow &lt;a href="https://twitter.com/falco_org"&gt;@falco_org on Twitter&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Blog: Kubernetes Response Engine, Part 3: Falcosidekick + Knative</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-3-knative/</link><pubDate>Thu, 13 May 2021 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-3-knative/</guid><description>
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This blog post is part of a series of articles about how to create a &lt;code&gt;Kubernetes&lt;/code&gt; response engine with &lt;code&gt;Falco&lt;/code&gt;, &lt;code&gt;Falcosidekick&lt;/code&gt; and a &lt;code&gt;FaaS&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;See other posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-1-kubeless/"&gt;Kubernetes Response Engine, Part 1 : Falcosidekick + Kubeless&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-2-openfaas/"&gt;Kubernetes Response Engine, Part 2 : Falcosidekick + OpenFaas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-4-tekton/"&gt;Kubernetes Response Engine, Part 4 : Falcosidekick + Tekton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-5-argo/"&gt;Kubernetes Response Engine, Part 5 : Falcosidekick + Argo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/"&gt;Kubernetes Response Engine, Part 6 : Falcosidekick + Cloud Run&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-7-cloud-functions/"&gt;Kubernetes Response Engine, Part 7: Falcosidekick + Cloud Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;As the Cloud Native ecosystem grows and the idea that an integrator can browse
the offerings and slap them together like an a la carte menu resonates. We call
this &lt;em&gt;Thinking Cloud Native&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://falco.org/"&gt;Falco&lt;/a&gt; already produced events, but in the form of a webhook
with bespoke payloads, which is fine, unless you would like to integrate into an
ecosystem for event routing. To enable this for Falco we had to think about how
these events are moved from producer to consumer via something else. Enter:
CloudEvents.&lt;/p&gt;
&lt;p&gt;What is CloudEvents? It is a specification for translating an event and the
metadata onto a specific protocol and back. What? It lets you think about the
event in a generic way without it being tied to particular choices the
integration is making today, and with minor effort CloudEvents lets that
integration change the protocol choice without changing the meaning of the
event.&lt;/p&gt;
&lt;p&gt;This lossless property of CloudEvents means the integrator is free to choose
middleware that also speaks CloudEvents and has its own choices of persistence
and protocol, but the consumer of the event need not be aware of these
translations that have happened between the producer and consumer.&lt;/p&gt;
&lt;p&gt;There are several choices that support CloudEvents today: Serverless.com Event
Gateway, Argo, Google Cloud Pub/Sub, Azure Event Grid, and Knative Eventing. A
more full list is at the
&lt;a href="https://github.com/cloudevents/spec/blob/v1.0.1/community/open-source.md"&gt;cloudevents/spec repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For this blog post, we are going to focus in on Falco+Knative and see what we
can do with that a la carte selection.&lt;/p&gt;
&lt;h2 id="falco-knative"&gt;Falco+Knative&lt;/h2&gt;
&lt;p&gt;What is Knative? It is two things: Knative Serving and Knative Eventing. Serving
provides a container based scale to zero, scale real big functionality; as well
as rainbow deploys, auto-TLS, domain mappings, and various knobs to control
concurrency and scale traits. Eventing provides a thin abstraction on top of
traditional message brokers (think Kafka or AMQP) that lets you compose your
application without considering the message persistence choices in the moment
(CloudEvents).&lt;/p&gt;
&lt;p&gt;From Knative Eventing, we will use two components: Broker and Trigger. A Knative
Eventing Broker represents a event delivery and persistence layer, sort of an
eventing mesh. A Knative Eventing Trigger works with the Broker to ask that a
consumer be involved with a CloudEvent that matches some specified attributes.
So the Broker is the stream of events, the Trigger is how you select events out
of the stream and get them delivered.&lt;/p&gt;
&lt;p&gt;With Falco producing CloudEvents, we can point our alerts from Falco at the
Knative Eventing Broker. Then create a Trigger that selects the Falco event we
want to react to. But we also need something to consume the event and react!&lt;/p&gt;
&lt;p&gt;From Knative Serving, we can leverage a Knative Serving Service (KService). A
KService looks like a lot like a Kubernetes deployment, but it is realized on
the cluster as an autoscaling and routable component without the need for
manually creating additional Kubernetes Services. KService can run any container
as long as it is stateless, and the lifecycle is defined only in the context of
an active HTTP request.&lt;/p&gt;
&lt;p&gt;To tie this up in a picture,&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Falco --[via Sidekick]--&amp;gt; Broker --[via Trigger]--&amp;gt; KService
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We are free to make the subscriber of the Trigger be &lt;em&gt;anything&lt;/em&gt; we want it to be
as long as it is routable from the Broker, and it accepts HTTP POSTs. The
request will be a CloudEvent in Binary mode, and Falco makes JSON events, so the
payload will be the standard JSON Falco is known for. In-fact, we can replace
the KService in with a &lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-1-kubeless/"&gt;Kubeless function&lt;/a&gt;
and it will work.&lt;/p&gt;
&lt;h2 id="demo"&gt;Demo&lt;/h2&gt;
&lt;p&gt;To demonstrate this, we have prepared a simple example: We will detect root
shell creations and delete that pod.&lt;/p&gt;
&lt;h3 id="prerequisites"&gt;Prerequisites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://multipass.run/"&gt;multipass&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/tasks/tools/#kubectl"&gt;kubectl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://helm.sh/docs/intro/install/"&gt;Helm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="k3s-cluster"&gt;K3s Cluster&lt;/h3&gt;
&lt;p&gt;For this blog post, we a will show the demo using k3s using multipass. Here is a
cluster creation commands:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;multipass launch --name k3s-leader --cpus &lt;span style="color:#666"&gt;2&lt;/span&gt; --mem 2048M --disk 10G
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;multipass &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; k3s-leader -- /bin/bash -c &lt;span style="color:#b44"&gt;&amp;#34;curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE=644 sh -&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f"&gt;export&lt;/span&gt; &lt;span style="color:#b8860b"&gt;K3S_IP_SERVER&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;https://&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;multipass info k3s-leader | grep &lt;span style="color:#b44"&gt;&amp;#34;IPv4&amp;#34;&lt;/span&gt; | awk -F&lt;span style="color:#b44"&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span style="color:#b44"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#b44"&gt;:6443&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;multipass &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; k3s-leader -- /bin/bash -c &lt;span style="color:#b44"&gt;&amp;#34;cat /etc/rancher/k3s/k3s.yaml&amp;#34;&lt;/span&gt; | sed &lt;span style="color:#b44"&gt;&amp;#34;s%https://127.0.0.1:6443%&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;K3S_IP_SERVER&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#b44"&gt;%g&amp;#34;&lt;/span&gt; | sed &lt;span style="color:#b44"&gt;&amp;#34;s/default/k3s/g&amp;#34;&lt;/span&gt; &amp;gt; ./k3s.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f"&gt;export&lt;/span&gt; &lt;span style="color:#b8860b"&gt;KUBECONFIG&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;./k3s.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should get this final output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;(&lt;/span&gt;╯°□°&lt;span style="color:#666"&gt;)&lt;/span&gt;╯︵ multipass launch --name k3s-leader --cpus &lt;span style="color:#666"&gt;2&lt;/span&gt; --mem 2048M --disk 10G
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Launched: k3s-leader
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;(&lt;/span&gt;╯°□°&lt;span style="color:#666"&gt;)&lt;/span&gt;╯︵ multipass &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; k3s-leader -- /bin/bash -c &lt;span style="color:#b44"&gt;&amp;#34;curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE=644 sh -&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; Finding release &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt; channel stable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; Using v1.20.6+k3s1 as release
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; Downloading &lt;span style="color:#a2f"&gt;hash&lt;/span&gt; https://github.com/k3s-io/k3s/releases/download/v1.20.6+k3s1/sha256sum-amd64.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.20.6+k3s1/k3s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; Verifying binary download
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; Installing k3s to /usr/local/bin/k3s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; Creating /usr/local/bin/kubectl symlink to k3s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; Creating /usr/local/bin/crictl symlink to k3s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; Creating /usr/local/bin/ctr symlink to k3s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; Creating killall script /usr/local/bin/k3s-killall.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; Creating uninstall script /usr/local/bin/k3s-uninstall.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; env: Creating environment file /etc/systemd/system/k3s.service.env
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; systemd: Creating service file /etc/systemd/system/k3s.service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; systemd: Enabling k3s unit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; systemd: Starting k3s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we have a bare bones k3s cluster!&lt;/p&gt;
&lt;h3 id="install-knative"&gt;Install Knative&lt;/h3&gt;
&lt;p&gt;To install the rest of Knative into k3s:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Installs Knative Serving&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply -f https://github.com/knative/serving/releases/download/v0.22.0/serving-crds.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl &lt;span style="color:#a2f"&gt;wait&lt;/span&gt; --for&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b8860b"&gt;condition&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;Established --all crd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply -f https://github.com/knative/serving/releases/download/v0.22.0/serving-core.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply -f https://github.com/knative/net-kourier/releases/download/v0.22.0/kourier.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl patch configmap/config-network &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --namespace knative-serving &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --type merge &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --patch &lt;span style="color:#b44"&gt;&amp;#39;{&amp;#34;data&amp;#34;:{&amp;#34;ingress.class&amp;#34;:&amp;#34;kourier.ingress.networking.knative.dev&amp;#34;}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Installs Knative Eventing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply -f https://github.com/knative/eventing/releases/download/v0.22.0/eventing-crds.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl &lt;span style="color:#a2f"&gt;wait&lt;/span&gt; --for&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b8860b"&gt;condition&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;Established --all crd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply -f https://github.com/knative/eventing/releases/download/v0.22.0/eventing-core.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply -f https://github.com/knative/eventing/releases/download/v0.22.0/in-memory-channel.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply -f https://github.com/knative/eventing/releases/download/v0.22.0/mt-channel-broker.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Creates a default Broker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl create -f - &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: eventing.knative.dev/v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: Broker
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: default
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: default
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;See also
&lt;a href="https://knative.dev/docs/install/any-kubernetes-cluster/"&gt;knative.dev install instructions&lt;/a&gt;
for installing these into your own cluster.&lt;/p&gt;
&lt;h3 id="falco-falcosidekick-sidekick-ui"&gt;Falco/Falcosidekick/sidekick UI&lt;/h3&gt;
&lt;p&gt;We'll use helm to install &lt;code&gt;Falco&lt;/code&gt; ,&lt;code&gt;Falcosidekick&lt;/code&gt; and &lt;code&gt;Falcosidekick UI&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;First, add the falcosecurity &lt;code&gt;helm&lt;/code&gt; repo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm repo add falcosecurity https://falcosecurity.github.io/charts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In a real project, you should get the whole chart with
&lt;code&gt;helm pull falcosecurity/falco --untar&lt;/code&gt; and then configure the &lt;code&gt;values.yaml&lt;/code&gt;.
For this tutorial, will try to keep thing as easy as possible and set configs
directly by &lt;code&gt;helm install&lt;/code&gt; command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm install falco falcosecurity/falco &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --create-namespace --namespace falco &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --set falcosidekick.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; --set falcosidekick.webui.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --set falcosidekick.config.cloudevents.address&lt;span style="color:#666"&gt;=&lt;/span&gt;http://broker-ingress.knative-eventing.svc.cluster.local/default/default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should get this output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME: falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LAST DEPLOYED: Thu Jan &lt;span style="color:#666"&gt;14&lt;/span&gt; 23:43:46 &lt;span style="color:#666"&gt;2021&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAMESPACE: falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;STATUS: deployed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;REVISION: &lt;span style="color:#666"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TEST SUITE: None
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NOTES:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Falco agents are spinning up on each node in your cluster. After a few
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;seconds, they are going to start monitoring your containers looking &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;security issues.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;No further action should be required.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And you can see your new &lt;code&gt;Falco&lt;/code&gt;,&lt;code&gt;Falco Sidekick&lt;/code&gt;,&lt;code&gt;Falco Sidekick UI&lt;/code&gt; pods:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl get pods -n falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-jh75c 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 1d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-554b8859d5-v9xkg 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 1d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-554b8859d5-x2zkk 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 1d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-ui-5d747688f9-g96x5 1/1 Running &lt;span style="color:#666"&gt;11&lt;/span&gt; 1d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The arguments
&lt;code&gt;--set falcosidekick.enabled=true --set falcosidekick.webui.enabled=true&lt;/code&gt;
enables Falcosidekick and the UI as the below shows:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/img/falcosidekick-ui-colors.png" alt="falcosidekick ui" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;You can now test it with a typical port-forwarding:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl port-forward svc/falco-falcosidekick-ui -n falco 2802:2802
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="drop-demo"&gt;Drop demo&lt;/h3&gt;
&lt;p&gt;Install the demo with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply -f https://github.com/n3wscott/falco-drop/releases/download/v0.1.0/release.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will install a
&lt;a href="https://knative.dev/docs/serving/#serving-resources"&gt;Knative Service&lt;/a&gt; that will
consume the Falco events sent by falcosidekick (to the broker), some
&lt;a href="https://github.com/n3wscott/falco-drop/blob/v0.1.0/config/rbac.yaml"&gt;RBAC&lt;/a&gt; to
enable that service to delete pods, and a Knative Trigger to register this
consumer for events from the
&lt;a href="https://knative.dev/docs/eventing/broker/"&gt;Knative Eventing Broker&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id="consumer-kservice"&gt;Consumer KService&lt;/h4&gt;
&lt;p&gt;The simplified go code in use is like the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;main&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;...&lt;/span&gt;setup&lt;span style="color:#bbb"&gt; &lt;/span&gt;context&lt;span style="color:#666"&gt;...&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kc&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubeclient.&lt;span style="color:#00a000"&gt;Get&lt;/span&gt;(ctx)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// Make a CloudEvents Client.&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;c,&lt;span style="color:#bbb"&gt; &lt;/span&gt;_&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;cloudevents.&lt;span style="color:#00a000"&gt;NewDefaultClient&lt;/span&gt;(p)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// StartReceiver is blocking, it will deliver events to the inline function.&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;c.&lt;span style="color:#00a000"&gt;StartReceiver&lt;/span&gt;(ctx,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;(event&lt;span style="color:#bbb"&gt; &lt;/span&gt;cloudevents.Event)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// Filter based on source and type.&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;event.&lt;span style="color:#00a000"&gt;Source&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;==&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;falco.org&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;event.&lt;span style="color:#00a000"&gt;Type&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;==&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;falco.rule.output.v1&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// Extract the Falco event Payload&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;payload&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;&amp;amp;&lt;/span&gt;FalcoPayload{}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;event.&lt;span style="color:#00a000"&gt;DataAs&lt;/span&gt;(payload);&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// Only react to &amp;#34;Terminal shell in container&amp;#34; triggered rules.&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;payload.Rule&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;==&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;Terminal shell in container&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kc.&lt;span style="color:#00a000"&gt;CoreV1&lt;/span&gt;().&lt;span style="color:#00a000"&gt;Pods&lt;/span&gt;(payload.Fields.Namespace).&lt;span style="color:#00a000"&gt;Delete&lt;/span&gt;(ctx,&lt;span style="color:#bbb"&gt; &lt;/span&gt;payload.Fields.Pod,&lt;span style="color:#bbb"&gt; &lt;/span&gt;metav1.DeleteOptions{});&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Println&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;failed to delete pod from event:&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;[%s] deleted %s from %s because %s\n&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;payload.Rule,&lt;span style="color:#bbb"&gt; &lt;/span&gt;payload.Fields.Pod,&lt;span style="color:#bbb"&gt; &lt;/span&gt;payload.Fields.Namespace,&lt;span style="color:#bbb"&gt; &lt;/span&gt;payload.Output)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;})&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The full implementation can be found in the
&lt;a href="https://github.com/n3wscott/falco-drop/blob/main/cmd/drop/main.go"&gt;falco-drop&lt;/a&gt;
repo.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pro-tip: if you are developing in Go for Kubernetes, take a look at
&lt;a href="https://github.com/google/ko"&gt;ko&lt;/a&gt;. &lt;code&gt;ko&lt;/code&gt; enables containerizing go
applications without needing a Dockerfile.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Even though the Trigger only delivers events that match the Trigger filter, it
is a good idea to validate the event that the function is receiving, which is
why we are validating again in the above code (trust, but verify).&lt;/p&gt;
&lt;h4 id="eventing-triggers"&gt;Eventing Triggers&lt;/h4&gt;
&lt;p&gt;The Trigger configures the Broker for a subscriber to be invoked when the Broker
ingresses an event that matches the &lt;code&gt;spec.filter&lt;/code&gt; settings.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;apiVersion&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;eventing.knative.dev/v1&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;kind&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;Trigger&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;metadata&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;drop&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;namespace&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;default&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;spec&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;broker&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;default&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;filter&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;attributes&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;source&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;falco.org&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;type&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;falco.rule.output.v1&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;subscriber&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;ref&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;apiVersion&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;serving.knative.dev/v1&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;kind&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;Service&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;drop&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Note: the &lt;code&gt;kind: Service, name: drop&lt;/code&gt; resource is the Knative Service we
created above.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here we are requesting that the broker only deliver events that have the
attributes (CloudEvent attributes) of &lt;code&gt;source=falco.org&lt;/code&gt; and
&lt;code&gt;type=falco.rule.output.v1&lt;/code&gt;. These events are delivered to our subscriber
KService.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/img/knative-drop-graph.png" alt="Eventing Topology" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;Want to learn how that &lt;code&gt;spec.subscriber.ref&lt;/code&gt; works?! It is
&lt;a href="https://en.wikipedia.org/wiki/Duck_typing"&gt;duck typing&lt;/a&gt;
&lt;a href="https://docs.google.com/document/d/1Bud636dMcAQjXe6xfOMBzT0YYqOj1rx3EELxrq2YQv8/edit#heading=h.7o4a6nr4d1sv"&gt;and&lt;/a&gt;
&lt;a href="https://docs.google.com/document/d/e/2PACX-1vQeYowntWI4U8yN19Esf0mK8HiY0Cf1XhbbfzLpnLzGcWqhWHwpqNFH7FqDQGTIAHqz4iFP7dPIBKvG/pub"&gt;you&lt;/a&gt;
&lt;a href="https://github.com/knative/pkg/tree/master/apis/duck#duck-types"&gt;can&lt;/a&gt;
&lt;a href="https://www.youtube.com/watch?v=Mb8c5SP-Sw0"&gt;learn&lt;/a&gt;
&lt;a href="https://www.youtube.com/watch?v=kldVg63Utuw"&gt;more&lt;/a&gt;, but tl;dr: it is basically
doing this (except fancy),&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get ksvc drop -o jsonpath=&amp;#39;{.status.address.url}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="test"&gt;Test&lt;/h3&gt;
&lt;p&gt;First we will create a pod that we can execute code on later:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl run alpine --namespace default --image&lt;span style="color:#666"&gt;=&lt;/span&gt;alpine --restart&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;Never&amp;#39;&lt;/span&gt; -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;sleep 600&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see two pods runing, &lt;code&gt;drop-00001-*&lt;/code&gt; and a &lt;code&gt;alpine&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;(&lt;/span&gt;╯°□°&lt;span style="color:#666"&gt;)&lt;/span&gt;╯︵ kubectl get pods
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drop-00001-deployment-6b4c5d8bb-m8q4z 2/2 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 4m9s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alpine 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 39s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, we will execute a command in that &lt;code&gt;alpine&lt;/code&gt; pod:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; -i --tty alpine --namespace default -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;uptime&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;alpine&lt;/code&gt; pod will be terminated by the drop function once the events are
processed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;(&lt;/span&gt;╯°□°&lt;span style="color:#666"&gt;)&lt;/span&gt;╯︵ kubectl &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; -i --tty alpine --namespace default -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;uptime&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pod/alpine created
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;(&lt;/span&gt;╯°□°&lt;span style="color:#666"&gt;)&lt;/span&gt;╯︵ kubectl &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; -i --tty alpine --namespace default -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;uptime&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 19:29:29 up &lt;span style="color:#666"&gt;17&lt;/span&gt; min, load average: 0.90, 0.85, 0.59
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;(&lt;/span&gt;╯°□°&lt;span style="color:#666"&gt;)&lt;/span&gt;╯︵ kubectl get pods
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drop-00001-deployment-6b4c5d8bb-m8q4z 2/2 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 10m
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alpine 1/1 Terminating &lt;span style="color:#666"&gt;0&lt;/span&gt; 5s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or simply start a hanging shell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl run alpine-alpine --namespace default --image&lt;span style="color:#666"&gt;=&lt;/span&gt;alpine --restart&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;Never&amp;#39;&lt;/span&gt; -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;sleep 600&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; -i --tty alpine-hang --namespace default -- sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And the shell will be closed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;(&lt;/span&gt;╯°□°&lt;span style="color:#666"&gt;)&lt;/span&gt;╯︵ kubectl &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; -i --tty alpine-hang --namespace default -- sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/ &lt;span style="color:#080;font-style:italic"&gt;# command terminated with exit code 137&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The event that the drop function is reacting to is a CloudEvent that looks
something like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Context Attributes,
specversion: 1.0
type: falco.rule.output.v1
source: falco.org
id: f7628198-3822-4c98-ac3f-71770e272a16
time: 2021-01-11T23:46:19.82302759Z
datacontenttype: application/json
Extensions,
foo: bar
priority: Notice
rule: Terminal shell in container
Data,
{
&amp;#34;output&amp;#34;: &amp;#34;23:46:19.823027590: Notice A shell was spawned in a container with an attached terminal (user=root user_loginuid=-1 k8s.ns=default k8s.pod=alpine container=f29b261f8831 shell=bash parent=runc cmdline=bash -il terminal=34816 container_id=f29b261f8831 image=mysql) k8s.ns=default k8s.pod=mysql-db-7d59548d75-wh44s container=f29b261f8831&amp;#34;,
&amp;#34;priority&amp;#34;: &amp;#34;Notice&amp;#34;,
&amp;#34;rule&amp;#34;: &amp;#34;Terminal shell in container&amp;#34;,
&amp;#34;time&amp;#34;: &amp;#34;2021-01-11T23:46:19.82302759Z&amp;#34;,
&amp;#34;output_fields&amp;#34;: {
&amp;#34;container.id&amp;#34;: &amp;#34;f29b261f8831&amp;#34;,
&amp;#34;container.image.repository&amp;#34;: &amp;#34;mysql&amp;#34;,
&amp;#34;evt.time&amp;#34;: 1610408779823027700,
&amp;#34;k8s.ns.name&amp;#34;: &amp;#34;default&amp;#34;,
&amp;#34;k8s.pod.name&amp;#34;: &amp;#34;alpine&amp;#34;,
&amp;#34;proc.cmdline&amp;#34;: &amp;#34;bash -il&amp;#34;,
&amp;#34;proc.name&amp;#34;: &amp;#34;bash&amp;#34;,
&amp;#34;proc.pname&amp;#34;: &amp;#34;runc&amp;#34;,
&amp;#34;proc.tty&amp;#34;: 34816,
&amp;#34;user.loginuid&amp;#34;: -1,
&amp;#34;user.name&amp;#34;: &amp;#34;root&amp;#34;
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The KService consumes this event and simply deletes the pod. You can also see
this activity in the &lt;a href="http://localhost:2802/ui/#/"&gt;falcosidekick UI&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Thinking Cloud Native is a mindset of picking the right tool for the job and
assembling these tools into something greater than their parts. Falco is a great
tool for detection and alerts, it gets really interesting once we can react to
those events in ways we never imagined, because integrators are creative and
innovative.&lt;/p&gt;
&lt;p&gt;What will you build?&lt;/p&gt;
&lt;h3 id="knative"&gt;Knative&lt;/h3&gt;
&lt;p&gt;If you would like to find out more about Knative:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get started in &lt;a href="http://knative.dev/"&gt;knative.dev&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out the &lt;a href="https://github.com/knative"&gt;Knative Project in GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Meet the maintainers on the &lt;a href="https://slack.knative.dev/"&gt;Knative Slack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Follow &lt;a href="https://twitter.com/KnativeProject"&gt;@KnativeProject on Twitter&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="falco"&gt;Falco&lt;/h3&gt;
&lt;p&gt;If you would like to find out more about Falco:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get started in &lt;a href="http://falco.org/"&gt;Falco.org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out the
&lt;a href="https://github.com/falcosecurity/falco"&gt;Falco project in GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Get involved in the &lt;a href="https://falco.org/community/"&gt;Falco community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Meet the maintainers on the
&lt;a href="https://kubernetes.slack.com/?redir=%2Farchives%2FCMWH3EH32"&gt;Falco Slack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Follow &lt;a href="https://twitter.com/falco_org"&gt;@falco_org on Twitter&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Blog: Kubernetes Response Engine, Part 2: Falcosidekick + OpenFaas</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-2-openfaas/</link><pubDate>Sun, 11 Apr 2021 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-2-openfaas/</guid><description>
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This blog post is part of a series of articles about how to create a &lt;code&gt;Kubernetes&lt;/code&gt; response engine with &lt;code&gt;Falco&lt;/code&gt;, &lt;code&gt;Falcosidekick&lt;/code&gt; and a &lt;code&gt;FaaS&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;See other posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-1-kubeless/"&gt;Kubernetes Response Engine, Part 1 : Falcosidekick + Kubeless&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-3-knative/"&gt;Kubernetes Response Engine, Part 3 : Falcosidekick + Knative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-4-tekton/"&gt;Kubernetes Response Engine, Part 4 : Falcosidekick + Tekton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-5-argo/"&gt;Kubernetes Response Engine, Part 5 : Falcosidekick + Argo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/"&gt;Kubernetes Response Engine, Part 6 : Falcosidekick + Cloud Run&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-7-cloud-functions/"&gt;Kubernetes Response Engine, Part 7: Falcosidekick + Cloud Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;We recently talked about a concept called &lt;em&gt;&amp;quot;Kubernetes Response Engine&amp;quot;&lt;/em&gt;, and we achieved this by using &lt;code&gt;Falco&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Falcosidekick&lt;/code&gt; + &lt;code&gt;Kubeless&lt;/code&gt;. But as you might guess, &lt;code&gt;Falcosidekick&lt;/code&gt; project is evolving day after day, which means
new outputs are added. With the release &lt;a href="https://github.com/falcosecurity/falcosidekick/releases/tag/2.22.0"&gt;&lt;code&gt;2.22.0&lt;/code&gt;&lt;/a&gt;,
we are proud to support &lt;a href="https://www.openfaas.com"&gt;&lt;code&gt;OpenFaaS&lt;/code&gt;&lt;/a&gt; as a new output for &lt;em&gt;Falcosidekick&lt;/em&gt;. This allows us to
achieve the same concept, &lt;em&gt;&amp;quot;Kubernetes Response Engine&amp;quot;&lt;/em&gt;, but this time by using &lt;em&gt;&amp;quot;OpenFaaS&amp;quot;&lt;/em&gt; instead of &lt;em&gt;&amp;quot;Kubeless&amp;quot;&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this blog post, we will explain the basic concepts for integrating your own Response Engine into K8S with the
stack &lt;code&gt;Falco&lt;/code&gt; + &lt;code&gt;Falcosidekick&lt;/code&gt; + &lt;code&gt;OpenFaaS&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;We need tools with the following minimum versions to achieve this demo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Minikube v1.19.0&lt;/li&gt;
&lt;li&gt;Helm v3.5.3&lt;/li&gt;
&lt;li&gt;kubectl v1.21.0&lt;/li&gt;
&lt;li&gt;arkade v0.7.13&lt;/li&gt;
&lt;li&gt;faas-cli v0.13.9&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="provision-local-kubernetes-cluster"&gt;Provision local Kubernetes Cluster&lt;/h3&gt;
&lt;p&gt;There are various ways to provision a local Kubernetes cluster such as, KinD, k3s, k0s, Minikube etc. We are going to
use Minikube in this walkthrough.&lt;/p&gt;
&lt;p&gt;Let's get provisioned a local Kubernetes cluster:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ minikube start --cpus &lt;span style="color:#666"&gt;3&lt;/span&gt; --memory &lt;span style="color:#666"&gt;8192&lt;/span&gt; --vm-driver virtualbox
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;😄 minikube v1.19.0 on Darwin 10.15.7
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;✨ Using the virtualbox driver based on user configuration
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;👍 Starting control plane node minikube in cluster minikube
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;🔥 Creating virtualbox VM &lt;span style="color:#666"&gt;(&lt;/span&gt;&lt;span style="color:#b8860b"&gt;CPUs&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;3, &lt;span style="color:#b8860b"&gt;Memory&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;8192MB, &lt;span style="color:#b8860b"&gt;Disk&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;20000MB&lt;span style="color:#666"&gt;)&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;🐳 Preparing Kubernetes v1.20.2 on Docker 20.10.4 ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▪ Generating certificates and keys ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▪ Booting up control plane ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▪ Configuring RBAC rules ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;🔎 Verifying Kubernetes components...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;🌟 Enabled addons: storage-provisioner, default-storageclass
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;🏄 Done! kubectl is now configured to use &lt;span style="color:#b44"&gt;&amp;#34;minikube&amp;#34;&lt;/span&gt; cluster and &lt;span style="color:#b44"&gt;&amp;#34;default&amp;#34;&lt;/span&gt; namespace by default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="install-openfaas"&gt;Install OpenFaaS&lt;/h2&gt;
&lt;p&gt;OpenFaaS can be deployed into a variety of container orchestrators like Kubernetes, OpenShift, Docker Swarm or into a
single host with faasd.&lt;/p&gt;
&lt;p&gt;Follow the official documentation
for &lt;a href="https://docs.openfaas.com/deployment/kubernetes/"&gt;deploying OpenFaaS to Kubernetes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The fastest option is the tool called &lt;a href="https://github.com/alexellis/arkade"&gt;arkade&lt;/a&gt; to deploy OpenFaaS:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ arkade install openfaas
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Using Kubeconfig: /Users/batuhan.apaydin/.kube/config
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Client: x86_64, Darwin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/04/10 21:39:29 User dir established as: /Users/batuhan.apaydin/.arkade/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;&amp;#34;openfaas&amp;#34;&lt;/span&gt; already exists with the same configuration, skipping
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hang tight &lt;span style="color:#a2f;font-weight:bold"&gt;while&lt;/span&gt; we grab the latest from your chart repositories...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...Successfully got an update from the &lt;span style="color:#b44"&gt;&amp;#34;falcosecurity&amp;#34;&lt;/span&gt; chart repository
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...Successfully got an update from the &lt;span style="color:#b44"&gt;&amp;#34;openfaas&amp;#34;&lt;/span&gt; chart repository
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Update Complete. ⎈Happy Helming!⎈
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;VALUES values.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Command: /Users/batuhan.apaydin/.arkade/bin/helm &lt;span style="color:#666"&gt;[&lt;/span&gt;upgrade --install openfaas openfaas/openfaas --namespace openfaas --values /var/folders/pf/6h9t0mnd4d342ncgpjq_3zl80000gp/T/charts/openfaas/values.yaml --set queueWorker.replicas&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#666"&gt;1&lt;/span&gt; --set queueWorker.maxInflight&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#666"&gt;1&lt;/span&gt; --set &lt;span style="color:#b8860b"&gt;clusterRole&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;false&lt;/span&gt; --set operator.create&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;false&lt;/span&gt; --set faasnetes.imagePullPolicy&lt;span style="color:#666"&gt;=&lt;/span&gt;Always --set basicAuthPlugin.replicas&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#666"&gt;1&lt;/span&gt; --set gateway.replicas&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#666"&gt;1&lt;/span&gt; --set gateway.directFunctions&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;false&lt;/span&gt; --set &lt;span style="color:#b8860b"&gt;openfaasImagePullPolicy&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;IfNotPresent --set ingressOperator.create&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;false&lt;/span&gt; --set &lt;span style="color:#b8860b"&gt;basic_auth&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; --set &lt;span style="color:#b8860b"&gt;serviceType&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;NodePort&lt;span style="color:#666"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Release &lt;span style="color:#b44"&gt;&amp;#34;openfaas&amp;#34;&lt;/span&gt; does not exist. Installing it now.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME: openfaas
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LAST DEPLOYED: Sat Apr &lt;span style="color:#666"&gt;10&lt;/span&gt; 21:39:37 &lt;span style="color:#666"&gt;2021&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAMESPACE: openfaas
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;STATUS: deployed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;REVISION: &lt;span style="color:#666"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TEST SUITE: None
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NOTES:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;To verify that openfaas has started, run:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kubectl -n openfaas get deployments -l &lt;span style="color:#b44"&gt;&amp;#34;release=openfaas, app=openfaas&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;=======================================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt; OpenFaaS has been installed. &lt;span style="color:#666"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;=======================================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Get the faas-cli&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -SLsf https://cli.openfaas.com | sudo sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Forward the gateway to your machine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl rollout status -n openfaas deploy/gateway
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl port-forward -n openfaas svc/gateway 8080:8080 &amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# If basic auth is enabled, you can now log into your gateway:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b8860b"&gt;PASSWORD&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;kubectl get secret -n openfaas basic-auth -o &lt;span style="color:#b8860b"&gt;jsonpath&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;{.data.basic-auth-password}&amp;#34;&lt;/span&gt; | base64 --decode; &lt;span style="color:#a2f"&gt;echo&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f"&gt;echo&lt;/span&gt; -n &lt;span style="color:#b8860b"&gt;$PASSWORD&lt;/span&gt; | faas-cli login --username admin --password-stdin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;faas-cli store deploy figlet
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;faas-cli list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# For Raspberry Pi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;faas-cli store list &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --platform armhf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;faas-cli store deploy figlet &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --platform armhf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Find out more at:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# https://github.com/openfaas/faas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Thanks &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt; using arkade!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check if everything is working before moving onto the next step:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods --namespace openfaas
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alertmanager-74f9b48464-7gvrj 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 2m13s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;basic-auth-plugin-54bbd886f5-fclgn 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 2m13s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gateway-6f8f5d5c87-tbxns 2/2 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 2m13s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nats-695bf7587-hcbc2 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 2m13s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;prometheus-577c65f58c-4nvm7 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 2m13s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;queue-worker-b45b85966-g7kpt 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 2m13s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, it is time to deploy our function. The function we are going to deploy basically receives events for an infected
pod from the &lt;em&gt;Falcosidekick&lt;/em&gt; and deletes it immediately. Before deploying the function we need some
permissions to delete Pod. We create a &lt;code&gt;ServiceAccount&lt;/code&gt; with right to delete a Pod in any namespace, and we'll associate
it to our function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt;EOF | kubectl apply -f -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: ServiceAccount
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: openfaas-fn
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: ClusterRole
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: rbac.authorization.k8s.io/v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete-cluster-role
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;rules:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - apiGroups: [&amp;#34;&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; resources: [&amp;#34;pods&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; verbs: [&amp;#34;get&amp;#34;, &amp;#34;list&amp;#34;, &amp;#34;delete&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: ClusterRoleBinding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: rbac.authorization.k8s.io/v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete-cluster-role-binding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;roleRef:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; kind: ClusterRole
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete-cluster-role
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; apiGroup: rbac.authorization.k8s.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;subjects:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - kind: ServiceAccount
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: openfaas-fn
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, we are ready to deploy our &lt;em&gt;falco-pod-delete&lt;/em&gt; function, log in into &lt;em&gt;OpenFaaS Gateway&lt;/em&gt; first:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl port-forward -n openfaas svc/gateway 8080:8080 &amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#b8860b"&gt;PASSWORD&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;kubectl get secret -n openfaas basic-auth -o &lt;span style="color:#b8860b"&gt;jsonpath&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;{.data.basic-auth-password}&amp;#34;&lt;/span&gt; | base64 --decode; &lt;span style="color:#a2f"&gt;echo&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b8860b"&gt;$echo&lt;/span&gt; -n &lt;span style="color:#b8860b"&gt;$PASSWORD&lt;/span&gt; | faas-cli login --username admin --password-stdin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Calling the OpenFaaS server to validate the credentials...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;credentials saved &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt; admin http://127.0.0.1:8080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="install-falco-falcosidekick"&gt;Install Falco + Falcosidekick&lt;/h2&gt;
&lt;p&gt;Firstly, we'll create the namespace that will host both &lt;code&gt;Falco&lt;/code&gt; and &lt;code&gt;Falcosidekick&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl create namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We add the &lt;code&gt;helm&lt;/code&gt; repo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ helm repo add falcosecurity https://falcosecurity.github.io/charts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;&amp;#34;falcosecurity&amp;#34;&lt;/span&gt; has been added to your repositories
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ helm repo update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hang tight &lt;span style="color:#a2f;font-weight:bold"&gt;while&lt;/span&gt; we grab the latest from your chart repositories...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...Successfully got an update from the &lt;span style="color:#b44"&gt;&amp;#34;falcosecurity&amp;#34;&lt;/span&gt; chart repository
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...Successfully got an update from the &lt;span style="color:#b44"&gt;&amp;#34;openfaas&amp;#34;&lt;/span&gt; chart repository
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Update Complete. ⎈Happy Helming!⎈
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In a real project, you should get the whole chart with &lt;code&gt;helm pull falcosecurity/falco --untar&lt;/code&gt; and then configure
the &lt;code&gt;values.yaml&lt;/code&gt;. For this tutorial, will try to keep thing as easy as possible and set configs directly
by passing arguments to &lt;code&gt;helm install&lt;/code&gt; command line:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ helm upgrade --install falco falcosecurity/falco --namespace falco &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falcosidekick.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falcosidekick.config.openfaas.functionname&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;falco-pod-delete&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should get this output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Release &lt;span style="color:#b44"&gt;&amp;#34;falco&amp;#34;&lt;/span&gt; does not exist. Installing it now.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME: falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LAST DEPLOYED: Tue Apr &lt;span style="color:#666"&gt;13&lt;/span&gt; 10:49:49 &lt;span style="color:#666"&gt;2021&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAMESPACE: falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;STATUS: deployed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;REVISION: &lt;span style="color:#666"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NOTES:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Falco agents are spinning up on each node in your cluster. After a few
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;seconds, they are going to start monitoring your containers looking &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;security issues.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;No further action should be required.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And you can see your new &lt;code&gt;Falco&lt;/code&gt; and &lt;code&gt;Falcosidekick&lt;/code&gt;pods:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods --namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-7779579477-mwsb4 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 67s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-falcosidekick-7779579477-n5v89 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 67s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-p97rw 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 67s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The argument &lt;code&gt;falcosidekick.enabled=true&lt;/code&gt; sets the following settings in &lt;em&gt;Falco&lt;/em&gt; for you:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falco.jsonOutput&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falco.httpOutput.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--set falco.httpOutput.url&lt;span style="color:#666"&gt;=&lt;/span&gt;http://falco-falcosidekick:2801
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The
arguments &lt;code&gt;--set falco.jsonOutput=true --set falco.httpOutput.enabled=true --set falco.httpOutput.url=http://falco-falcosidekick:2801&lt;/code&gt;
are there to configure the format of events and the URL where &lt;code&gt;Falco&lt;/code&gt; will send them. As &lt;code&gt;Falco&lt;/code&gt; and &lt;code&gt;Falcosidekick&lt;/code&gt; will
be in the same namespace, it can directly use the name of the service (&lt;code&gt;falco-falcosidekick&lt;/code&gt;) above &lt;code&gt;Falcosidekick&lt;/code&gt; pods.&lt;/p&gt;
&lt;p&gt;We check the logs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl logs deployment/falco-falcosidekick -n falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Found &lt;span style="color:#666"&gt;2&lt;/span&gt; pods, using pod/falcosidekick-5c696d7fd8-9bnnj
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/04/10 19:21:55 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : Enabled Outputs : &lt;span style="color:#666"&gt;[&lt;/span&gt;OpenFaaS&lt;span style="color:#666"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/04/10 19:21:55 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : Falco Sidekick is up and listening on :2801
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;OpenFaaS&lt;/code&gt; is displayed as enabled output, everything is good 👍.&lt;/p&gt;
&lt;h2 id="install-our-openfaas-function"&gt;Install our OpenFaaS function&lt;/h2&gt;
&lt;p&gt;Our really basic function will receive events from &lt;code&gt;Falco&lt;/code&gt; thanks to &lt;code&gt;Falcosidekick&lt;/code&gt;, check if the triggered rule is *
&lt;a href="https://github.com/falcosecurity/falco/blob/0d7068b048772b1e2d3ca5c86c30b3040eac57df/rules/falco_rules.yaml#L2063"&gt;Terminal Shell in container*&lt;/a&gt;
, extract the &lt;em&gt;namespace&lt;/em&gt; and &lt;em&gt;pod name&lt;/em&gt; from the fields of events and delete the according pod:&lt;/p&gt;
&lt;p&gt;Basically, the process is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; +----------+ +---------------+ +----------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Falco +-----------------&amp;gt; Falcosidekick +--------------------&amp;gt; OpenFaaS |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; +----^-----+ sends event +---------------+ triggers +-----+----+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;detects a shell | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; +----+-------+ deletes |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Pwned Pod &amp;lt;----------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; +------------+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let's create the function and deploy it:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ faas-cli template store pull golang-middleware
Fetch templates from repository: https://github.com/openfaas/golang-http-template at
2021/04/10 21:56:34 Attempting to expand templates from https://github.com/openfaas/golang-http-template
2021/04/10 21:56:35 Fetched 2 template(s) : [golang-http golang-middleware] from https://github.com/openfaas/golang-http-template
$ tree -L 2 .
.
└── template
├── golang-http
└── golang-middleware
# Don&amp;#39;t forget to set your docker id in the prefix section, mine is devopps.
$ faas-cli new falco-pod-delete --lang golang-middleware --prefix devopps
faas-cli new falco-pod-delete --lang golang-middleware --prefix devopps
Folder: falco-pod-delete created.
___ _____ ____
/ _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___|
| | | | &amp;#39;_ \ / _ \ &amp;#39;_ \| |_ / _` |/ _` \___ \
| |_| | |_) | __/ | | | _| (_| | (_| |___) |
\___/| .__/ \___|_| |_|_| \__,_|\__,_|____/
|_|
Function created in folder: falco-pod-delete
Stack file written: falco-pod-delete.yml
Notes:
You have created a new function which uses Golang 1.13.
To include third-party dependencies, use Go modules and use
&amp;#34;--build-arg GO111MODULE=on&amp;#34; with faas-cli build or configure this
via your stack.yml file.
See more: https://docs.openfaas.com/cli/templates/
For detailed examples:
https://github.com/openfaas-incubator/golang-http-template
$ tree -L 2 .
.
├── falco-pod-delete
│ └── handler.go
├── falco-pod-delete.yml
└── template
├── golang-http
└── golang-middleware
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;First, replace the &lt;em&gt;falco-pod-delete.yml&lt;/em&gt; with the following content:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;version&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;1.0&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;provider&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;openfaas&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;gateway&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;http://127.0.0.1:8080&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;functions&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;falco-pod-delete&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;lang&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;golang-middleware&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;handler&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;./falco-pod-delete&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;image&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;devopps/falco-pod-delete:latest&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;# be careful this line, it should be your docker id.&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;annotations&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;com.openfaas.serviceaccount&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;falco-pod-delete&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;build_args&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;GO111MODULE&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;on&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once you have edited it, let's continue with the code, create a &lt;code&gt;go.mod&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ cd falco-pod-delete
$ go mod init falco-pod-delete
go: creating new go.mod: module falco-pod-delete
go: to add module requirements and sums:
go mod tidy
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then, replace the &lt;code&gt;handler.go&lt;/code&gt; with the following content:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-golang" data-lang="golang"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;package&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;function&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;import&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;context&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;encoding/json&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;io/ioutil&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;log&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;metaV1&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;k8s.io/apimachinery/pkg/apis/meta/v1&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;k8s.io/client-go/kubernetes&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;k8s.io/client-go/rest&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubeClient&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;*&lt;/span&gt;kubernetes.Clientset&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;init&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// creates the in-cluster config&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;config,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;rest.&lt;span style="color:#00a000"&gt;InClusterConfig&lt;/span&gt;()&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f"&gt;panic&lt;/span&gt;(err.&lt;span style="color:#00a000"&gt;Error&lt;/span&gt;())&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// creates the clientset&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubeClient,&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubernetes.&lt;span style="color:#00a000"&gt;NewForConfig&lt;/span&gt;(config)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;err&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f"&gt;panic&lt;/span&gt;(err.&lt;span style="color:#00a000"&gt;Error&lt;/span&gt;())&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Alert&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Output&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;output&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Priority&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;priority&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Rule&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;rule&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;Time&lt;span style="color:#bbb"&gt; &lt;/span&gt;time.Time&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;time&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;OutputFields&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ContainerID&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;container.id&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ContainerImageRepository&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;interface&lt;/span&gt;{}&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;container.image.repository&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ContainerImageTag&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;interface&lt;/span&gt;{}&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;container.image.tag&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;EvtTime&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;int64&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;evt.time&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;FdName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;fd.name&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;K8SNsName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;k8s.ns.name&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;K8SPodName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;k8s.pod.name&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ProcCmdline&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;proc.cmdline&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;`json:&amp;#34;output_fields&amp;#34;`&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;CriticalNamespaces&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;[]&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;{&lt;span style="color:#b44"&gt;&amp;#34;kube-system&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;kube-public&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;kube-node-lease&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;falco&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;openfaas&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;openfaas-fn&amp;#34;&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;Handle&lt;/span&gt;(w&lt;span style="color:#bbb"&gt; &lt;/span&gt;http.ResponseWriter,&lt;span style="color:#bbb"&gt; &lt;/span&gt;r&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;*&lt;/span&gt;http.Request)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;alert&lt;span style="color:#bbb"&gt; &lt;/span&gt;Alert&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;r.Body&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;!=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;defer&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;r.Body.&lt;span style="color:#00a000"&gt;Close&lt;/span&gt;()&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;body,&lt;span style="color:#bbb"&gt; &lt;/span&gt;_&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ioutil.&lt;span style="color:#00a000"&gt;ReadAll&lt;/span&gt;(r.Body)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;json.&lt;span style="color:#00a000"&gt;Unmarshal&lt;/span&gt;(body,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;&amp;amp;&lt;/span&gt;alert)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;podName&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;alert.OutputFields.K8SPodName&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;namespace&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;alert.OutputFields.K8SNsName&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;var&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;critical&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;bool&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;_&lt;span style="color:#bbb"&gt; &lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;ns&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;:=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;range&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;CriticalNamespaces&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ns&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;==&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;namespace&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;critical&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;break&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;!critical&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;log.&lt;span style="color:#00a000"&gt;Printf&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;Deleting pod %s from namespace %s&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;podName,&lt;span style="color:#bbb"&gt; &lt;/span&gt;namespace)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;kubeClient.&lt;span style="color:#00a000"&gt;CoreV1&lt;/span&gt;().&lt;span style="color:#00a000"&gt;Pods&lt;/span&gt;(namespace).&lt;span style="color:#00a000"&gt;Delete&lt;/span&gt;(context.&lt;span style="color:#00a000"&gt;Background&lt;/span&gt;(),&lt;span style="color:#bbb"&gt; &lt;/span&gt;podName,&lt;span style="color:#bbb"&gt; &lt;/span&gt;metaV1.DeleteOptions{})&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;w.&lt;span style="color:#00a000"&gt;WriteHeader&lt;/span&gt;(http.StatusOK)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;w.&lt;span style="color:#00a000"&gt;Write&lt;/span&gt;([]&lt;span style="color:#a2f"&gt;byte&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;))&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After that, update your &lt;em&gt;Go Modules&lt;/em&gt; by doing &lt;code&gt;go mod tidy&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ go mod tidy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go: finding module &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt; package k8s.io/client-go/rest
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go: finding module &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt; package k8s.io/apimachinery/pkg/apis/meta/v1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go: finding module &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt; package k8s.io/client-go/kubernetes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go: downloading k8s.io/client-go v0.21.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go: downloading k8s.io/apimachinery v0.21.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go: found k8s.io/apimachinery/pkg/apis/meta/v1 in k8s.io/apimachinery v0.21.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go: found k8s.io/client-go/kubernetes in k8s.io/client-go v0.21.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go: found k8s.io/client-go/rest in k8s.io/client-go v0.21.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go: downloading k8s.io/api v0.21.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go: downloading golang.org/x/net v0.0.0-20210224082022-3d97a244fca7
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go: downloading sigs.k8s.io/structured-merge-diff/v4 v4.1.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go: downloading golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, you should be able to build, push and deploy your function with &lt;code&gt;faas-cli&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#a2f"&gt;cd&lt;/span&gt; ..
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ faas-cli up -f falco-pod-delete.yml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;0&lt;span style="color:#666"&gt;]&lt;/span&gt; &amp;gt; Building falco-pod-delete.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Clearing temporary build folder: ./build/falco-pod-delete/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Preparing: ./falco-pod-delete/ build/falco-pod-delete/function
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Building: devopps/falco-pod-delete:latest with golang-middleware template. Please wait..
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;#1 [internal] load build definition from Dockerfile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;#1 sha256:8cd765381aabb90df3bcfbc06f4d175af37d66b85125d463585abc1fc878b94b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;#1 transferring dockerfile: 1.81kB done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;#1 DONE 0.0s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Use &lt;span style="color:#b44"&gt;&amp;#39;docker scan&amp;#39;&lt;/span&gt; to run Snyk tests against images to find vulnerabilities and learn how to fix them
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Image: devopps/falco-pod-delete:latest built.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;0&lt;span style="color:#666"&gt;]&lt;/span&gt; &amp;lt; Building falco-pod-delete &lt;span style="color:#a2f;font-weight:bold"&gt;done&lt;/span&gt; in 1.31s.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;0&lt;span style="color:#666"&gt;]&lt;/span&gt; Worker &lt;span style="color:#a2f;font-weight:bold"&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Total build time: 1.31s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;0&lt;span style="color:#666"&gt;]&lt;/span&gt; &amp;gt; Pushing falco-pod-delete &lt;span style="color:#666"&gt;[&lt;/span&gt;devopps/falco-pod-delete:latest&lt;span style="color:#666"&gt;]&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The push refers to repository &lt;span style="color:#666"&gt;[&lt;/span&gt;docker.io/devopps/falco-pod-delete&lt;span style="color:#666"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;8096edd09fbc: Layer already exists
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;464d68aca3d9: Layer already exists
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;e4766ea46ad0: Layer already exists
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5f70bf18a086: Layer already exists
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;a823d50a5b72: Layer already exists
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;060f21486264: Layer already exists
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;8ea3b23f387b: Layer already exists
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;latest: digest: sha256:f94abba203232b97cb2873ef5d60eec31b52d492f3d3ee106d6a9877bf131d95 size: &lt;span style="color:#666"&gt;1782&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;0&lt;span style="color:#666"&gt;]&lt;/span&gt; &amp;lt; Pushing falco-pod-delete &lt;span style="color:#666"&gt;[&lt;/span&gt;devopps/falco-pod-delete:latest&lt;span style="color:#666"&gt;]&lt;/span&gt; &lt;span style="color:#a2f;font-weight:bold"&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;[&lt;/span&gt;0&lt;span style="color:#666"&gt;]&lt;/span&gt; Worker &lt;span style="color:#a2f;font-weight:bold"&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Deploying: falco-pod-delete.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Deployed. &lt;span style="color:#666"&gt;202&lt;/span&gt; Accepted.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;URL: http://127.0.0.1:8080/function/falco-pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check if everything is working before moving to the next step:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods --namespace openfaas-fn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-pod-delete-7dc9f5fbb8-gbfk7 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 27s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="test-our-function"&gt;Test our function&lt;/h2&gt;
&lt;p&gt;We start by creating a dumb pod:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl run alpine --namespace default --image&lt;span style="color:#666"&gt;=&lt;/span&gt;alpine --restart&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;Never&amp;#39;&lt;/span&gt; -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;sleep 600&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pod/alpine created
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods --namespace default
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alpine 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 11s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let's run a &lt;em&gt;shell&lt;/em&gt; command inside and see what happens:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; -i --tty alpine --namespace default -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;uptime&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;19:27:21 up &lt;span style="color:#666"&gt;50&lt;/span&gt; min, load average: 0.11, 0.12, 0.11
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As expected we got the result of our command, but, if we get the status of the pod we retrieve:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get pods --namespace default
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alpine 1/1 Terminating &lt;span style="color:#666"&gt;0&lt;/span&gt; 103s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;💥 &lt;strong&gt;It has been terminated&lt;/strong&gt; 💥&lt;/p&gt;
&lt;p&gt;We can now check the logs of components.&lt;/p&gt;
&lt;p&gt;For &lt;code&gt;Falco&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl logs daemonset/falco --namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;..
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;{&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;output&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;19:27:21.002873265: Notice A shell was spawned in a container with an attached terminal (user=root user_loginuid=-1 k8s.ns=default k8s.pod=alpine container=97c9868ea832 shell=sh parent=runc cmdline=sh -c uptime terminal=34816 container_id=97c9868ea832 image=alpine) k8s.ns=default k8s.pod=alpine container=97c9868ea832&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;priority&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;Notice&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;rule&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;Terminal shell in container&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;2021-04-10T19:27:21.002873265Z&amp;#34;&lt;/span&gt;, &lt;span style="color:#b44"&gt;&amp;#34;output_fields&amp;#34;&lt;/span&gt;: &lt;span style="color:#666"&gt;{&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;container.id&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;97c9868ea832&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;container.image.repository&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;alpine&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;evt.time&amp;#34;&lt;/span&gt;:1618082841002873265,&lt;span style="color:#b44"&gt;&amp;#34;k8s.ns.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;k8s.pod.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;alpine&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.cmdline&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;sh -c uptime&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;sh&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.pname&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;runc&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.tty&amp;#34;&lt;/span&gt;:34816,&lt;span style="color:#b44"&gt;&amp;#34;user.loginuid&amp;#34;&lt;/span&gt;:-1,&lt;span style="color:#b44"&gt;&amp;#34;user.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span style="color:#666"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;{&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;output&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;19:27:21.038853452: Notice Unexpected connection to K8s API Server from container (command=handler k8s.ns=openfaas-fn k8s.pod=falco-pod-delete-7dc9f5fbb8-gbfk7 container=12fc4de5ccc3 image=devopps/falco-pod-delete:latest connection=172.17.0.9:43812-&amp;gt;10.96.0.1:443) k8s.ns=openfaas-fn k8s.pod=falco-pod-delete-7dc9f5fbb8-gbfk7 container=12fc4de5ccc3&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;priority&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;Notice&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;rule&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;Contact K8S API Server From Container&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;2021-04-10T19:27:21.038853452Z&amp;#34;&lt;/span&gt;, &lt;span style="color:#b44"&gt;&amp;#34;output_fields&amp;#34;&lt;/span&gt;: &lt;span style="color:#666"&gt;{&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;container.id&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;12fc4de5ccc3&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;container.image.repository&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;devopps/falco-pod-delete&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;container.image.tag&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;latest&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;evt.time&amp;#34;&lt;/span&gt;:1618082841038853452,&lt;span style="color:#b44"&gt;&amp;#34;fd.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;172.17.0.9:43812-&amp;gt;10.96.0.1:443&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;k8s.ns.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;openfaas-fn&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;k8s.pod.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;falco-pod-delete-7dc9f5fbb8-gbfk7&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.cmdline&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;handler&amp;#34;&lt;/span&gt;&lt;span style="color:#666"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For &lt;code&gt;Falcosidekick&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl logs deployment/falcosidekick --namespace falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/04/10 19:27:21 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : OpenFaas - Post OK &lt;span style="color:#666"&gt;(&lt;/span&gt;200&lt;span style="color:#666"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/04/10 19:27:21 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : OpenFaas - Function Response : OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/04/10 19:27:21 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : OpenFaas - Call Function &lt;span style="color:#b44"&gt;&amp;#34;falco-pod-delete.openfaas-fn&amp;#34;&lt;/span&gt; OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;..
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For &lt;em&gt;falco-delete-pod&lt;/em&gt; function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ faas-cli logs -f --name falco-pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/04/10 19:34:03 Deleting pod alpine from namespace default
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/04/10 19:34:03 POST / - &lt;span style="color:#666"&gt;200&lt;/span&gt; OK - ContentLength: &lt;span style="color:#666"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;With this really simple example, we only scratched the surface of possibilities, so don't
hesitate to share with us on Slack (&lt;a href="https://kubernetes.slack.com"&gt;https://kubernetes.slack.com&lt;/a&gt; #falco) your comments, ideas and successes. You're also
always welcome to &lt;a href="https://github.com/falcosecurity/.github/blob/master/CONTRIBUTING.md"&gt;contribute&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Blog: Kubernetes Response Engine, Part 1: Falcosidekick + Kubeless</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-1-kubeless/</link><pubDate>Fri, 15 Jan 2021 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-1-kubeless/</guid><description>
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This blog post is part of a series of articles about how to create a &lt;code&gt;Kubernetes&lt;/code&gt; response engine with &lt;code&gt;Falco&lt;/code&gt;, &lt;code&gt;Falcosidekick&lt;/code&gt; and a &lt;code&gt;FaaS&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;See other posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-2-openfaas/"&gt;Kubernetes Response Engine, Part 2 : Falcosidekick + OpenFaas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-3-knative/"&gt;Kubernetes Response Engine, Part 3 : Falcosidekick + Knative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-4-tekton/"&gt;Kubernetes Response Engine, Part 4 : Falcosidekick + Tekton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-5-argo/"&gt;Kubernetes Response Engine, Part 5 : Falcosidekick + Argo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-6-cloud-run/"&gt;Kubernetes Response Engine, Part 6 : Falcosidekick + Cloud Run&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-7-cloud-functions/"&gt;Kubernetes Response Engine, Part 7: Falcosidekick + Cloud Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Two years ago, we presented to you a &lt;code&gt;Kubernetes Response Engine&lt;/code&gt; based on &lt;code&gt;Falco&lt;/code&gt;. The idea was to trigger &lt;a href="https://kubeless.io"&gt;&lt;code&gt;Kubeless&lt;/code&gt;&lt;/a&gt; serverless functions for deleting infected pod, start a &lt;code&gt;Sysdig&lt;/code&gt; capture or forward the &lt;code&gt;events&lt;/code&gt; to &lt;code&gt;GCP PubSub&lt;/code&gt;. See the &lt;a href="https://github.com/falcosecurity/kubernetes-response-engine"&gt;README&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To avoid maintaining this custom stack, we worked hard with the community to integrate all components into &lt;a href="https://github.com/falcosecurity/falcosidekick"&gt;&lt;code&gt;Falcosidekick&lt;/code&gt;&lt;/a&gt; and to improve the UX.
With the last release &lt;a href="https://github.com/falcosecurity/falcosidekick/releases/tag/2.20.0"&gt;&lt;code&gt;2.20.0&lt;/code&gt;&lt;/a&gt; we have the finale piece, the integration of &lt;code&gt;Kubeless&lt;/code&gt; as native output. More details in &lt;a href="https://falco.org/blog/falcosidekick-2020/"&gt;our retrospective of 2020&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this blog post, we will explain the basic concepts for integrating your own Response Engine into K8S with the stack &lt;code&gt;Falco&lt;/code&gt; + &lt;code&gt;Falcosidekick&lt;/code&gt; + &lt;code&gt;Kubeless&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;p&gt;We require a &lt;code&gt;kubernetes&lt;/code&gt; cluster running at least &lt;code&gt;1.17&lt;/code&gt; release and &lt;a href="https://helm.sh"&gt;&lt;code&gt;helm&lt;/code&gt;&lt;/a&gt; and &lt;code&gt;kubectl&lt;/code&gt; installed.&lt;/p&gt;
&lt;h2 id="install-kubeless"&gt;Install Kubeless&lt;/h2&gt;
&lt;p&gt;Follow the official &lt;a href="https://kubeless.io/docs/quick-start/"&gt;quick start&lt;/a&gt; page:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f"&gt;export&lt;/span&gt; &lt;span style="color:#b8860b"&gt;RELEASE&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;curl -s https://api.github.com/repos/kubeless/kubeless/releases/latest | grep tag_name | cut -d &lt;span style="color:#b44"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 4&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl create ns kubeless
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl create -f https://github.com/kubeless/kubeless/releases/download/&lt;span style="color:#b8860b"&gt;$RELEASE&lt;/span&gt;/kubeless-&lt;span style="color:#b8860b"&gt;$RELEASE&lt;/span&gt;.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After a few seconds, we can check that the controller is up and running:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl get pods -n kubeless
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubeless-controller-manager-99459cb67-tb99d 3/3 Running &lt;span style="color:#666"&gt;3&lt;/span&gt; 2m34s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="install-falco"&gt;Install Falco&lt;/h2&gt;
&lt;p&gt;Firstly, we'll create the namespace that will use both &lt;code&gt;Falco&lt;/code&gt; and &lt;code&gt;Falcosidekick&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl create ns falco
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add the &lt;code&gt;helm&lt;/code&gt; repo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm repo add falcosecurity https://falcosecurity.github.io/charts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In a real project, you should get the whole chart with &lt;code&gt;helm pull falcosecurity/falco --untar&lt;/code&gt; and then configure the &lt;code&gt;values.yaml&lt;/code&gt;. For this tutorial, we will try to keep things as easy as possible and set configs directly by &lt;code&gt;helm install&lt;/code&gt; command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm install falco falcosecurity/falco --set falco.jsonOutput&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; --set falco.httpOutput.enabled&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f"&gt;true&lt;/span&gt; --set falco.httpOutput.url&lt;span style="color:#666"&gt;=&lt;/span&gt;http://falcosidekick:2801 -n falco
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should get this output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME: falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LAST DEPLOYED: Thu Jan &lt;span style="color:#666"&gt;14&lt;/span&gt; 23:43:46 &lt;span style="color:#666"&gt;2021&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAMESPACE: falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;STATUS: deployed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;REVISION: &lt;span style="color:#666"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TEST SUITE: None
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NOTES:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Falco agents are spinning up on each node in your cluster. After a few
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;seconds, they are going to start monitoring your containers looking &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;security issues.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;No further action should be required.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And you can see your new &lt;code&gt;Falco&lt;/code&gt; pods:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl get pods -n falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-ctmzg 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 111s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-sfnn8 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 111s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-rrg28 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 111s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The arguments &lt;code&gt;--set falco.jsonOutput=true --set falco.httpOutput.enabled=true --set falco.httpOutput.url=http://falcosidekick:2801&lt;/code&gt; are there configuring the format of events and the URL where &lt;code&gt;Falco&lt;/code&gt; will send them. As &lt;code&gt;Falco&lt;/code&gt; and &lt;code&gt;Falcosidekick&lt;/code&gt; will be in the same namespace, we can directly use the name of the service (&lt;code&gt;falcosidekick&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id="install-falcosidekick"&gt;Install Falcosidekick&lt;/h2&gt;
&lt;p&gt;The process is quite the same:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm install falcosidekick falcosecurity/falcosidekick --set config.kubeless.namespace&lt;span style="color:#666"&gt;=&lt;/span&gt;kubeless --set config.kubeless.function&lt;span style="color:#666"&gt;=&lt;/span&gt;delete-pod -n falco
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should get this output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME: falcosidekick
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LAST DEPLOYED: Thu Jan &lt;span style="color:#666"&gt;14&lt;/span&gt; 23:55:12 &lt;span style="color:#666"&gt;2021&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAMESPACE: falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;STATUS: deployed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;REVISION: &lt;span style="color:#666"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NOTES:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1. Get the application URL by running these commands:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a2f"&gt;export&lt;/span&gt; &lt;span style="color:#b8860b"&gt;POD_NAME&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;kubectl get pods --namespace falco -l &lt;span style="color:#b44"&gt;&amp;#34;app.kubernetes.io/name=falcosidekick,app.kubernetes.io/instance=falcosidekick&amp;#34;&lt;/span&gt; -o &lt;span style="color:#b8860b"&gt;jsonpath&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;{.items[0].metadata.name}&amp;#34;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kubectl port-forward &lt;span style="color:#b8860b"&gt;$POD_NAME&lt;/span&gt; 2801:2801
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a2f"&gt;echo&lt;/span&gt; &lt;span style="color:#b44"&gt;&amp;#34;Visit http://127.0.0.1:2801 to use your application&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We check the logs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl logs deployment/falcosidekick -n falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/01/14 22:55:31 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : Enabled Outputs : Kubeless
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/01/14 22:55:31 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : Falco Sidekick is up and listening on port &lt;span style="color:#666"&gt;2801&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Kubeless&lt;/code&gt; is displayed as enabled output, everything is good 👍.&lt;/p&gt;
&lt;p&gt;That's it, we really tried to get a nice UX 😉.&lt;/p&gt;
&lt;h2 id="install-our-kubeless-function"&gt;Install our Kubeless function&lt;/h2&gt;
&lt;p&gt;We'll not explain how to write or how to work &lt;code&gt;Kubeless&lt;/code&gt; functions, please read the official &lt;a href="https://kubeless.io/docs/"&gt;docs&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;Our basic function will receive events from &lt;code&gt;Falco&lt;/code&gt;, thanks to &lt;code&gt;Falcosidekick&lt;/code&gt;. Check if the triggered rule is &lt;em&gt;Terminal Shell in container&lt;/em&gt;. See &lt;a href="https://github.com/falcosecurity/falco/blob/0d7068b048772b1e2d3ca5c86c30b3040eac57df/rules/falco_rules.yaml#L2063"&gt;rule&lt;/a&gt;, extract the &lt;em&gt;namespace&lt;/em&gt; and &lt;em&gt;pod name&lt;/em&gt; from fields of events, and delete the according pod:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;from&lt;/span&gt; &lt;span style="color:#00f;font-weight:bold"&gt;kubernetes&lt;/span&gt; &lt;span style="color:#a2f;font-weight:bold"&gt;import&lt;/span&gt; client,config
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;config&lt;span style="color:#666"&gt;.&lt;/span&gt;load_incluster_config()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#00a000"&gt;delete_pod&lt;/span&gt;(event, context):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rule &lt;span style="color:#666"&gt;=&lt;/span&gt; event[&lt;span style="color:#b44"&gt;&amp;#39;data&amp;#39;&lt;/span&gt;][&lt;span style="color:#b44"&gt;&amp;#39;rule&amp;#39;&lt;/span&gt;] &lt;span style="color:#a2f;font-weight:bold"&gt;or&lt;/span&gt; &lt;span style="color:#a2f;font-weight:bold"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output_fields &lt;span style="color:#666"&gt;=&lt;/span&gt; event[&lt;span style="color:#b44"&gt;&amp;#39;data&amp;#39;&lt;/span&gt;][&lt;span style="color:#b44"&gt;&amp;#39;output_fields&amp;#39;&lt;/span&gt;] &lt;span style="color:#a2f;font-weight:bold"&gt;or&lt;/span&gt; &lt;span style="color:#a2f;font-weight:bold"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt; rule &lt;span style="color:#a2f;font-weight:bold"&gt;and&lt;/span&gt; rule &lt;span style="color:#666"&gt;==&lt;/span&gt; &lt;span style="color:#b44"&gt;&amp;#34;Terminal shell in container&amp;#34;&lt;/span&gt; &lt;span style="color:#a2f;font-weight:bold"&gt;and&lt;/span&gt; output_fields:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt; output_fields[&lt;span style="color:#b44"&gt;&amp;#39;k8s.ns.name&amp;#39;&lt;/span&gt;] &lt;span style="color:#a2f;font-weight:bold"&gt;and&lt;/span&gt; output_fields[&lt;span style="color:#b44"&gt;&amp;#39;k8s.pod.name&amp;#39;&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pod &lt;span style="color:#666"&gt;=&lt;/span&gt; output_fields[&lt;span style="color:#b44"&gt;&amp;#39;k8s.pod.name&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; namespace &lt;span style="color:#666"&gt;=&lt;/span&gt; output_fields[&lt;span style="color:#b44"&gt;&amp;#39;k8s.ns.name&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a2f"&gt;print&lt;/span&gt; (&lt;span style="color:#b44"&gt;f&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;Deleting pod &lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;{&lt;/span&gt;pod&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#b44"&gt; in namespace &lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;{&lt;/span&gt;namespace&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#b62;font-weight:bold"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; client&lt;span style="color:#666"&gt;.&lt;/span&gt;CoreV1Api()&lt;span style="color:#666"&gt;.&lt;/span&gt;delete_namespaced_pod(name&lt;span style="color:#666"&gt;=&lt;/span&gt;pod, namespace&lt;span style="color:#666"&gt;=&lt;/span&gt;namespace, body&lt;span style="color:#666"&gt;=&lt;/span&gt;client&lt;span style="color:#666"&gt;.&lt;/span&gt;V1DeleteOptions())
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Basically, the process is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; +----------+ +---------------+ +----------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Falco +-----------------&amp;gt; Falcosidekick +--------------------&amp;gt; Kubeless |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; +----^-----+ sends event +---------------+ triggers +-----+----+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;detects a shell | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; +----+-------+ deletes |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Pwned Pod &amp;lt;----------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; +------------+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Before deploying our function, we need to create a &lt;code&gt;ServiceAccount&lt;/code&gt; for it, as it will need the right to delete a pod in any namespace:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt;EOF | kubectl apply -n kubeless -f -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: ServiceAccount
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: ClusterRole
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: rbac.authorization.k8s.io/v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete-cluster-role
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;rules:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - apiGroups: [&amp;#34;&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; resources: [&amp;#34;pods&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; verbs: [&amp;#34;get&amp;#34;, &amp;#34;list&amp;#34;, &amp;#34;delete&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: ClusterRoleBinding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: rbac.authorization.k8s.io/v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete-cluster-role-binding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;roleRef:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; kind: ClusterRole
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete-cluster-role
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; apiGroup: rbac.authorization.k8s.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;subjects:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - kind: ServiceAccount
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: falco-pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace: kubeless
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;namespace: kubelessetetion.k8s.io
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;serviceaccount/falco-pod-delete created
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;clusterrole.rbac.authorization.k8s.io/falco-pod-delete-cluster-role created
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;clusterrolebinding.rbac.authorization.k8s.io/falco-pod-delete-cluster-role-binding created
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Only remains the installation of our function itself:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &lt;span style="color:#b44"&gt;&amp;lt;&amp;lt;EOF | kubectl apply -n kubeless -f -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;apiVersion: kubeless.io/v1beta1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kind: Function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; finalizers:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; - kubeless.io/function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; generation: 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; labels:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; created-by: kubeless
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; function: delete-pod
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; name: delete-pod
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; checksum: sha256:a68bf570ea30e578e392eab18ca70dbece27bce850a8dbef2586eff55c5c7aa0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; deps: |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; kubernetes&amp;gt;=12.0.1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; function-content-type: text
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; function: |-
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; from kubernetes import client,config
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; config.load_incluster_config()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; def delete_pod(event, context):
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; rule = event[&amp;#39;data&amp;#39;][&amp;#39;rule&amp;#39;] or None
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; output_fields = event[&amp;#39;data&amp;#39;][&amp;#39;output_fields&amp;#39;] or None
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; if rule and rule == &amp;#34;Terminal shell in container&amp;#34; and output_fields:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; if output_fields[&amp;#39;k8s.ns.name&amp;#39;] and output_fields[&amp;#39;k8s.pod.name&amp;#39;]:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; pod = output_fields[&amp;#39;k8s.pod.name&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; namespace = output_fields[&amp;#39;k8s.ns.name&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; print (f&amp;#34;Deleting pod \&amp;#34;{pod}\&amp;#34; in namespace \&amp;#34;{namespace}\&amp;#34;&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; client.CoreV1Api().delete_namespaced_pod(name=pod, namespace=namespace, body=client.V1DeleteOptions())
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; handler: delete-pod.delete_pod
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; runtime: python3.7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; deployment:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; template:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; serviceAccountName: falco-pod-delete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;function&lt;/span&gt;.kubeless.io/delete-pod created
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl get pods -n kubeless
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubeless-controller-manager-99459cb67-tb99d 3/3 Running &lt;span style="color:#666"&gt;3&lt;/span&gt; 3d14h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;delete-pod-d6f98f6dd-cw228 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 2m52s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl get svc -n kubeless
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME TYPE CLUSTER-IP EXTERNAL-IP PORT&lt;span style="color:#666"&gt;(&lt;/span&gt;S&lt;span style="color:#666"&gt;)&lt;/span&gt; AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;delete-pod ClusterIP 10.43.211.201 &amp;lt;none&amp;gt; 8080/TCP 4m38s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="test-our-function"&gt;Test our function&lt;/h2&gt;
&lt;p&gt;We start by creating a dumb pod:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl run alpine -n default --image&lt;span style="color:#666"&gt;=&lt;/span&gt;alpine --restart&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;Never&amp;#39;&lt;/span&gt; -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;sleep 600&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl get pods -n default
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alpine 1/1 Running &lt;span style="color:#666"&gt;0&lt;/span&gt; 9s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let's run a &lt;em&gt;shell&lt;/em&gt; command inside and see what happens:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; -i --tty alpine -n default -- sh -c &lt;span style="color:#b44"&gt;&amp;#34;uptime&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;23:44:25 up &lt;span style="color:#666"&gt;1&lt;/span&gt; day, 19:11, load average: 0.87, 0.77, 0.77
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As expected, we got the result of our command, but, to get the status of the pod now:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl get pods -n default
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alpine 1/1 Terminating &lt;span style="color:#666"&gt;0&lt;/span&gt; 103s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;💥 &lt;strong&gt;It has been terminated&lt;/strong&gt; 💥&lt;/p&gt;
&lt;p&gt;We can now check the logs of components.&lt;/p&gt;
&lt;p&gt;For &lt;code&gt;Falco&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl logs daemonset/falco -n falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;{&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;output&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;23:39:44.834631763: Notice A shell was spawned in a container with an attached terminal (user=root user_loginuid=-1 k8s.ns=default k8s.pod=alpine container=5892b41bcf46 shell=sh parent=&amp;lt;NA&amp;gt; cmdline=sh terminal=34817 container_id=5892b41bcf46 image=&amp;lt;NA&amp;gt;) k8s.ns=default k8s.pod=alpine container=5892b41bcf46&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;priority&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;Notice&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;rule&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;Terminal shell in container&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;2021-01-14T23:39:44.834631763Z&amp;#34;&lt;/span&gt;, &lt;span style="color:#b44"&gt;&amp;#34;output_fields&amp;#34;&lt;/span&gt;: &lt;span style="color:#666"&gt;{&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;container.id&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;5892b41bcf46&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;container.image.repository&amp;#34;&lt;/span&gt;:null,&lt;span style="color:#b44"&gt;&amp;#34;evt.time&amp;#34;&lt;/span&gt;:1610667584834631763,&lt;span style="color:#b44"&gt;&amp;#34;k8s.ns.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;k8s.pod.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;alpine&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.cmdline&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;sh&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;sh&amp;#34;&lt;/span&gt;,&lt;span style="color:#b44"&gt;&amp;#34;proc.pname&amp;#34;&lt;/span&gt;:null,&lt;span style="color:#b44"&gt;&amp;#34;proc.tty&amp;#34;&lt;/span&gt;:34817,&lt;span style="color:#b44"&gt;&amp;#34;user.loginuid&amp;#34;&lt;/span&gt;:-1,&lt;span style="color:#b44"&gt;&amp;#34;user.name&amp;#34;&lt;/span&gt;:&lt;span style="color:#b44"&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span style="color:#666"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For &lt;code&gt;Falcosidekick&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl logs deployment/falcosidekick -n falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/01/14 23:39:45 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : Kubeless - Post OK &lt;span style="color:#666"&gt;(&lt;/span&gt;200&lt;span style="color:#666"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/01/14 23:39:45 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : Kubeless - Function Response :
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2021/01/14 23:39:45 &lt;span style="color:#666"&gt;[&lt;/span&gt;INFO&lt;span style="color:#666"&gt;]&lt;/span&gt; : Kubeless - Call Function &lt;span style="color:#b44"&gt;&amp;#34;delete-pod&amp;#34;&lt;/span&gt; OK
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;(Notice, the function returns nothing, this is why the message log is empty)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For &lt;code&gt;delete-pod&lt;/code&gt; function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl logs deployment/delete-pod -n kubeless
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;10.42.0.31 - - &lt;span style="color:#666"&gt;[&lt;/span&gt;14/Jan/2021:23:39:45 +0000&lt;span style="color:#666"&gt;]&lt;/span&gt; &lt;span style="color:#b44"&gt;&amp;#34;POST / HTTP/1.1&amp;#34;&lt;/span&gt; &lt;span style="color:#666"&gt;200&lt;/span&gt; &lt;span style="color:#666"&gt;0&lt;/span&gt; &lt;span style="color:#b44"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#b44"&gt;&amp;#34;Falcosidekick&amp;#34;&lt;/span&gt; 0/965744
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Deleting pod &lt;span style="color:#b44"&gt;&amp;#34;alpine&amp;#34;&lt;/span&gt; in namespace &lt;span style="color:#b44"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;With this simple example, we only scratched the surface of possibilities. Everything is possible now, so don't hesitate to share with us on Slack (&lt;a href="https://kubernetes.slack.com"&gt;https://kubernetes.slack.com&lt;/a&gt; #falco) your comments, ideas and successes. You're always welcome to &lt;a href="https://github.com/falcosecurity/.github/blob/master/CONTRIBUTING.md"&gt;contribute&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Bonus: You're running &lt;code&gt;Falcosidekick&lt;/code&gt; outside &lt;code&gt;Kubernetes&lt;/code&gt; but still want to use the &lt;code&gt;Kubeless&lt;/code&gt; output? No problem, you can declare a kubeconfig file to use. See &lt;a href="https://github.com/falcosecurity/falcosidekick/blob/master/README.md"&gt;README&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Bonus 2: For people who wants to use &lt;code&gt;Knative&lt;/code&gt; in place of &lt;code&gt;Kubeless&lt;/code&gt;, it's coming soon 😉&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Enjoy&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>