<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Falco – Falcosidekick</title><link>https://v0-43--falcosecurity.netlify.app/tags/falcosidekick/</link><description>Recent content in Falcosidekick on Falco</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 04 Feb 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://v0-43--falcosecurity.netlify.app/tags/falcosidekick/feed.xml" rel="self" type="application/rss+xml"/><item><title>Blog: Falcosidekick 2.31.0</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-2-31-0/</link><pubDate>Tue, 04 Feb 2025 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-2-31-0/</guid><description>
&lt;p&gt;The year 2025 is well started now. We saw a few days ago &lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falco-0-40-0/"&gt;the first release of Falco for the year&lt;/a&gt;. It's to let fly out a new version of Falcosidekick, the 2.31.0.&lt;/p&gt;
&lt;h2 id="new-output"&gt;New output&lt;/h2&gt;
&lt;p&gt;This release comes with a new output only, the last pillar of the observability with [OpenTelemetry].(&lt;a href="https://opentelemetry.io/"&gt;https://opentelemetry.io/&lt;/a&gt;) that missing in Falcosidekick.&lt;/p&gt;
&lt;h3 id="otlp-metrics"&gt;OTLP Metrics&lt;/h3&gt;
&lt;p&gt;You can now forward the Falco Events to the OpenTelemetery collector or any received understanding the protocol.&lt;/p&gt;
&lt;h2 id="new-features"&gt;New features&lt;/h2&gt;
&lt;p&gt;Here's a non exhaustive list of the great features and enhancements which come with this new release:&lt;/p&gt;
&lt;h3 id="better-logger"&gt;Better logger&lt;/h3&gt;
&lt;p&gt;It was a ToDo for a while (even years), but it's now completed. The log system used by Falcosidekick has been replaced, without any breaking change for the users, but opening the door to more enhancements in the future.&lt;/p&gt;
&lt;h3 id="more-default-labels-for-loki"&gt;More default labels for Loki&lt;/h3&gt;
&lt;p&gt;The log lines forwarded to &lt;code&gt;Loki&lt;/code&gt; contain now by default the source namespace and pod name, if present in the alert. It will allow to filter more easily the events you want to display in your dashboards. Thanks to &lt;a href="https://github.com/afreyermuth98"&gt;@afreyermuth98&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="payload-format-for-loki"&gt;Payload format for Loki&lt;/h3&gt;
&lt;p&gt;Some users asked for the possibility to forward the Falco alerts in their JSON format to &lt;code&gt;Loki&lt;/code&gt;. You can now use the setting &lt;code&gt;loki.format&lt;/code&gt; for.&lt;/p&gt;
&lt;h3 id="nats-stan-subject"&gt;NATS/STAN subject&lt;/h3&gt;
&lt;p&gt;The template for the subject where to push the messages for &lt;code&gt;NATS&lt;/code&gt;/&lt;code&gt;STAN&lt;/code&gt; was hardcoded, it can now be overridden with &lt;code&gt;nats/stan.subjecttemplate&lt;/code&gt;. See the &lt;a href="https://github.com/falcosecurity/falcosidekick/blob/5af88e588a263d3b4ca20f8f13650369111cb249/config_example.yaml#L167"&gt;example config file&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="fixes"&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fix the missing templated fields as labels in &lt;code&gt;Loki&lt;/code&gt; payload (&lt;a href="https://github.com/falcosecurity/falcosidekick/pull/1091"&gt;PR#1091&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix the creation error of a &lt;code&gt;ClusterPolicyReport&lt;/code&gt; (&lt;a href="https://github.com/falcosecurity/falcosidekick/pull/100"&gt;PR#1100&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix the missing custom headers for HTTP requests for &lt;code&gt;Loki&lt;/code&gt; (&lt;a href="https://github.com/falcosecurity/falcosidekick/pull/1107"&gt;PR#1107&lt;/a&gt; thanks to &lt;a href="https://github.com/lsroe"&gt;@lsroe&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix the wrong key format of custom fields for &lt;code&gt;Prometheus&lt;/code&gt; (&lt;a href="https://github.com/falcosecurity/falcosidekick/pull/1110"&gt;PR#1110&lt;/a&gt; thanks to &lt;a href="https://github.com/rubensf"&gt;@rubensf&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;You can find the full changelog &lt;a href="https://github.com/falcosecurity/falcosidekick/releases/tag/2.31.0"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The respective Helm charts are already updated and allow you to test by yourself all these great new features. Just issue the &lt;code&gt;helm repo update; helm upgrade --reuse-values -n falco&lt;/code&gt; command to do so.&lt;/p&gt;
&lt;p&gt;Once again, thanks to all the adopters and contributors who helped and contributed to this project all these years. We would never have reached this success without you.&lt;/p&gt;
&lt;hr&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/falcosidekick"&gt;Falcosidekick project on GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out the &lt;a href="https://docs.falco-talon.org"&gt;Falco Talon project docs&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: Falcosidekick 2.30.0</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-2-30-0/</link><pubDate>Wed, 04 Dec 2024 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-2-30-0/</guid><description>
&lt;p&gt;A few days after a new release of &lt;a href="https://falco.org/blog/falco-talon-v0-2-0/"&gt;Falco Talon&lt;/a&gt;, our response engine, it's time for our favorite proxy forwarder to do the same.&lt;/p&gt;
&lt;h2 id="new-outputs"&gt;New outputs&lt;/h2&gt;
&lt;p&gt;A new release means new integrations. Thanks to our contributors for their helps.&lt;/p&gt;
&lt;h3 id="webex"&gt;Webex&lt;/h3&gt;
&lt;p&gt;Notify your team on Webex with the integration developed by &lt;a href="https://github.com/k0rventen"&gt;@k0rventen&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="otlp-metrics"&gt;OTLP Metrics&lt;/h3&gt;
&lt;p&gt;The adoption of Open Telemetry is bigger and bigger in the Cloud Native ecosystem, &lt;a href="https://github.com/ekoops"&gt;@ekoops&lt;/a&gt; introduced the OTLP Metrics in Falcosidekick.&lt;/p&gt;
&lt;h3 id="datalog-logs"&gt;Datalog Logs&lt;/h3&gt;
&lt;p&gt;The Falco alerts can be forwarded to &lt;code&gt;Datadog&lt;/code&gt; as events for a while in Falcosidekick, you can now use their Logs service thanks to &lt;a href="https://github.com/yohboy"&gt;@yohboy&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="new-features"&gt;New features&lt;/h2&gt;
&lt;p&gt;Here's a non exhaustive list of the great features and enhancements which come with this new release:&lt;/p&gt;
&lt;h3 id="x3-throughput"&gt;x3 throughput&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/aleksmaus"&gt;@alekmaus&lt;/a&gt; spotted a bottleneck with the http client used to forward the events to the outputs. His fix increases up to 300% the throughput!!!&lt;/p&gt;
&lt;h3 id="better-integration-with-elasticsearch"&gt;Better integration with Elasticsearch&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/aleksmaus"&gt;@alekmaus&lt;/a&gt; worked hard to improve the integration with &lt;code&gt;Elasticsearch&lt;/code&gt;. In addition improvments for the clients, new settings have been introduced, like the possibility to specify an &lt;code&gt;ingest pipeline&lt;/code&gt; or an &lt;code&gt;api key&lt;/code&gt;, to enable &lt;code&gt;batching&lt;/code&gt; and &lt;code&gt;compression&lt;/code&gt;. See the &lt;a href="https://github.com/falcosecurity/falcosidekick/blob/master/docs/outputs/elasticsearch.md"&gt;docs&lt;/a&gt; to know them all.&lt;/p&gt;
&lt;h3 id="better-consistency-for-the-prometheus-metrics"&gt;Better consistency for the Prometheus metrics&lt;/h3&gt;
&lt;p&gt;Falco recently integrated a direct endpoint to expose metrics in the Prometheus format. After a lot of discussions between the maintainers and the community, a convention has been chosen for the names of the metrics. This release adapts the metrics exposed by Falcosidekick to follow this convention and have a consistency accross the different components of the ecosystem.&lt;/p&gt;
&lt;div class="card card-sm pageinfo pageinfo-warning my-4"&gt;
&lt;div class="card-body"&gt;
&lt;div class="card-text"&gt;
&lt;p&gt;Breaking changes: The renaming of the metrics might impact the queries for your alerts and dashboards.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="multi-hosts-for-alertmanager"&gt;Multi hosts for AlertManager&lt;/h3&gt;
&lt;p&gt;You can now specify a list of servers for the &lt;code&gt;AlertManager&lt;/code&gt; output, which is a requirement when it's deployed in HA mode.&lt;/p&gt;
&lt;h2 id="fixes"&gt;Fixes&lt;/h2&gt;
&lt;p&gt;The contributors fixed several bugs, here's a non exhaustive list of the more important ones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix &lt;code&gt;PolicyReports&lt;/code&gt; created in the same namespace than the previous event (&lt;a href="https://github.com/falcosecurity/falcosidekick/pull/978"&gt;PR#978&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix the missing &lt;code&gt;customFields/extraFields&lt;/code&gt; in the &lt;code&gt;Elasticsearch&lt;/code&gt; payload (&lt;a href="https://github.com/falcosecurity/falcosidekick/pull/1033"&gt;PR#1033&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix the incorrect key name for &lt;code&gt;CloudEvent&lt;/code&gt; spec attribute (&lt;a href="https://github.com/falcosecurity/falcosidekick/pull/1051"&gt;PR#1051&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;You can find the full changelog &lt;a href="https://github.com/falcosecurity/falcosidekick/releases/tag/2.30.0"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The respective Helm charts are already updated and allow you to test by yourself all these great new features. Just issue the &lt;code&gt;helm repo update; helm upgrade --reuse-values -n falco&lt;/code&gt; command to do so.&lt;/p&gt;
&lt;p&gt;Once again, thanks to all the adopters and contributors who helped and contributed to this project all these years. We would never have reached this success without you.&lt;/p&gt;
&lt;hr&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/falcosidekick"&gt;Falcosidekick project on GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out the &lt;a href="https://docs.falco-talon.org"&gt;Falco Talon project docs&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: Falcosidekick 2.29.0</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-2-29-0/</link><pubDate>Tue, 02 Jul 2024 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-2-29-0/</guid><description>
&lt;p&gt;Almost 1 year without a release of Falcosidekick, but version 2.29.0 is finally here. Thanks to all contributors for their patience, you made amazing contributions and we're happy to finally have them available for all users.&lt;/p&gt;
&lt;p&gt;Like for every releases, a small recap about its adoption. Falcosidekick continues to be adopted, even if the rate is not as high as before, but we're sure it will explode once again with this new fresh version.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falcosidekick-docker-pulls.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;Once more, Falcosidekick expands Falco's integrability with a lot of new outputs. That and the introduction of many new features has been possible thanks to the hard work of the community. You can find a comprehensive list of these in the &lt;a href="https://github.com/falcosecurity/falcosidekick/releases/tag/2.29.0"&gt;changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="new-outputs"&gt;New outputs&lt;/h2&gt;
&lt;p&gt;More and more systems are integrated as outputs in Falcosidekick, more and more often directly by the companies themselves and not their end users. It shows Falco and Falcosidekick are seen as major components in the security fields, and trusted as de facto standards.&lt;/p&gt;
&lt;h3 id="dynatrace"&gt;Dynatrace&lt;/h3&gt;
&lt;p&gt;Mario Kahlhofer, aka &lt;a href="https://github.com/@blu3r4y"&gt;@blu3r4y&lt;/a&gt;, from Dynatrace, integrated the well known observability and security platform he works for. You can even read his &lt;a href="https://www.dynatrace.com/news/blog/ttp-based-threat-hunting-solves-alert-noise/"&gt;blog post about&lt;/a&gt;, to discover how to correlate the Falco events with their APM agent events.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/dynatrace.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h3 id="sumologic"&gt;Sumologic&lt;/h3&gt;
&lt;p&gt;Carlo Mencarelli, aka &lt;a href="https://github.com/mencarellic"&gt;@mencarellic&lt;/a&gt;, did the exporter of the Falco events to &lt;a href="https://www.sumologic.com/"&gt;Sumologic&lt;/a&gt;, the SaaS platform for your logs.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/sumologic.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h3 id="otlp-traces"&gt;OTLP Traces&lt;/h3&gt;
&lt;p&gt;It started as an internal hackaton at &lt;a href="https://grafana.com/"&gt;Grafana Labs&lt;/a&gt; and became a real integration thanks to JuanJo Ciarlante (&lt;a href="https://github.com/jjo"&gt;@jjo&lt;/a&gt;). You can now export the Falco event as traces, to have an automatic correlation between the detected events.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
It works only for the syscall related events.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="images/otlp-traces.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h3 id="quickwit"&gt;Quickwit&lt;/h3&gt;
&lt;p&gt;After a demo of Falco at a CNCF Meetup, the &lt;a href="https://quickwit.io/"&gt;Quickwit&lt;/a&gt; team wanted to add their product as a new output for Falcosidekick, and they did it. You can now easily index your Falco events in their search engine thanks to the work of Idriss Neumann (&lt;a href="https://github.com/idrissneumann"&gt;@idrissneumann&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img src="images/quickwit.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h3 id="falco-talon"&gt;Falco Talon&lt;/h3&gt;
&lt;p&gt;New born in the Falco ecosystem, trying to complete the last missing piece: the reaction. You can now forward the Falco events to &lt;a href="https://docs.falco-talon.org"&gt;Falco Talon&lt;/a&gt;, a tailor made no-code response engine for Falco. The project is still in alpha stage, but moves quickly. Stay tuned.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falco-talon.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h2 id="new-features"&gt;New features&lt;/h2&gt;
&lt;p&gt;Aside from new outputs, we introduced very important and useful new features. Let's do a recap of them.&lt;/p&gt;
&lt;h3 id="revamp-of-the-policy-report-output"&gt;Revamp of the Policy Report output&lt;/h3&gt;
&lt;p&gt;The Policy Report feature in Kubernetes evolved since its integration in Falcosidekick, it was the time to do some clean up. The report now contains more information, and their displays in the &lt;a href="https://github.com/kyverno/policy-reporter/tree/main?tab=readme-ov-file#policy-reporter-ui"&gt;Policy Reporter UI&lt;/a&gt; is better.&lt;/p&gt;
&lt;h3 id="new-outputfieldformat-setting"&gt;New outputFieldFormat setting&lt;/h3&gt;
&lt;p&gt;Some systems perform deduplication of the events, for example the on-call platforms. They use the content of the &lt;code&gt;output&lt;/code&gt; to do so, but the current format starting with a timestamp prevents the process to run as expected. A new setting &lt;code&gt;outputFieldFormat&lt;/code&gt; is now available allows to &amp;quot;format&amp;quot; the &lt;code&gt;output&lt;/code&gt; field of the Falco payload before forwarding it to the outputs.&lt;/p&gt;
&lt;p&gt;The default format received from Falco is : &lt;code&gt;&amp;lt;timestamp&amp;gt;: &amp;lt;priority&amp;gt; &amp;lt;output&amp;gt;&lt;/code&gt; which corresponds to this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;14:37:27.505989596: Warning Detected ptrace PTRACE_ATTACH attempt (proc_pcmdline=%proc.pcmdline evt_type=%evt.type user=%user.name user_uid=%user.uid user_loginuid=%user.loginuid process=%proc.name proc_exepath=%proc.exepath parent=%proc.pname command=%proc.cmdline terminal=%proc.tty exe_flags=%evt.arg.flags %container.info)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;By removing the &lt;code&gt;&amp;lt;timestamp&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;priority&amp;gt;&lt;/code&gt;, you get:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Detected ptrace PTRACE_ATTACH attempt (proc_pcmdline=%proc.pcmdline evt_type=%evt.type user=%user.name user_uid=%user.uid user_loginuid=%user.loginuid process=%proc.name proc_exepath=%proc.exepath parent=%proc.pname command=%proc.cmdline terminal=%proc.tty exe_flags=%evt.arg.flags %container.info)
&lt;/code&gt;&lt;/pre&gt;&lt;div class="card card-sm pageinfo pageinfo-info my-4"&gt;
&lt;div class="card-body"&gt;
&lt;div class="card-text"&gt;
&lt;p&gt;If you use the settings &lt;code&gt;customFields&lt;/code&gt; and &lt;code&gt;templatedFields&lt;/code&gt; of Falcosidekick to inject new elements in the &lt;code&gt;output_fields&lt;/code&gt;, it's also possible to have them in the &lt;code&gt;output&lt;/code&gt; with the tokens &lt;code&gt;&amp;lt;custom_fields&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;templated_fields&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="alternative-endpoints-for-aws-s3"&gt;Alternative endpoints for AWS S3&lt;/h3&gt;
&lt;p&gt;Some projects like &lt;a href="https://min.io/"&gt;Minio&lt;/a&gt; are S3-compliant, you can now use them as target for the &lt;code&gt;AWS S3&lt;/code&gt; output by changing the endpoint to use. Thanks to &lt;a href="https://github.com/gysel"&gt;@gysel&lt;/a&gt; for this feature.&lt;/p&gt;
&lt;h3 id="split-of-the-docs"&gt;Split of the docs&lt;/h3&gt;
&lt;p&gt;The main README of the project became really huge over the years, with all those available outputs. We did a big refactor and you can now find one file per output, with more details about the configuration, the default values and some tips. The docs are &lt;a href="https://github.com/falcosecurity/falcosidekick/tree/master/docs/outputs"&gt;here&lt;/a&gt;, and any help is welcome to make them even better.&lt;/p&gt;
&lt;h2 id="fixes"&gt;Fixes&lt;/h2&gt;
&lt;p&gt;The contributors fixed several bugs, here's a non exhaustive list of the more important ones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix missing root CA for the &lt;code&gt;Kafka&lt;/code&gt; output (thanks to &lt;a href="https://github.com/claviola"&gt;@claviola&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix bug with the extension &lt;code&gt;source&lt;/code&gt; in the &lt;code&gt;CloudEvent&lt;/code&gt; output&lt;/li&gt;
&lt;li&gt;Fix panics in the &lt;code&gt;Prometheus&lt;/code&gt; output when &lt;code&gt;hostname&lt;/code&gt; field is missing&lt;/li&gt;
&lt;li&gt;Fix locks in the &lt;code&gt;Loki&lt;/code&gt; output (thanks to &lt;a href="https://github.com/bsod90"&gt;@bsod90&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix mTLS client verification failures due to missing ClientCAs (thanks to &lt;a href="https://github.com/jgmartinez"&gt;@jgmartinez&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix wrong env vars for pagerduty output&lt;/li&gt;
&lt;li&gt;Remove hard settings for usernames in &lt;code&gt;Mattermost&lt;/code&gt; and &lt;code&gt;Rocketchat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Fix multi lines json in the error lines (thanks to &lt;a href="https://github.com/idrissneumann"&gt;@idrissneumann&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fix duplicated custom headers in clients&lt;/li&gt;
&lt;li&gt;Fix the labels for the &lt;code&gt;AlertManager&lt;/code&gt; output (thanks to &lt;a href="https://github.com/Umaaz"&gt;@Umaaz&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;You can find the full changelog &lt;a href="https://github.com/falcosecurity/falcosidekick/releases/tag/2.29.0"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The respective Helm charts are already updated and allow you to test by yourself all these great new features. Just issue the &lt;code&gt;helm repo update; helm upgrade --reuse-values -n falco&lt;/code&gt; command to do so.&lt;/p&gt;
&lt;p&gt;Once again, thanks to all the adopters and contributors who helped and contributed to this project all these years. We would never have reached this success without you.&lt;/p&gt;
&lt;hr&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/falcosidekick"&gt;Falcosidekick project on GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out the &lt;a href="https://docs.falco-talon.org"&gt;Falco Talon project docs&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: Falcosidekick 2.28.0</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-2-28-0/</link><pubDate>Fri, 28 Jul 2023 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-2-28-0/</guid><description>
&lt;p&gt;It's summertime, it's hot, and many people are on vacation, but the Falco community is still there. Six months after the release of Falcosidekick's latest upgrade, version 2.28.0 becomes officially available.&lt;/p&gt;
&lt;p&gt;The number of pulls of the official Falcosidekick image from Docker Hub has also just reached 15M, which we consider mind-blowing. It took it 3 years to reach the first 5M pulls and now it's needed less than six months to do it again. Awesome!&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falcosidekick-docker-pulls.png" alt="" loading="lazy" /&gt;
&lt;img src="images/falcosidekick-docker-pulls-last-year.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;Once more, Falcosidekick expands Falco's integrability with a lot of new outputs. That and the introduction of many new features has been possible thanks to the hard work of the community. You can find a comprehensive list of these in the &lt;a href="https://github.com/falcosecurity/falcosidekick/releases/tag/2.28.0"&gt;changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="new-outputs"&gt;New outputs&lt;/h2&gt;
&lt;p&gt;With every new release, the number of integrations of Falcosidekick increases. We have reached the number of 58 available outputs already, and we hope the threshold of 60 will be left behind very soon.&lt;/p&gt;
&lt;h3 id="redis"&gt;Redis&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://redis.com"&gt;Redis&lt;/a&gt; is a well-known in-memory database with many years of adoption on its path. It is now possible for Falcosidekick to use it as an output destination, thanks to the contributions of &lt;a href="https://github.com/pandyamarut"&gt;pandyamarut&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="telegram"&gt;Telegram&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://telegram.org/"&gt;Telegram&lt;/a&gt;, the instant messaging platform, is becoming more and more used by companies for notifications, and thanks to &lt;a href="https://github.com/zufardhiyaulhaq"&gt;zufardhiyaulhaq&lt;/a&gt;, it can receive Falco alerts too.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falcosidekick-telegram.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h3 id="n8n"&gt;N8N&lt;/h3&gt;
&lt;p&gt;Do you want to extend the possibilities or just avoid developing a script to react to Falco events? Here comes &lt;a href="https://n8n.io/"&gt;n8n&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falcosidekick-n8n.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h3 id="grafana-oncall"&gt;Grafana OnCall&lt;/h3&gt;
&lt;p&gt;At the last KubeCon, we met with some of the Grafana maintainers. We discussed the integration of Falco using Falcosidekick within the OnCall project. It's done now.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falcosidekick-grafana-oncall.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h3 id="openobserve"&gt;OpenObserve&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://openobserve.ai/"&gt;OpenObserve&lt;/a&gt; is a young but promising full stack observability platform.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falcosidekick-openobserve.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h2 id="new-features"&gt;New features&lt;/h2&gt;
&lt;p&gt;Aside from new outputs, we introduced very important and useful new features. Let's do a recap of them.&lt;/p&gt;
&lt;h3 id="use-different-methods-for-the-webhook-output"&gt;Use different methods for the Webhook output&lt;/h3&gt;
&lt;p&gt;Since its implementation, the Webhook output has only used the HTTP method &lt;code&gt;POST&lt;/code&gt;. Now, you can choose between the &lt;code&gt;POST&lt;/code&gt; and &lt;code&gt;PUT&lt;/code&gt; methods to send your data, extending the catalog of possible REST APIs to use it 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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;webhook&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;method&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;# HTTP method: POST or PUT (default: POST)&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;h3 id="replace-the-brackets-in-the-payload"&gt;Replace the brackets in the payload&lt;/h3&gt;
&lt;p&gt;Some Falco fields refer to lists and reflect that their keys contain brackets, like &lt;code&gt;proc.args[0]&lt;/code&gt;, &lt;code&gt;proc.args[1]&lt;/code&gt;, etc. Unfortunately, some outputs may refuse payloads with brackets in keys. For this reason, we introduced the possibility of replacing them with any other chosen character:&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;bracketreplacer&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:#080;font-style:italic"&gt;# if not empty, the brackets in keys of Output Fields are replaced&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;h3 id="set-custom-headers-for-loki-elasticsearch-and-grafana-outputs"&gt;Set custom headers for Loki, Elasticsearch and Grafana outputs&lt;/h3&gt;
&lt;p&gt;If you want to protect your private instances of &lt;code&gt;Loki&lt;/code&gt;, &lt;code&gt;Grafana&lt;/code&gt;, or &lt;code&gt;Elasticsearch&lt;/code&gt; you may need to specify custom headers. This new feature allows you to do so.&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;elasticsearch&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;customHeaders&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Custom headers to add in POST. Useful for Authentication&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;key&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;value&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;h3 id="match-the-priority-with-the-severity-for-the-alertmanager-output"&gt;Match the priority with the severity for the AlertManager output&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;AlertManager&lt;/code&gt; is a pretty common software at companies also using &lt;code&gt;Prometheus&lt;/code&gt;. Until now, the mapping between the Priority of Falco events and the Severity of AlertManager was already predefined. You can now define it depending on your needs thanks to &lt;a href="https://github.com/Lowaiz"&gt;Lowaiz&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;alertmanager&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;customseveritymap&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:#080;font-style:italic"&gt;# comma separated list of tuple composed of a &amp;#39;:&amp;#39; separated Falco priority and Alertmanager severity that is used to override the severity label associated to the priority level of falco event. Example: debug:value_1,critical:value2. Default mapping: emergency:critical,alert:critical,critical:critical,error:warning,warning:warning,notice:information,informational:information,debug:information. (default: &amp;#34;&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;h3 id="set-thresholds-for-the-dropped-events-for-the-alertmanager-output"&gt;Set thresholds for the dropped events for the AlertManager output&lt;/h3&gt;
&lt;p&gt;Another contribution from &lt;a href="https://github.com/Lowaiz"&gt;Lowaiz&lt;/a&gt;: You can now configure a set of thresholds to start dropping the events.&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;alertmanager&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;# dropeventdefaultpriority: &amp;#34;&amp;#34; # default priority of dropped events, values are emergency|alert|critical|error|warning|notice|informational|debug (default: &amp;#34;critical&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;dropeventthresholds: # comma separated list of priority re-evaluation thresholds of dropped events composed of a &amp;#39;:&amp;#39; separated integer threshold and string priority. Example: `10000:critical, 100:warning, 1:informational` (default&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;`&amp;#34;10000:critical, 1000:critical, 100:critical, 10:warning, 1:warning&amp;#34;`)&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;h3 id="better-integration-with-timescaledb"&gt;Better integration with TimescaleDB&lt;/h3&gt;
&lt;p&gt;We thank &lt;a href="https://github.com/hileef"&gt;hileef&lt;/a&gt; for improving the integration with &lt;code&gt;TimescaleDB&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="user-rolearn-and-externalid-for-the-aws-outputs"&gt;User roleARN and externalID for the AWS outputs&lt;/h3&gt;
&lt;p&gt;Under some situations, you may want Falcosidekick to assume a role, possibly from another account. You can do it with the new pair of settings &lt;code&gt;rolearn&lt;/code&gt; and &lt;code&gt;externalid&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;aws&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;rolearn&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:#080;font-style:italic"&gt;# aws role to assume (optional if you use EC2 Instance Profile)&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;externalid&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:#080;font-style:italic"&gt;# external id for the role to assume (optional if you use EC2 Instance Profile)&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;h3 id="set-the-region-for-the-pagerduty-output"&gt;Set the region for the PagerDuty output&lt;/h3&gt;
&lt;p&gt;Falcosidekick allows you to select between one of the two different regions' &lt;code&gt;PagerDuty&lt;/code&gt; offers 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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;pagerduty&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;region&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;us&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Pagerduty Region, can be &amp;#39;us&amp;#39; or &amp;#39;eu&amp;#39; (default: us)&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;h3 id="allow-tls-for-the-smtp-output"&gt;Allow TLS for the SMTP output&lt;/h3&gt;
&lt;p&gt;It is now possible to communicate with an &lt;code&gt;SMTP&lt;/code&gt; server using TLS.&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;smtp&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;tls: false # Use TLS connection (true/false). Default&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="set-attributes-to-gcp-pubsub-messages"&gt;Set attributes to GCP PubSUb messages&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;GCP PubSub&lt;/code&gt; accepts attributes in its messages. You can specify yours, thanks to &lt;a href="https://github.com/annadorottya"&gt;annadorottya&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;gcp&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;customAttributes&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;# Custom attributes to add to the Pub/Sub messages&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;key&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;value&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;h3 id="more-options-for-tls-and-mtls"&gt;More options for TLS and mTLS&lt;/h3&gt;
&lt;p&gt;These are the most relevant changes of this release. To improve security, Falcosidekick can now listen using HTTPS with TLS. You can also be more specific with the keys and certificates for the mTLS for the outputs.&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;mutualtlsfilespath&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;/etc/certs&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;# folder which will used to store client.crt, client.key and ca.crt files for mutual tls for outputs, will be deprecated in the future (default: &amp;#34;/etc/certs&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:#080;font-style:italic"&gt;# certfile: &amp;#34;/etc/certs/client/client.crt&amp;#34; # client certification file&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;keyfile&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;/etc/certs/client/client.key&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;# client key&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;cacertfile&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;/etc/certs/client/ca.crt&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;# for server certification&lt;/span&gt;&lt;span style="color:#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;tlsserver&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;# certfile: &amp;#34;/etc/certs/server/server.crt&amp;#34; # server certification file&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;keyfile&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;/etc/certs/server/server.key&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;# server key&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;div class="card card-sm pageinfo pageinfo-warning my-4"&gt;
&lt;div class="card-body"&gt;
&lt;div class="card-text"&gt;
&lt;p&gt;The &lt;code&gt;mutualtlsfilespath&lt;/code&gt; setting is kept for now for backward compatibility but it will be remove in future&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In some edge cases, you may need some endpoints to listen in HTTP only. You can specifically define them together with the associated port:&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;tlsserver&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;notlsport: 2810 # port to serve http server serving selected endpoints (default&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;2810&lt;/span&gt;)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;notlspaths&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;# if not empty, a separate http server will be deployed for the specified endpoints&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;/metrics&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;/healthz&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;Thanks to &lt;a href="https://github.com/annadorottya"&gt;annadorottya&lt;/a&gt; for her impressive work on this functionality.&lt;/p&gt;
&lt;h3 id="autocreate-the-topic-for-the-kafka-output"&gt;Autocreate the topic for the Kafka output&lt;/h3&gt;
&lt;p&gt;When Falcosidekick doesn't detect the topic, it can create it automatically. This feature is not enabled by default.&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;kafka&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;topiccreation: false # auto create the topic if it doesn&amp;#39;t exist (default&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;false&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;h3 id="support-multiple-bootstrap-servers-and-tls-for-the-kafka-output"&gt;Support multiple bootstrap servers and TLS for the Kafka output&lt;/h3&gt;
&lt;p&gt;To get better resiliency, you can now specify several bootstrap servers and even communicate with them with TLS, thanks to &lt;a href="https://github.com/ibice"&gt;ibice&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;kafka&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;tls: false # Use TLS for the connections (default&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;false&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;h2 id="fixes"&gt;Fixes&lt;/h2&gt;
&lt;p&gt;We're not going to go into detail about all the corrections made in this version - you can find the full list &lt;a href="https://github.com/falcosecurity/falcosidekick/releases/tag/2.28.0"&gt;here&lt;/a&gt;.
Thanks to everyone who reported issues and to those who have corrected them.&lt;/p&gt;
&lt;p&gt;The most important have been:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix breaking brackets in &lt;code&gt;AWS SNS&lt;/code&gt; messages.&lt;/li&gt;
&lt;li&gt;Fix setting name for the table of &lt;code&gt;TimescaleDB&lt;/code&gt; output (thanks to &lt;a href="https://github.com/alika"&gt;alika&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Fix the cardinality issue with &lt;code&gt;Prometheus&lt;/code&gt; labels.&lt;/li&gt;
&lt;li&gt;Fix panic when asserting output fields that are &lt;code&gt;nil&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Fix URL generation for &lt;code&gt;Spyderbat&lt;/code&gt; output (thanks to &lt;a href="https://github.com/bc-sb"&gt;bc-sb&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Fix &lt;code&gt;nil&lt;/code&gt; values in &lt;code&gt;Spyderbat&lt;/code&gt; output (thanks to &lt;a href="https://github.com/spider-guy"&gt;spider-guy&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Fix duplicated headers in &lt;code&gt;SMTP&lt;/code&gt; output (thanks to &lt;a href="https://github.com/apsega"&gt;apsega&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The respective Helm charts are also updated and allow you to test for yourself all these great new features. Just issue the &lt;code&gt;helm repo update; helm upgrade --reuse-values -n falco&lt;/code&gt; command to do so.&lt;/p&gt;
&lt;p&gt;Falcosidekick is now mentioned in the official &lt;a href="https://v0-43--falcosecurity.netlify.app/docs/outputs/forwarding/"&gt;Falco docs&lt;/a&gt;. It's a shy beginning, but more details will come shortly.&lt;/p&gt;
&lt;p&gt;Once again, thanks to all the adopters and contributors who helped and contributed to this project all these years. We would never have reached this success without you.&lt;/p&gt;
&lt;hr&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/falcosidekick"&gt;Falcosidekick project on GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out the &lt;a href="https://github.com/falcosecurity/falcosidekick-ui"&gt;Falcosidekick UI project on 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: Falcosidekick 2.27.0 and Falcosidekick-UI 2.1.0</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-2-27-0-ui-2-1-0/</link><pubDate>Tue, 10 Jan 2023 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-2-27-0-ui-2-1-0/</guid><description>
&lt;p&gt;So many good things happened for Falcosidekick and Falcosidekick UI this year. It's still incredible these projects became so beloved and useful for the community. To all contributors, promotors and users, a big big thank you.&lt;/p&gt;
&lt;p&gt;The new year is there, it's time to release new versions and reach 10 million Docker pulls for Falcosidekick.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falcosidekick-docker-pulls.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h2 id="falcosidekick-v2-27-0"&gt;Falcosidekick v2.27.0&lt;/h2&gt;
&lt;p&gt;What a huge release! Never has a previous release gotten so many new features and outputs. You can read the full changelog &lt;a href="https://github.com/falcosecurity/falcosidekick/releases/tag/2.27.0"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="new-outputs"&gt;New outputs&lt;/h3&gt;
&lt;p&gt;This release brings a lot of new outputs thanks to our amazing contributors. &lt;a href="https://github.com/falcosecurity/falcosidekick/graphs/contributors"&gt;Here&lt;/a&gt; you have a list of them.&lt;/p&gt;
&lt;h5 id="yandex-data-stream"&gt;Yandex Data Stream&lt;/h5&gt;
&lt;p&gt;&lt;a href="https://yandex.com"&gt;Yandex&lt;/a&gt; is a Russian cloud provider that provides various services such as &lt;a href="https://cloud.yandex.com/en/docs/data-streams/"&gt;Data Streams&lt;/a&gt;. With this new output, we can connect Falco to one more cloud providers. Thank you, &lt;a href="https://github.com/preved911"&gt;preved911&lt;/a&gt;.&lt;/p&gt;
&lt;h5 id="mqtt-and-node-red"&gt;MQTT and Node-Red&lt;/h5&gt;
&lt;p&gt;IoT is a whole new world for Falco. With these 2 new outputs, Falco can make its first steps in this ecosystem and we are sure more will come in 2023. Stay tuned.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falcosidekick-node-red.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h5 id="zincsearch"&gt;Zincsearch&lt;/h5&gt;
&lt;p&gt;Do you want a full-text indexer lighter than Elasticsearch? Take a look at &lt;a href="https://zincsearch.com/"&gt;Zincsearch&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falcosidekick-zincsearch.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h5 id="gotify"&gt;Gotify&lt;/h5&gt;
&lt;p&gt;By using &lt;a href="https://gotify.net"&gt;Gotify&lt;/a&gt; and the new dedicated output, you can now push Falco events to your Android phone.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falcosidekick-gotify.jpg" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h5 id="spyderbat"&gt;Spyderbat&lt;/h5&gt;
&lt;p&gt;Are you a user of &lt;a href="https://www.spyderbat.com"&gt;Spyderbat&lt;/a&gt; and want to extend its sources of events? Now you can thank &lt;a href="https://github.com/spyder-kyle"&gt;spyder-kyle&lt;/a&gt;.&lt;/p&gt;
&lt;h5 id="tekton"&gt;Tekton&lt;/h5&gt;
&lt;p&gt;Do you remember the blog post &lt;a href="https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-response-engine-part-4-tekton/"&gt;&lt;em&gt;how to create a Response Engine for Falco&lt;/em&gt;&lt;/a&gt; with &lt;a href="https://tekton.dev/"&gt;Tekton&lt;/a&gt;? The proposed solution used the generic Webhook output. From now on, Tekton can use a dedicated one.&lt;/p&gt;
&lt;h5 id="timescaledb"&gt;TimescaleDB&lt;/h5&gt;
&lt;p&gt;&lt;a href="https://github.com/timescale/timescaledb"&gt;TimescaleDB&lt;/a&gt; is an OSS database made for time-series data, thanks to &lt;a href="https://github.com/jagretti"&gt;jagretti&lt;/a&gt; Falcosidekick can insert into it the Falco events.&lt;/p&gt;
&lt;h5 id="aws-security-lake"&gt;AWS Security Lake&lt;/h5&gt;
&lt;p&gt;At re:Invent 2023, AWS announced a new data lake made for security data: AWS Security Lake. We worked with AWS teams to have Falco as a source partner from day one, making it the first OSS project that can be used with that service and strengthening once more the integration with the AWS ecosystem.&lt;/p&gt;
&lt;h3 id="new-features"&gt;New features&lt;/h3&gt;
&lt;p&gt;The list of new outputs is already quite long, but the list of enhancements is even longer. The full list is &lt;a href="https://github.com/falcosecurity/falcosidekick/blob/master/CHANGELOG.md"&gt;here&lt;/a&gt;, but let's have a look at the major changes.&lt;/p&gt;
&lt;h5 id="sasl-auth-mechanisms-for-smtp-and-kafka-outputs"&gt;SASL auth mechanisms for SMTP and Kafka outputs&lt;/h5&gt;
&lt;p&gt;Improving security is our duty to all, and one key element is the authentication method. Thanks to &lt;a href="https://github.com/Lowaiz"&gt;Lowaiz&lt;/a&gt;, both SMTP and Kafka outputs can now use the benefits of SASL Auth mechanisms.&lt;/p&gt;
&lt;h5 id="environment-variables-for-custom-labels-and-templated-labels"&gt;Environment variables for custom labels and templated labels&lt;/h5&gt;
&lt;p&gt;The ability to inject custom fields in the payloads is an important feature of Falcosidekick. The only drawback was these fields were previously static. That limitation is over. Now, you can use environment variables in your custom fields. A new kind of custom fields has become available: `templated fields.' They allow the reuse of the present fields to generate new ones following with &lt;a href="https://pkg.go.dev/text/template"&gt;Go template&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;templatedfields&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;# templated fields are added to falco events and metrics, it uses Go template + output_fields values&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;Dkey&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;{{ or (index . &amp;#34;k8s.ns.labels.foo&amp;#34;) &amp;#34;bar&amp;#34; }}&amp;#39;&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;h5 id="hostname-field"&gt;Hostname field&lt;/h5&gt;
&lt;p&gt;Since Falco 0.33, a new field is present in Falco events: &lt;code&gt;hostname&lt;/code&gt;. Falcosidekick and all its current outputs are up to date and ready for it. Once again, thanks to &lt;a href="https://github.com/Lowaiz"&gt;Lowaiz&lt;/a&gt;.&lt;/p&gt;
&lt;h5 id="loki-format-and-grafana-cloud"&gt;Loki format and Grafana Cloud&lt;/h5&gt;
&lt;p&gt;The Loki format has been upgraded and credentials can be set. It allows you to use &lt;a href="https://grafana.com/products/cloud/"&gt;Grafana Cloud&lt;/a&gt; as a target.&lt;/p&gt;
&lt;h5 id="k8s-policy-reports-are-binded-to-the-namespaces"&gt;K8S Policy Reports are binded to the namespaces&lt;/h5&gt;
&lt;p&gt;Policy Reports in K8S are still prototypes but Falcosidekick is already able to create them. Some improvements have been made to determine the target resource and the report is now created in the same namespace as the source pod.&lt;/p&gt;
&lt;h5 id="more-headers-in-smtp-payload"&gt;More headers in SMTP payload&lt;/h5&gt;
&lt;p&gt;To avoid being flagged as spam by some anti-spam systems, some headers like &lt;code&gt;From&lt;/code&gt;, &lt;code&gt;To&lt;/code&gt; and &lt;code&gt;Date&lt;/code&gt; have been added to the emails created by Falcosidekick.&lt;/p&gt;
&lt;h5 id="cef-format-syslog"&gt;CEF format Syslog&lt;/h5&gt;
&lt;p&gt;For the Syslog output, you can choose between &lt;code&gt;json&lt;/code&gt; and &lt;code&gt;CEF&lt;/code&gt; as formats. It makes easier the integration with some services like &lt;a href="https://azure.microsoft.com/en-us/products/microsoft-sentinel/#overview"&gt;Microsoft Sentinel&lt;/a&gt; or &lt;a href="https://www.splunk.com/"&gt;Splunk&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="fixes"&gt;Fixes&lt;/h3&gt;
&lt;p&gt;Even if we do our best to avoid them, the community has lately faced some bugs that we have fixed in this release.&lt;/p&gt;
&lt;p&gt;The most important one was a race condition when headers were added to the POST requests. Adopters with high rates of requests were occasionally facing authentication failures or missing headers. &lt;a href="https://github.com/bc-sb"&gt;bc-sb&lt;/a&gt; solved this with a temporary solution, but we'll improve it in the future (Falcosidekick v3? Who knows...).&lt;/p&gt;
&lt;h2 id="falcosidekick-ui-v2-1-0"&gt;Falcosidekick UI v2.1.0&lt;/h2&gt;
&lt;p&gt;The new features for Falcosidekick UI, although lower in number, are still big improvements. The full changelog is &lt;a href="https://github.com/falcosecurity/falcosidekick-ui/releases/tag/v2.1.0"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="env-vars-for-settings"&gt;Env vars for settings&lt;/h3&gt;
&lt;p&gt;All settings to configure Falcosidekick UI can be passed as either CLI arguments or as env vars. Run &lt;code&gt;falcosidekick-ui --help&lt;/code&gt; for more details.&lt;/p&gt;
&lt;h3 id="new-logs"&gt;New logs&lt;/h3&gt;
&lt;p&gt;The logs were too verbose for production contexts. Now it's configurable via a log-level option:&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;-l string
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Log level: &lt;span style="color:#b44"&gt;&amp;#34;debug&amp;#34;&lt;/span&gt;, &lt;span style="color:#b44"&gt;&amp;#34;info&amp;#34;&lt;/span&gt;, &lt;span style="color:#b44"&gt;&amp;#34;warning&amp;#34;&lt;/span&gt;, &lt;span style="color:#b44"&gt;&amp;#34;error&amp;#34;&lt;/span&gt; &lt;span style="color:#666"&gt;(&lt;/span&gt;default &lt;span style="color:#b44"&gt;&amp;#34;info&amp;#34;&lt;/span&gt;, environment &lt;span style="color:#b44"&gt;&amp;#34;FALCOSIDEKICK_UI_LOGLEVEL&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;h3 id="auto-refresh"&gt;Auto refresh&lt;/h3&gt;
&lt;p&gt;Long-term adopters may remember the dashboard in Falcosidekick UI v1 was auto-refreshed. This feature is back, for all widgets, independently of the page.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falcosidekick-ui-autorefresh.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h3 id="authentication"&gt;Authentication&lt;/h3&gt;
&lt;p&gt;This is a major new feature. The interface is now protected by the Basic Auth method. More methods will be added in the future:&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falcosidekick-ui-login.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;Set the &lt;code&gt;FALCOSIDEKICK_UI_USER&lt;/code&gt; env var to define the credentials.&lt;/p&gt;
&lt;h3 id="info-page"&gt;Info page&lt;/h3&gt;
&lt;p&gt;The info page has been rewritten for a nicer look &amp;amp; feel.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falcosidekick-ui-info.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h3 id="hostname"&gt;Hostname&lt;/h3&gt;
&lt;p&gt;As for Falcosidekick, Falcosidekick UI supports the display of the new &lt;code&gt;hostname&lt;/code&gt; field.&lt;/p&gt;
&lt;p&gt;&lt;img src="images/falcosidekick-ui-hostnames.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h3 id="ttl-for-keys"&gt;TTL for keys&lt;/h3&gt;
&lt;p&gt;Falcosidekick UI can store a huge amount of events, leading to filling the disk of the Redis database. A &lt;code&gt;TTL&lt;/code&gt; for the entries can be set to avoid this situation.&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;-t int
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TTL &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt; keys &lt;span style="color:#666"&gt;(&lt;/span&gt;default &lt;span style="color:#b44"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;, environment &lt;span style="color:#b44"&gt;&amp;#34;FALCOSIDEKICK_UI_TTL&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;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The respective Helm charts are already updated to allow you to test on your own all these great new features. Run a &lt;code&gt;helm upgrade --reuse-values -n falco&lt;/code&gt; to do so.&lt;/p&gt;
&lt;p&gt;Once again, thanks to all adopters and contributors who helped and contributed for years to create pieces of software useful to everybody. We hope 2023 will be amazing for Falco and its ecosystem.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;As usual, if you have any feedback or need help, you can find us at any of the following locations.&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/falcosidekick"&gt;Falcosidekick project on GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out the &lt;a href="https://github.com/falcosecurity/falcosidekick-ui"&gt;Falcosidekick UI project on 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: Falcosidekick 2.25.0 and Falcosidekick 2.0.0</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-2-25-0-falco-2-0-0/</link><pubDate>Wed, 01 Jun 2022 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-2-25-0-falco-2-0-0/</guid><description>
&lt;p&gt;A few days ago was the KubeCon EU in Valencia, Spain. The moment to meet contributors who made what Falcosidekick is now was a really enjoyable time and I hope we'll do it again in the future. One week before, two new major versions of Falcosidekick and Falcosidekick-Ui were released. Let's see what's new.&lt;/p&gt;
&lt;h1 id="falcosidekick"&gt;Falcosidekick&lt;/h1&gt;
&lt;p&gt;Almost 10 months without a new release for Falcosidekick, the version &lt;a href="https://github.com/falcosecurity/falcosidekick/releases/tag/2.25.0"&gt;2.25.0&lt;/a&gt;, and what a huge release is. For curious people, the full changelog can be found &lt;a href="https://github.com/falcosecurity/falcosidekick/releases/tag/2.25.0"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="new-outputs"&gt;New outputs&lt;/h2&gt;
&lt;p&gt;Each new release brings more outputs, thanks to the community. Here's the list of new ones:&lt;/p&gt;
&lt;h3 id="policy-report"&gt;Policy Report&lt;/h3&gt;
&lt;p&gt;With some CRD, you can now create reports in your Kubernetes clusters, the feature is often used for Security or Compliance, but anything is technically possible. For more details about how to use this output, read the documentation from &lt;a href="https://github.com/anushkamittal20"&gt;@anushkamittal20&lt;/a&gt; who implemented it for her project for &lt;a href="https://lfxms22.sched.com/event/tRXy/understanding-falco-and-policy-report-output-for-falcosidekick-anushka-mittal-nirmata-india"&gt;Linux Foundation Mentorship Program&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;apiVersion&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;wgpolicyk8s.io/v1alpha2&lt;span style="color:#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;ClusterPolicyReport&lt;span style="color:#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;creationTimestamp&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;2022-05-23T13:57:40Z&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;generation&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;110&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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-cluster-policy-report-4c9eac68&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;resourceVersion&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;71090&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;uid&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;ed8f0659-74d5-488c-90f8-d7b0622738cf&lt;span style="color:#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;results&lt;/span&gt;:&lt;span style="color:#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;category&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;SI - System and Information Integrity&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;message&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;Cluster Role Binding to cluster-admin role (user=%ka.user.name subject=%ka.req.binding.subjects)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;policy&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;Attach to cluster-admin 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;properties&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;ka.req.binding&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;%ka.req.binding&amp;#39;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;ka.user.name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;%ka.user.name&amp;#39;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;result&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;fail&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;severity&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;high&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;timestamp&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;nanos&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;98821031&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;seconds&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;40&lt;/span&gt;&lt;span style="color:#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;category&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;SI - System and Information Integrity&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;message&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;Created Role/ClusterRole with write privileges (user=%ka.user.name role=%ka.target.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;rules=%ka.req.role.rules)&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;policy&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;ClusterRole With Write Privileges Created&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;properties&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;ka.req.role&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;%ka.req.role&amp;#39;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;ka.target.name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;%ka.target.name&amp;#39;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;ka.user.name&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;%ka.user.name&amp;#39;&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;result&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;fail&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;severity&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;high&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;timestamp&lt;/span&gt;:&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;nanos&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;103148849&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&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;seconds&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;42&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 reports can also be displayed with &lt;a href="https://github.com/kyverno/policy-reporter-ui"&gt;Policy Reporter UI&lt;/a&gt;, created by &lt;a href="https://github.com/fjogeleit"&gt;@fjogeleit&lt;/a&gt; another member of the Falco community.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/img/falcosidekick-2-25-0-policy-reporter-ui.png" alt="policy-reporter-ui" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h3 id="syslog"&gt;Syslog&lt;/h3&gt;
&lt;p&gt;Years after its creation, Syslog remains a solid solution for managing the log files, especially if you're running Falcosidekick or else directly at the host level. With this new version, a Syslog server can be directly used as the target for the events, allowing you to send them in a secure place. Thanks to &lt;a href="https://github.com/bdluca"&gt;@bdluca&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="aws-kinesis"&gt;AWS Kinesis&lt;/h3&gt;
&lt;p&gt;Do you want to ingest thousands of events from Falco and be able to run data analysis on them? You can do so smoothly with the new AWS Kinesis output, bringing a new integration of Falco with AWS Ecosystem. We would be delighted to know any use case with analytics the community could create now. Thanks to &lt;a href="https://github.com/gauravgahlot"&gt;@gauravgahlot&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="zoho-cliq"&gt;Zoho Cliq&lt;/h3&gt;
&lt;p&gt;Your DevOps/SRE/SecOps team uses &lt;a href="https://www.zoho.com/cliq/"&gt;Zoho Cliq&lt;/a&gt; for their communication? Allow them to receive nice notifications with this new output for Falcosidekick. Thanks to &lt;a href="https://github.com/averni"&gt;@averni&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="enhancements"&gt;Enhancements&lt;/h2&gt;
&lt;p&gt;Getting new features is nice, but we can also improve the existing ones, here's a list of major changes of this 2.25.0 release.&lt;/p&gt;
&lt;h3 id="compiled-ans-signed-binaries"&gt;Compiled ans signed binaries&lt;/h3&gt;
&lt;p&gt;Until then, if you wanted binaries of Falcosidekick, you had to build them by yourself or use the provided Docker image. Now, each release will contain the compiled binaries for amd64 and arm64. The security is not forgotten, all artifacts are signed with &lt;a href="https://docs.sigstore.dev/cosign/overview/"&gt;Cosign&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="tags-and-source"&gt;Tags and Source&lt;/h3&gt;
&lt;p&gt;In January, &lt;a href="https://falco.org/blog/falco-0-31-0/"&gt;Falco 0.31.0&lt;/a&gt; brought its new Plugin system, the &lt;code&gt;source&lt;/code&gt; field of events becoming more important. This new release of Falcosidekick updates all the outputs to deal with &lt;code&gt;source&lt;/code&gt; and &lt;code&gt;tags&lt;/code&gt; events. Your Response Engines can now be much clever than even.&lt;/p&gt;
&lt;h3 id="irsa"&gt;IRSA&lt;/h3&gt;
&lt;p&gt;IRSA, aka Iam Role for Service Accounts, is the method provided by AWS for linking a Kubernetes Service Account with an IAM Role, allowing the Pod to easily use a Service. Falcosidekick is now able to use this mechanism for its outputs for AWS Services, no need to add Access and Secret Keys in your &lt;code&gt;values.yaml&lt;/code&gt;. The UX is much better. Thanks to &lt;a href="https://github.com/VariableExp0rt"&gt;@VariableExp0rt&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="falcosidekick-ui"&gt;Falcosidekick UI&lt;/h1&gt;
&lt;p&gt;I created the first version v0 of Falcosidekick-UI to have something more graphical for my talks, with the help of &lt;a href="https://github.com/fjogeleit"&gt;@fjogeleit&lt;/a&gt; we created a nice v1 that has been finally used more and more by people, becoming a famous product in the community.
It was time to have a better version with some requested features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a database (Redis) for a long term storage of events&lt;/li&gt;
&lt;li&gt;an API for counting or searching the events&lt;/li&gt;
&lt;li&gt;filters are kept as query strings, allowing to share links&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All details to use this new version, v2.0.0, are described in the &lt;a href="https://github.com/falcosecurity/falcosidekick-ui"&gt;README&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here's some screenshots:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://github.com/falcosecurity/falcosidekick-ui/raw/master/imgs/webui_01.png" alt="https://github.com/falcosecurity/falcosidekick-ui/raw/master/imgs/webui_01.png" loading="lazy" /&gt;
&lt;img src="https://github.com/falcosecurity/falcosidekick-ui/raw/master/imgs/webui_02.png" alt="https://github.com/falcosecurity/falcosidekick-ui/raw/master/imgs/webui_02.png" loading="lazy" /&gt;
&lt;img src="https://github.com/falcosecurity/falcosidekick-ui/raw/master/imgs/webui_04.png" alt="https://github.com/falcosecurity/falcosidekick-ui/raw/master/imgs/webui_04.png" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h1 id="deployments"&gt;Deployments&lt;/h1&gt;
&lt;p&gt;The Helm charts are already up to date, you can upgrade your deployments 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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm upgrade falcosidekick falcosecurity/falcosidekick --set webui.enabled=true -n falco&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;or&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;helm upgrade falco falcosecurity/falco \&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;--set falcosidekick.enabled=true \&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;--set falcosdekick.webui.enabled=true -n falco&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;&lt;em&gt;Enjoy&lt;/em&gt;&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 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><item><title>Blog: Falcosidekick 2020</title><link>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-2020/</link><pubDate>Tue, 12 Jan 2021 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falcosidekick-2020/</guid><description>
&lt;p&gt;This fantastic post from &lt;a href="https://github.com/leodido"&gt;@leodido&lt;/a&gt; about how has been the previous year 2020 for falco inspired me (&lt;a href="https://falco.org/blog/falco-2020/"&gt;link&lt;/a&gt;) I wanted to bring everyone up to speed on what we built for &lt;code&gt;falcosidekick&lt;/code&gt; in 2020&lt;/p&gt;
&lt;p&gt;Aside a lot of improvments and bug fixes, 8 new outputs have been integrated:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rocketchat&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mattermost&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Event Hub&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discord&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS SNS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GCP PubSub&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudwatch Logs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apache Kafka&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What really changed with previous releases was that almost all these outputs have been proposed and developed by other members of the &lt;code&gt;falco&lt;/code&gt; community (kindly called the &lt;em&gt;famiglia&lt;/em&gt; 😉). It warms my ♥️ a lot and makes me learn a lot about how to manage an open source project.&lt;/p&gt;
&lt;p&gt;Thanks to everybody for your ideas, your comments, your help, your PR, your reviews, etc.&lt;/p&gt;
&lt;p&gt;The following chart shows well how things are getting bigger and bigger for this small project that finally appeared useful for some people and companies.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://v0-43--falcosecurity.netlify.app/img/falcosidekick-github-activity-2020.png" alt="falcosidekick github activity 2020" loading="lazy" /&gt;
&lt;/p&gt;
&lt;p&gt;A special 🙏 to &lt;a href="https://github.com/cpanato"&gt;@cpanato&lt;/a&gt;, &lt;a href="https://github.com/KeisukeYamashita"&gt;@KeisukeYamashita&lt;/a&gt; and &lt;a href="https://github.com/nibalizer"&gt;@nibalizer&lt;/a&gt;, who are now official maintainers of &lt;code&gt;falcosidekick&lt;/code&gt; with me. 🎉 to them!&lt;/p&gt;
&lt;p&gt;Last but not least, all my friendship to &lt;a href="https://github.com/cpanato"&gt;@danpopSD&lt;/a&gt; for his support and motivation. Merci mon ami.&lt;/p&gt;
&lt;h4 id="what-s-next"&gt;What's next?&lt;/h4&gt;
&lt;h5 id="release-2-20-0"&gt;Release 2.20.0&lt;/h5&gt;
&lt;p&gt;Few times before this article is out we released one of the biggest versions since the beginning of &lt;code&gt;falcosidekick&lt;/code&gt;. It results of a combination of a lot of efforts from many people.&lt;/p&gt;
&lt;p&gt;The full changelog can be found &lt;a href="https://github.com/falcosecurity/falcosidekick/releases/tag/2.20.0"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The main changes are three new outputs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.nats.io/nats-streaming-concepts/intro"&gt;&lt;strong&gt;STAN (NATS Streaming)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pagerduty.com/"&gt;&lt;strong&gt;PagerDuty&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubeless.io/"&gt;&lt;strong&gt;Kubeless&lt;/strong&gt;&lt;/a&gt; &lt;em&gt;(stay tuned, a post about this will be out soon 😉)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="and"&gt;And ?&lt;/h5&gt;
&lt;p&gt;We believe the duo of &lt;code&gt;falco + falcosidekick&lt;/code&gt; to be an obvious solution for most infrastructures, we are working hard to improve the code base and documentation. That will be all the major set of goals for the next major release &lt;code&gt;3.0.0&lt;/code&gt; which is coming in the next few months. Until then with the help of &lt;a href="https://github.com/n3wscott"&gt;n3wscott&lt;/a&gt;, we're working on adding the &lt;a href="https://cloudevents.io/"&gt;&lt;code&gt;Cloudevents&lt;/code&gt;&lt;/a&gt; spec in a new HTTP output that will able to forward &lt;code&gt;falco&lt;/code&gt;'s events to more backends, like &lt;a href="https://knative.dev/"&gt;&lt;code&gt;Knative&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Enjoy&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>