<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Falco – Kmod</title><link>https://v0-43--falcosecurity.netlify.app/tags/kmod/</link><description>Recent content in Kmod on Falco</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Thu, 21 Sep 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://v0-43--falcosecurity.netlify.app/tags/kmod/feed.xml" rel="self" type="application/rss+xml"/><item><title>Blog: Introducing a framework for regression testing against Linux kernels</title><link>https://v0-43--falcosecurity.netlify.app/blog/falco-kernel-testing/</link><pubDate>Thu, 21 Sep 2023 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falco-kernel-testing/</guid><description>
&lt;p&gt;There are a few foundational technologies that empower the Cloud Native ecosystem. Containers is one. And one of the basis for containerization is the Linux Kernel itself. With Falco, we are developing a runtime security tool that hooks directly in the kernel to collect information about the system and notifies about malicious behavior.&lt;br&gt;
We have found the need to validate our drivers against various versions of the Linux kernel, to properly ensure that with each iteration of our drivers, supported kernels remained unaffected.&lt;br&gt;
To elaborate, we lacked a means to guarantee that a new driver release could:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Successfully compile on multiple kernel versions.&lt;/li&gt;
&lt;li&gt;Pass the eBPF verifier when executed on various kernel versions.&lt;/li&gt;
&lt;li&gt;Operate as expected, such as retrieving kernel events, across multiple kernel versions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To address this issue, we started a major intervention. Initially, a &lt;a href="https://github.com/falcosecurity/libs/blob/master/proposals/20230530-driver-kernel-testing-framework.md"&gt;proposal&lt;/a&gt; was discussed and incorporated into the libs repository.&lt;/p&gt;
&lt;p&gt;Since this was a pretty novel area, there were no pre-existing tools available to tackle it. Consequently, we embarked on the development of a completely new framework.&lt;br&gt;
Allow us to introduce you to the &lt;code&gt;kernel testing framework&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="components-of-a-kernel-testing-framework"&gt;Components of a kernel testing framework&lt;/h3&gt;
&lt;p&gt;Considering the inherent characteristics of the challenge, we need to set up a complete virtual machine for each distinct kernel version.&lt;br&gt;
These tests should be executed automatically each time new code is integrated into our drivers, serving as a means to promptly identify any issue or flaw in the tested kernel versions.&lt;br&gt;
With these objectives in mind, our approach should fulfill the following requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rapid and cost-effective VM creation: the process of creating these virtual machines should be efficient and budget-friendly.&lt;/li&gt;
&lt;li&gt;Effortless distribution of VM images: we should ensure easy sharing and deployment of the virtual machine images.&lt;/li&gt;
&lt;li&gt;Parallel execution of tests on multiple VMs: tests should run concurrently on each virtual machine to expedite the process.&lt;/li&gt;
&lt;li&gt;Reproducibility in local environments for debugging purposes: developers should be able to replicate the test environment locally to investigate and troubleshoot issues.&lt;/li&gt;
&lt;li&gt;Straightforward and user-friendly presentation of the test results: they should be presented in a simple and intuitive manner to immediately spot failures.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="ignite-a-firecracker-microvm"&gt;Ignite a Firecracker microVM&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://https://github.com/weaveworks/ignite"&gt;Weave Ignite&lt;/a&gt; is used to provision the &lt;a href="https://github.com/firecracker-microvm/firecracker"&gt;firecracker&lt;/a&gt; microVMs. Weave Ignite is an open source tool designed for lightweight and fast virtual machine management. It enables users to effortlessly create and manage virtual machines (VMs) for various purposes, such as development, testing, and experimentation.
One of the main reasons why we chose to use this tool was its capability to create firecracker microVMs from kernels and rootfs packed as OCI images.
Currently, we are using a patched version located at &lt;a href="https://github.com/therealbobo/ignite"&gt;a forked repository&lt;/a&gt;. These patches were essential to enable the booting of kernels that necessitated the use of an initrd (initial ramdisk).&lt;/p&gt;
&lt;h4 id="kernel-rootfs-oci-images"&gt;Kernel &amp;amp; Rootfs OCI images&lt;/h4&gt;
&lt;p&gt;Virtual machines consist of two essential layers: the kernel and the rootfs. These layers are packaged and distributed as OCI (Open Container Initiative) images. The kernel image encompasses the kernel that the virtual machine relies on, in contrast the rootfs image serves as the fundamental building block of a virtual machine, offering the essential filesystem necessary for booting the VM. Typically, these rootfs images incorporate a Linux distribution.
For more info on how we build them please check the available &lt;a href="https://github.com/falcosecurity/kernel-testing/tree/main/images"&gt;images documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id="ansible-playbooks"&gt;Ansible Playbooks&lt;/h4&gt;
&lt;p&gt;Automation is accomplished through the utilization of &lt;a href="https://docs.ansible.com/ansible/latest/index.html"&gt;Ansible&lt;/a&gt;. A collection of &lt;a href="https://github.com/falcosecurity/kernel-testing/tree/main/ansible-playbooks"&gt;playbooks&lt;/a&gt; is responsible for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Orchestrating the provisioning of microVMs.&lt;/li&gt;
&lt;li&gt;Configuring the machines.&lt;/li&gt;
&lt;li&gt;Retrieving the code to be tested.&lt;/li&gt;
&lt;li&gt;Eliminating the microVMs once the testing process is completed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="presenting-test-results"&gt;Presenting test results&lt;/h4&gt;
&lt;p&gt;We wanted the test data to be publicly and easily accessible by anyone, thus we had to find a way to represent the test output.&lt;br&gt;
Since there are 3 possible ways of instrumenting the kernel, that are using a kernel module or one of the available eBPF probes, the playbooks perform up to 3 tests. Taking into account that the modern eBPF probe is built in the Falco libraries, only 2 drivers need to be compiled.
We have 3 possible results for each of them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;success, when the test goes fine&lt;/li&gt;
&lt;li&gt;error, when the test fails&lt;/li&gt;
&lt;li&gt;skipped, when the test is not runnable for the kernel (for example, skipping modern eBPF tests where it is unsupported)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The natural way of dealing with all of this was to develop a &lt;a href="https://github.com/falcosecurity/kernel-testing/tree/main/matrix_gen"&gt;small tool&lt;/a&gt; that, given as input the output root folder, would generate a markdown matrix with the results.&lt;/p&gt;
&lt;p&gt;While scrutinizing the first version of the markdown matrix, we understood that it would have been even better if errors were also attached to the markdown, allowing for a more streamlined visualization of the results.&lt;br&gt;
This is the format we settled with; it can be found &lt;a href="https://falcosecurity.github.io/libs/matrix_X64/"&gt;at libs github pages&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="images/matrix.png" alt="" loading="lazy" /&gt;
&lt;/p&gt;
&lt;h3 id="how-we-use-it"&gt;How we use it&lt;/h3&gt;
&lt;p&gt;We implemented a new Github action workflow in the libs repository that triggers on pushes to master, using an x86_64 and an aarch64 nodes with virtualization capabilities provided by the CNCF.&lt;br&gt;
The &lt;a href="https://github.com/falcosecurity/libs/blob/master/.github/workflows/kernel_tests.yaml"&gt;workflow&lt;/a&gt; itself is very simple since it runs the testing framework on self-hosted nodes just like you would run it locally:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-yaml=" data-lang="yaml="&gt;jobs:
test-kernels:
strategy:
fail-fast: false
matrix:
architecture: [X64, ARM64] # We use a matrix to run our job on both supported arch
# Since github actions do not support arm64 runners and they do not offer virtualization capabilities, we need to use self hosted nodes.
runs-on: [ &amp;#34;self-hosted&amp;#34;, &amp;#34;linux&amp;#34;, &amp;#34;${{matrix.architecture}}&amp;#34; ]
steps:
# We clone the kernel-testing repo, generate vars.yaml (ie: input options for the kernel-testing run)
# and run needed ansible playbooks one by one, directly on each node.
- name: Checkout
uses: actions/checkout@v3
with:
repository: falcosecurity/kernel-testing
ref: v0.2.3
- name: Generate vars yaml
working-directory: ./ansible-playbooks
run: |
LIBS_V=${{ github.event.inputs.libsversion }}
LIBS_VERSION=${LIBS_V:-${{ github.ref_name }}}
cat &amp;gt; vars.yml &amp;lt;&amp;lt;EOF
run_id: &amp;#34;id-${{ github.run_id }}&amp;#34;
output_dir: &amp;#34;~/ansible_output_${{ github.run_id }}&amp;#34;
repos:
libs: {name: &amp;#34;falcosecurity-libs&amp;#34;, repo: &amp;#34;https://github.com/falcosecurity/libs.git&amp;#34;, version: &amp;#34;$LIBS_VERSION&amp;#34;}
EOF
- name: Bootstrap VMs
working-directory: ./ansible-playbooks
run: |
ansible-playbook bootstrap.yml --extra-vars &amp;#34;@vars.yml&amp;#34;
- name: Common setup
working-directory: ./ansible-playbooks
run: |
ansible-playbook common.yml --extra-vars &amp;#34;@vars.yml&amp;#34;
- name: Prepare github repos
working-directory: ./ansible-playbooks
run: |
ansible-playbook git-repos.yml --extra-vars &amp;#34;@vars.yml&amp;#34;
- name: Run scap-open tests
working-directory: ./ansible-playbooks
run: |
ansible-playbook scap-open.yml --extra-vars &amp;#34;@vars.yml&amp;#34; || :
# Once test finished, we collect its output folder and upload it to the github workflow space
- name: Tar output files
run: |
tar -cvf ansible_output.tar ~/ansible_output_${{ github.run_id }}
- uses: actions/upload-artifact@v3
with:
name: ansible_output_${{matrix.architecture}}
path: ansible_output.tar
# We then build the matrix and upload them too
- name: Build matrix_gen
working-directory: ./matrix_gen
env:
GOPATH: /root/go
GOCACHE: /root/.cache/go-build
run: |
go build .
- name: Generate new matrix
working-directory: ./matrix_gen
run: |
./matrix_gen --root-folder ~/ansible_output_${{ github.run_id }} --output-file matrix_${{matrix.architecture}}.md
- uses: actions/upload-artifact@v3
with:
name: matrix_${{matrix.architecture}}
path: ./matrix_gen/matrix_${{matrix.architecture}}.md
# Always run the cleanup playbook to avoid leaving garbage on the nodes
- name: Cleanup
if: always()
working-directory: ./ansible-playbooks
run: |
ansible-playbook clean-up.yml --extra-vars &amp;#34;@vars.yml&amp;#34; || :
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In the &lt;code&gt;Generate new matrix&lt;/code&gt; step, the kernel matrix gets generated and then uploaded.&lt;br&gt;
Once this workflow runs successfully for both architectures, another &lt;a href="https://github.com/falcosecurity/libs/blob/master/.github/workflows/pages.yml"&gt;workflow&lt;/a&gt; gets triggered,&lt;br&gt;
that is responsible for generating and pushing updated Github pages.&lt;br&gt;
The end result can be seen at &lt;a href="https://falcosecurity.github.io/libs/matrix/"&gt;https://falcosecurity.github.io/libs/matrix/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Moreover, the kernel-testing workflow gets also triggered on each driver's tag; then a &lt;a href="https://github.com/falcosecurity/libs/blob/master/.github/workflows/release-body.yml"&gt;supplementary workflow&lt;/a&gt; takes care of attaching matrixes to the release body;&lt;br&gt;
here is an example: &lt;a href="https://github.com/falcosecurity/libs/releases/tag/6.0.0%2Bdriver"&gt;https://github.com/falcosecurity/libs/releases/tag/6.0.0%2Bdriver&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pretty nice, uh?&lt;/p&gt;
&lt;h3 id="what-s-next-for-the-framework"&gt;What's next for the framework&lt;/h3&gt;
&lt;p&gt;There are quite a few gaps that still need to be addressed by our framework. First of all, the images being used by Ignite to spawn FireCracker VMs are still under a development Docker repository and need to be moved under Falcosecurity.&lt;br&gt;
Moreover, we need to implement a CI to automatically build and push those images.&lt;/p&gt;
&lt;p&gt;As previously said, the kernel tests are currently running &lt;a href="https://github.com/falcosecurity/libs/tree/master/userspace/libscap/examples/01-open"&gt;&lt;code&gt;scap-open&lt;/code&gt;&lt;/a&gt; binary to check whether any event gets received. It is a small libscap C example that loads a driver and waits for events, nothing more.&lt;br&gt;
It would be great to run &lt;a href="https://github.com/falcosecurity/libs/tree/master/test/drivers"&gt;drivers tests&lt;/a&gt; instead, to fully test the expected behavior of the drivers.&lt;/p&gt;
&lt;p&gt;Finally, an utopian idea: imagine if we were able to run &lt;a href="https://github.com/falcosecurity/kernel-crawler"&gt;&lt;code&gt;kernel-crawler&lt;/code&gt;&lt;/a&gt; to fetch kernel images, and then &lt;strong&gt;automatically&lt;/strong&gt; build new kernel testing matrix entries for newly discovered images.&lt;br&gt;
This would mean that our kernel testing matrix coverage increases steadily week after week, giving users even more guarantees about the stability of the Falco drivers!&lt;/p&gt;
&lt;p&gt;Here is the libs tracking issue: &lt;a href="https://github.com/falcosecurity/libs/issues/1224"&gt;https://github.com/falcosecurity/libs/issues/1224&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We would love to hear back from you! If you try out the framework and find any issues, please file them at &lt;a href="https://github.com/falcosecurity/kernel-testing/issues"&gt;https://github.com/falcosecurity/kernel-testing/issues&lt;/a&gt;. If you want to help us to improve, please join our Slack, and feel free to open a Pull Request!&lt;/p&gt;</description></item><item><title>Blog: Falco Driverkit with Docker on Debian</title><link>https://v0-43--falcosecurity.netlify.app/blog/falco-driverkit-debian-docker/</link><pubDate>Mon, 05 Sep 2022 00:00:00 +0000</pubDate><guid>https://v0-43--falcosecurity.netlify.app/blog/falco-driverkit-debian-docker/</guid><description>
&lt;p&gt;We use different technologies on a daily basis. Tools like Vagrant, Terraform, Ansible, and many more allow us to create and destroy digital resources in a matter of minutes, if not seconds. However, if you keep changing your running environment, you might also need to calibrate your workloads to these new changes. This is especially true when you deploy applications tightly dependent on the operating system.&lt;/p&gt;
&lt;p&gt;In other words, every time you deploy an application like Falco there's a chance that you need to compile a new module or eBPF probe to get along with the current underlying kernel. This is the first of a series of posts where you will learn some interesting techniques related to how Falco generates the much needed driver and how you can make it available for your deployments.&lt;/p&gt;
&lt;h2 id="falco-on-docker"&gt;Falco on Docker&lt;/h2&gt;
&lt;p&gt;There are many ways to run Falco: as a service, as a local container, as a Pod in Kubernetes, etc. Either way, if what we want to do is use Falco to detect threats based on syscalls, we will need a driver that has been compiled for the specific kernel running on the machine, be it a physical machine, a virtual one, or a Kubernetes node in the cloud.&lt;/p&gt;
&lt;h3 id="launching-falco-as-a-container"&gt;Launching Falco as a container&lt;/h3&gt;
&lt;p&gt;The Falco image embeds a script, &lt;code&gt;/usr/bin/falco-driver-loader&lt;/code&gt;, that will automatically try to find and download a kernel module or an eBPF probe. If that wasn't possible, it might try to compile it inside the container itself. We will learn a bit more about this process and how to control it.&lt;/p&gt;
&lt;p&gt;Here is the output of a fresh instance of &lt;code&gt;falco&lt;/code&gt; running on our local docker service:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker run -it --privileged &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; --name falco-driver-test &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; -v /dev:/host/dev &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; -v /etc:/host/etc:ro &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; -v /proc:/host/proc:ro &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; -v /var/run/docker.sock:/host/var/run/docker.sock &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; docker.io/falcosecurity/falco:0.32.2
&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;Unable to find image &lt;span style="color:#b44"&gt;&amp;#39;falcosecurity/falco:0.32.2&amp;#39;&lt;/span&gt; locally
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0.32.2: Pulling from falcosecurity/falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;7e6a53d1988f: Pull &lt;span style="color:#a2f"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... output omitted
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;f3102eb3e85f: Pull &lt;span style="color:#a2f"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Digest: sha256:5ceb23e5baae9c86fc0b160fed397facd2074ca398b770878adbb9c6d049d8a8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Status: Downloaded newer image &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt; falcosecurity/falco:0.32.2
&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;* 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 &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt;: falco &lt;span style="color:#b8860b"&gt;version&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;0.32.2, driver &lt;span style="color:#b8860b"&gt;version&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;2.0.0+driver
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Running falco-driver-loader with: &lt;span style="color:#b8860b"&gt;driver&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;module, &lt;span style="color:#b8860b"&gt;compile&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;yes, &lt;span style="color:#b8860b"&gt;download&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b8860b"&gt;yes&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:#666"&gt;================&lt;/span&gt; Cleaning &lt;span style="color:#b8860b"&gt;phase&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;* 1. Check &lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt; kernel module &lt;span style="color:#b44"&gt;&amp;#39;falco&amp;#39;&lt;/span&gt; is still loaded:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- OK! There is no &lt;span style="color:#b44"&gt;&amp;#39;falco&amp;#39;&lt;/span&gt; module loaded.
&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. Check all versions of kernel module &lt;span style="color:#b44"&gt;&amp;#39;falco&amp;#39;&lt;/span&gt; in dkms:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- There are some versions of &lt;span style="color:#b44"&gt;&amp;#39;falco&amp;#39;&lt;/span&gt; module in dkms.
&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;* 3. Removing all the following versions from dkms:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2.0.0+driver
&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;- Removing 2.0.0+driver...
&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;Deleting module version: 2.0.0+driver
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;completely from the DKMS tree.
&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;Done.
&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;- OK! Removing &lt;span style="color:#b44"&gt;&amp;#39;2.0.0+driver&amp;#39;&lt;/span&gt; succeeded.
&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;&lt;span style="color:#666"&gt;[&lt;/span&gt;SUCCESS&lt;span style="color:#666"&gt;]&lt;/span&gt; Cleaning phase correctly terminated.
&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; Cleaning &lt;span style="color:#b8860b"&gt;phase&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;* Looking &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt; a falco module locally &lt;span style="color:#666"&gt;(&lt;/span&gt;kernel 5.10.0-14-cloud-amd64&lt;span style="color:#666"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Trying to download a prebuilt falco module from https://download.falco.org/driver/2.0.0%2Bdriver/x86_64/falco_debian_5.10.0-14-cloud-amd64_1.ko
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl: &lt;span style="color:#666"&gt;(&lt;/span&gt;22&lt;span style="color:#666"&gt;)&lt;/span&gt; The requested URL returned error: &lt;span style="color:#666"&gt;404&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Unable to find a prebuilt falco module
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Trying to dkms install falco module with GCC /usr/bin/gcc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DIRECTIVE: &lt;span style="color:#b8860b"&gt;MAKE&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;&amp;#39;/tmp/falco-dkms-make&amp;#39;&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;Creating symlink /var/lib/dkms/falco/2.0.0+driver/source -&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; /usr/src/falco-2.0.0+driver
&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;DKMS: add completed.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Running dkms build failed, couldn&lt;span style="color:#b44"&gt;&amp;#39;t find /var/lib/dkms/falco/2.0.0+driver/build/make.log (with GCC /usr/bin/gcc)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;* Trying to dkms install falco module with GCC /usr/bin/gcc-8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;DIRECTIVE: MAKE=&amp;#34;&amp;#39;&lt;/span&gt;/tmp/falco-dkms-make&lt;span style="color:#b44"&gt;&amp;#39;&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;* Running dkms build failed, couldn&amp;#39;&lt;/span&gt;t find /var/lib/dkms/falco/2.0.0+driver/build/make.log &lt;span style="color:#666"&gt;(&lt;/span&gt;with GCC /usr/bin/gcc-8&lt;span style="color:#666"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Trying to dkms install falco module with GCC /usr/bin/gcc-6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DIRECTIVE: &lt;span style="color:#b8860b"&gt;MAKE&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;&amp;#39;/tmp/falco-dkms-make&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Running dkms build failed, couldn&lt;span style="color:#b44"&gt;&amp;#39;t find /var/lib/dkms/falco/2.0.0+driver/build/make.log (with GCC /usr/bin/gcc-6)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;* Trying to dkms install falco module with GCC /usr/bin/gcc-5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;DIRECTIVE: MAKE=&amp;#34;&amp;#39;&lt;/span&gt;/tmp/falco-dkms-make&lt;span style="color:#b44"&gt;&amp;#39;&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;* Running dkms build failed, couldn&amp;#39;&lt;/span&gt;t find /var/lib/dkms/falco/2.0.0+driver/build/make.log &lt;span style="color:#666"&gt;(&lt;/span&gt;with GCC /usr/bin/gcc-5&lt;span style="color:#666"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Trying to load a system falco module, &lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt; present
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Consider compiling your own falco driver and loading it or getting in touch with the Falco community
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:00:02+0000: Falco version 0.32.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:00:02+0000: Falco initialized with configuration file /etc/falco/falco.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:00:02+0000: Loading rules from file /etc/falco/falco_rules.yaml:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:00:02+0000: 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;2022-08-31T12:00:02+0000: Starting internal webserver, listening on port &lt;span style="color:#666"&gt;8765&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:00:02+0000: Unable to load the driver.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:00:02+0000: Runtime error: error opening device /host/dev/falco0. Make sure you have root credentials and that the falco module is loaded.. Exiting.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There are some important reads from this output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The driver version this image tries to load is the &lt;strong&gt;&lt;code&gt;2.0.0+driver&lt;/code&gt;&lt;/strong&gt;. This information will be really useful when we need to compile and share the driver with the &lt;em&gt;falco container&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;By default, the container will look for a kernel module. It is possible to switch to an &lt;em&gt;eBPF probe&lt;/em&gt; by using an environment variable, as you'll see later in this post.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;falco-driver-loader&lt;/code&gt; script always removes the driver from memory and tries to load a current one. This is done for security reasons and the way to avoid that is not running this script when creating the container. More on this later, too.&lt;/li&gt;
&lt;li&gt;After looking in the system for a previously installed driver, the script tries to download it from the URL &lt;code&gt;https://download.falco.org&lt;/code&gt;. Unfortunately, it doesn't seem to be able to find it and falls back to the local compilation method.&lt;/li&gt;
&lt;li&gt;When the script tries to compile the driver inside the container, it doesn't succeed because we haven't fulfilled one important prerequisite: installing the kernel headers on the host machine. In this post, we won't address that method but you can always refer to the documentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="using-falco-driverkit"&gt;Using Falco Driverkit&lt;/h3&gt;
&lt;p&gt;As mentioned, there are different ways to obtain a valid kernel: downloading it from &lt;code&gt;https://download.falco.org&lt;/code&gt;, compiling it via the &lt;code&gt;falco-driver-loader&lt;/code&gt; script, or the method we'll explain here: using &lt;code&gt;driverkit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We don't intend this post to be an exhaustive guide to &lt;code&gt;driverkit&lt;/code&gt;. That's also why we've chosen a relatively easy and tested target operating system: Debian.&lt;/p&gt;
&lt;p&gt;First of all, we need the &lt;code&gt;driverkit&lt;/code&gt; tool which we'll compile ourselves. We can download the source code from &lt;code&gt;https://github.com/falcosecurity/driverkit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When compiling a tool, we like using a temporary container. In this case, we'll start our container using the &lt;code&gt;docker.io/golang:1.19&lt;/code&gt; image and a &lt;code&gt;sleep&lt;/code&gt; process until we're done. The &lt;code&gt;./driverkit&lt;/code&gt; directory will help us to extract the binary to the host filesystem. Feel free to use any other method you prefer, like &lt;code&gt;docker cp&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;&lt;span style="color:#080;font-style:italic"&gt;# This directory will contain the driverkit binary&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;# once it is compiled inside the container&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;$ mkdir ./driverkit
&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;# Container with Go tools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker run --rm -d --name golang-compiler &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; -v &lt;span style="color:#b8860b"&gt;$PWD&lt;/span&gt;/driverkit:/export &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; golang:1.19 sleep infinity
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check that the container has been successfully created and still runs:&lt;/p&gt;
&lt;div class="highlight"&gt;&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;$ docker ps
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1ff943cbf7f9 golang:1.19 &lt;span style="color:#b44"&gt;&amp;#34;sleep infinity&amp;#34;&lt;/span&gt; &lt;span style="color:#666"&gt;4&lt;/span&gt; seconds ago Up &lt;span style="color:#666"&gt;3&lt;/span&gt; seconds golang-compiler
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, create a shell with a terminal in the container:&lt;/p&gt;
&lt;div class="highlight"&gt;&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;$ docker &lt;span style="color:#a2f"&gt;exec&lt;/span&gt; -it golang-compiler /bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Remember, you are in the container context now. Whatever you do here will be lost unless you copy it to the &lt;code&gt;/export&lt;/code&gt; directory. We will clone the &lt;code&gt;driverkit&lt;/code&gt; code and compile it using the following 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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/falcosecurity/driverkit
&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; driverkit &lt;span style="color:#666"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp _output/bin/driverkit /export/driverkit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f"&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once we are done with the Golang container, we can stop it and it'll be automatically removed thanks to the &lt;code&gt;--rm&lt;/code&gt; parameter that we used to start it.&lt;/p&gt;
&lt;div class="highlight"&gt;&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;docker stop golang-compiler -t0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="creating-a-configuration-file-for-the-driver-request"&gt;Creating a configuration file for the driver request&lt;/h4&gt;
&lt;p&gt;Time to create a configuration file. Do you remember the driver version: &lt;code&gt;2.0.0+driver&lt;/code&gt;? We will use that and additional information to create the configuration file.&lt;/p&gt;
&lt;div class="highlight"&gt;&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;# We&amp;#39;ve included some VARIABLES that will help you understand&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;# where the different values come from and what they represent&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;DRIVER_VERSION&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;2.0.0+driver
&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;DRIVER_TARGET&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;debian
&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;DRIVER_ARCH&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;arch&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&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;KERNEL_VERSION&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;uname -v| cut -f1 -d&lt;span style="color:#b44"&gt;&amp;#39; &amp;#39;&lt;/span&gt; | tr -d &lt;span style="color:#b62;font-weight:bold"&gt;\#&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;KERNEL_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;uname -r&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;DRIVER_NAME&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;&lt;span style="color:#a2f"&gt;export&lt;/span&gt; &lt;span style="color:#b8860b"&gt;PROBE_FILE&lt;/span&gt;&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;DRIVER_NAME&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;DRIVER_TARGET&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;KERNEL_RELEASE&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;KERNEL_VERSION&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;.o
&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;MODULE_FILE&lt;/span&gt;&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;DRIVER_NAME&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;DRIVER_TARGET&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;KERNEL_RELEASE&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;KERNEL_VERSION&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;.ko
&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;mkdir -p drivers/&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;DRIVER_VERSION&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;DRIVER_ARCH&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&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;# Creating the actual file that we will pass to driverkit&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;cat &amp;gt; debian.yaml &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;target: ${DRIVER_TARGET}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;driverversion: ${DRIVER_VERSION}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kernelrelease: ${KERNEL_RELEASE}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt;kernelversion: ${KERNEL_VERSION}
&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:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; module: ./drivers/${DRIVER_VERSION}/x86_64/${MODULE_FILE}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44"&gt; probe: ./drivers/${DRIVER_VERSION}/x86_64/${PROBE_FILE}
&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;The resulting file should look 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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cat debian.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;target: debian
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;driverversion: 2.0.0+driver
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kernelrelease: 5.10.0-14-cloud-amd64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kernelversion: &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;output:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; module: ./drivers/2.0.0+driver/x86_64/falco_debian_5.10.0-14-cloud-amd64_1.ko
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; probe: ./drivers/2.0.0+driver/x86_64/falco_debian_5.10.0-14-cloud-amd64_1.o
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;In case you want to use a version previous to Falco 0.32.2 you might need to remove the &lt;code&gt;x86_64/&lt;/code&gt; string from the probe path. This is due to the expected path inside the &lt;code&gt;falco-driver-loader&lt;/code&gt; script. These paths will be offered via an HTTP server at a later stage, so make sure they match in both steps.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This same file is the one we will pass to &lt;code&gt;driverkit&lt;/code&gt;. If the driver is compiled satisfactorily, we should see a similar output in some seconds. Be patient.&lt;/p&gt;
&lt;div class="highlight"&gt;&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;$ ./driverkit/driverkit docker -c debian.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;INFO using config file &lt;span style="color:#b8860b"&gt;file&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;debian.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO driver building, it will take a few seconds &lt;span style="color:#b8860b"&gt;processor&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;docker
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO kernel module available &lt;span style="color:#b8860b"&gt;path&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;./drivers/2.0.0+driver/x86_64/falco_debian_5.10.0-14-cloud-amd64_1.ko
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO eBPF probe available &lt;span style="color:#b8860b"&gt;path&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;./drivers/2.0.0+driver/x86_64/falco_debian_5.10.0-14-cloud-amd64_1.o
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make sure you use either the .yml or .yaml suffix. Otherwise, you'll get an error like:&lt;/p&gt;
&lt;div class="highlight"&gt;&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;$ ./driverkit/driverkit docker -c debian.unknown-ext
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Error: exiting &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt; validation errors
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Usage:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; driverkit docker &lt;span style="color:#666"&gt;[&lt;/span&gt;flags&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;Flags:
&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;... output omitted
&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;FATA error executing driverkit &lt;span style="color:#b8860b"&gt;error&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;exiting for validation errors&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alternatively, we could have used a bunch of parameters in the command line, like:&lt;/p&gt;
&lt;div class="highlight"&gt;&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;# Don&amp;#39;t forget to \, to let the command continue after each line&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;$ ./driverkit/driverkit docker &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; --architecture amd64 &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; --target &lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;DRIVER_TARGET&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; --driverversion &lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;DRIVER_VERSION&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; --kernelversion &lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;KERNEL_VERSION&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; --kernelrelease &lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;KERNEL_RELEASE&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; --output-probe ./drivers/&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;DRIVER_VERSION&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;/x86_64/&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;PROBE_FILE&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; --output-module ./drivers/&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;DRIVER_VERSION&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;/x86_64/&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;MODULE_FILE&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&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;INFO driver building, it will take a few seconds &lt;span style="color:#b8860b"&gt;processor&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;docker
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO kernel module available &lt;span style="color:#b8860b"&gt;path&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;./drivers/2.0.0+driver/x86_64/falco_debian_5.10.0-14-cloud-amd64_1.ko
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO eBPF probe available &lt;span style="color:#b8860b"&gt;path&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;./drivers/2.0.0+driver/x86_64/falco_debian_5.10.0-14-cloud-amd64_1.o
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Either way, if &lt;code&gt;driverkit&lt;/code&gt; manages to compile the drivers, you can continue with the next step. Otherwise, you might need to adjust some of the parameters in the configuration or even customize your builder image, but we will explain that in a different post where we will deep dive into &lt;code&gt;driverkit&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="launching-falco-with-the-new-driver"&gt;Launching Falco with the new driver&lt;/h3&gt;
&lt;p&gt;There are different ways to load the driver when running Falco. We'll show you two of them: loading them manually and leaving this action to the script embedded in the container image.&lt;/p&gt;
&lt;h4 id="loading-the-driver-manually"&gt;Loading the driver manually&lt;/h4&gt;
&lt;p&gt;A kernel module only needs to be loaded once. So, if we load it manually before starting the container, Falco doesn't need to do it again.&lt;/p&gt;
&lt;p&gt;There are two ways of achieving that, and both require avoiding the execution of the &lt;code&gt;falco-driver-loader&lt;/code&gt; script:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Setting the SKIP_DRIVER_LOADER environment variable to any value when creating the container. By doing so, the container entrypoint will skip the existing &lt;code&gt;falco-driver-loader&lt;/code&gt; script.&lt;/li&gt;
&lt;li&gt;Using the image &lt;code&gt;docker.io/falco/falco-no-driver&lt;/code&gt;, which doesn't contain that script.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First, try to load the driver on the host. Look for the &lt;code&gt;.ko&lt;/code&gt; file in the directory structure we created and load it using &lt;code&gt;insmod&lt;/code&gt;, for instance. If the compilation was successful and the kernel version chosen was the right one, you shouldn't see any message once the module is loaded. Don't forget to do it with the user &lt;em&gt;root&lt;/em&gt; (i.e., via &lt;code&gt;sudo&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;$ find &lt;span style="color:#b8860b"&gt;$HOME&lt;/span&gt;/drivers -type f
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drivers/2.0.0+driver/x86_64/falco_debian_5.10.0-14-cloud-amd64_1.o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drivers/2.0.0+driver/x86_64/falco_debian_5.10.0-14-cloud-amd64_1.ko
&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;$ sudo insmod drivers/2.0.0+driver/x86_64/falco_debian_5.10.0-14-cloud-amd64_1.ko
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ lsmod | grep -i falco
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco &lt;span style="color:#666"&gt;741376&lt;/span&gt; &lt;span style="color:#666"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This first method of starting the &lt;code&gt;falco&lt;/code&gt; container will use the &lt;code&gt;docker.io/falco/falco:0.32.2&lt;/code&gt; image, passing the &lt;code&gt;SKIP_DRIVER_LOADER&lt;/code&gt; variable. We've set it to one but the script doesn't check its value.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Observe that we're removing any existing container with that name before starting ours, but the container image remains.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker rm -f falco-driver-test &lt;span style="color:#080;font-style:italic"&gt;# Ignore any failure here&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-driver-test
&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;$ docker run -it --privileged &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; --name falco-driver-test &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; -e &lt;span style="color:#b8860b"&gt;SKIP_DRIVER_LOADER&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#666"&gt;1&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; -v /dev:/host/dev &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; -v /proc:/host/proc:ro &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; -v /var/run/docker.sock:/host/var/run/docker.sock &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; docker.io/falcosecurity/falco:0.32.2
&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;2022-08-31T12:07:30+0000: Falco version 0.32.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:07:30+0000: Falco initialized with configuration file /etc/falco/falco.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:07:30+0000: Loading rules from file /etc/falco/falco_rules.yaml:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:07:30+0000: 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;2022-08-31T12:07:30+0000: Starting internal webserver, listening on port &lt;span style="color:#666"&gt;8765&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The second method uses the &lt;code&gt;docker.io/falco/falco-no-driver&lt;/code&gt; image, so, as you can expect, it won't try to reload the driver this time.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This time, Docker will pull the image since we hadn't used it yet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker rm -f falco-driver-test &lt;span style="color:#080;font-style:italic"&gt;# Ignore any failure here&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-driver-test
&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;$ docker run -i -t --privileged &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; -v /var/run/docker.sock:/host/var/run/docker.sock &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; -v /dev:/host/dev &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; -v /proc:/host/proc:ro &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; --name falco-driver-test &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; docker.io/falcosecurity/falco-no-driver:0.32.2
&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;Unable to find image &lt;span style="color:#b44"&gt;&amp;#39;falcosecurity/falco-no-driver:0.32.2&amp;#39;&lt;/span&gt; locally
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0.32.2: Pulling from falcosecurity/falco-no-driver
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1efc276f4ff9: Pull &lt;span style="color:#a2f"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;e34e1870ff2c: Pull &lt;span style="color:#a2f"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Digest: sha256:14e6d3da56fe607ff9b0bfe91ec812ab4f4b030cea3ed88a2d31ac9b31f97fb4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Status: Downloaded newer image &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt; falcosecurity/falco-no-driver:0.32.2
&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;2022-08-31T12:12:40+0000: Falco version 0.32.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:12:40+0000: Falco initialized with configuration file /etc/falco/falco.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:12:40+0000: Loading rules from file /etc/falco/falco_rules.yaml:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:12:40+0000: 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;2022-08-31T12:12:40+0000: Starting internal webserver, listening on port &lt;span style="color:#666"&gt;8765&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="sharing-the-probe-and-driver-with-the-falco-container"&gt;Sharing the probe and driver with the Falco container&lt;/h4&gt;
&lt;p&gt;This method is a bit more complicated than the previous one but will also give us the flexibility of deploying &lt;code&gt;falco&lt;/code&gt; at scale.&lt;/p&gt;
&lt;p&gt;The idea is simple though. After starting your favorite webserver and publishing the &lt;code&gt;./drivers&lt;/code&gt; directory that we created before, we'll tell the &lt;code&gt;falco&lt;/code&gt; container to use it as a repository and download the driver from there.&lt;/p&gt;
&lt;p&gt;To keep things clean, we've used the &lt;code&gt;docker.io/python:latest&lt;/code&gt; container image, which includes the Python module &lt;code&gt;http.server&lt;/code&gt;. If you have Python already installed on your system, you can use it directly. Just remember to define a port accessible to the &lt;code&gt;falco&lt;/code&gt; container and pass the right IP address.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker run -d &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; --name falco-drivers-web &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; -v &lt;span style="color:#b8860b"&gt;$PWD&lt;/span&gt;/drivers:/data:ro &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; docker.io/python:latest &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; bash -c &lt;span style="color:#b44"&gt;&amp;#34;cd /data &amp;amp;&amp;amp; python -m http.server&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;Unable to find image &lt;span style="color:#b44"&gt;&amp;#39;python:latest&amp;#39;&lt;/span&gt; locally
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;latest: Pulling from library/python
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1671565cc8df: Pull &lt;span style="color:#a2f"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... output omitted
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4334b2fe8293: Pull &lt;span style="color:#a2f"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Digest: sha256:745efdfb7e4aac9a8422bd8c62d8bc35a693e8979a240d29677cb03e6aa91052
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Status: Downloaded newer image &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt; python:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;f94cb601f85c312d62aab3e116619558239bada9f5d05e971fe26c0206828b6b
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Our python web server is now available and offers the drivers to any local container that might need them. Retrieve the IP address of this container for later use:&lt;/p&gt;
&lt;div class="highlight"&gt;&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;$ docker inspect falco-drivers-web --format &lt;span style="color:#b44"&gt;&amp;#39;{{ .NetworkSettings.IPAddress }}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;172.17.0.2
&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;# Assign it to a variable for later use&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;DRIVERS_REPO&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;docker inspect falco-drivers-web &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; --format &lt;span style="color:#b44"&gt;&amp;#39;{{ .NetworkSettings.IPAddress }}&amp;#39;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;:8000
&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;echo&lt;/span&gt; &lt;span style="color:#b8860b"&gt;$DRIVERS_REPO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;172.17.0.2:8000
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It's always a good practice to test that the drivers are in the right place and accessible through the webserver.&lt;/p&gt;
&lt;div class="highlight"&gt;&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;# This is the checksum of the local files&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;$ find ./drivers -type f -name &lt;span style="color:#b44"&gt;&amp;#34;*o&amp;#34;&lt;/span&gt; -exec cksum &lt;span style="color:#666"&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;&lt;span style="color:#666"&gt;3873827283&lt;/span&gt; &lt;span style="color:#666"&gt;843080&lt;/span&gt; ./drivers/2.0.0+driver/x86_64/falco_debian_5.10.0-14-cloud-amd64.ko
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;914371530&lt;/span&gt; &lt;span style="color:#666"&gt;4980536&lt;/span&gt; ./drivers/2.0.0+driver/x86_64/falco_debian_5.10.0-14-cloud-amd64.o
&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;# This is the checksum of the files retrieved through HTTP&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;$ find ./drivers -type f -name &lt;span style="color:#b44"&gt;&amp;#34;*o&amp;#34;&lt;/span&gt; | &lt;span style="color:#a2f;font-weight:bold"&gt;while&lt;/span&gt; &lt;span style="color:#a2f"&gt;read&lt;/span&gt; FILE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a2f;font-weight:bold"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#b8860b"&gt;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;&lt;span style="color:#a2f"&gt;echo&lt;/span&gt; &lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;FILE&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt; | sed -e &lt;span style="color:#b44"&gt;&amp;#39;s,./drivers,&amp;#39;&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;DRIVERS_REPO&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#39;,&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;echo&lt;/span&gt; &lt;span style="color:#b44"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;$(&lt;/span&gt;curl -s http://&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;URL&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&lt;/span&gt; | cksum&lt;span style="color:#a2f;font-weight:bold"&gt;)&lt;/span&gt;&lt;span style="color:#b44"&gt; http://&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;${&lt;/span&gt;&lt;span style="color:#b8860b"&gt;URL&lt;/span&gt;&lt;span style="color:#b68;font-weight:bold"&gt;}&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; &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;3873827283&lt;/span&gt; &lt;span style="color:#666"&gt;843080&lt;/span&gt; localhost:8000/2.0.0+driver/x86_64/falco_debian_5.10.0-14-cloud-amd64.ko
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;914371530&lt;/span&gt; &lt;span style="color:#666"&gt;4980536&lt;/span&gt; localhost:8000/2.0.0+driver/x86_64/falco_debian_5.10.0-14-cloud-amd64.o
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As you can see, they are accessible and identical.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;These values will be different depending on the version of the kernel and the Falco drivers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="loading-the-kernel-module"&gt;Loading the kernel module&lt;/h4&gt;
&lt;p&gt;Let's start with the kernel module. In this case, the only variable we need to pass is the &lt;code&gt;DRIVERS_REPO&lt;/code&gt; one, which has been carefully prepared in the previous 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;$ docker rm -f falco-driver-test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-driver-test
&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;$ docker run -it --privileged &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; --name falco-driver-test &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; -v /dev:/host/dev &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; -v /etc:/host/etc:ro &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; -v /proc:/host/proc:ro &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; -v /var/run/docker.sock:/host/var/run/docker.sock &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; -e &lt;span style="color:#b8860b"&gt;DRIVERS_REPO&lt;/span&gt;&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;DRIVERS_REPO&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; docker.io/falcosecurity/falco:0.32.2
&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;* 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 &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt;: falco &lt;span style="color:#b8860b"&gt;version&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;0.32.2, driver &lt;span style="color:#b8860b"&gt;version&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;2.0.0+driver
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Running falco-driver-loader with: &lt;span style="color:#b8860b"&gt;driver&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;module, &lt;span style="color:#b8860b"&gt;compile&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;yes, &lt;span style="color:#b8860b"&gt;download&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#b8860b"&gt;yes&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:#666"&gt;================&lt;/span&gt; Cleaning &lt;span style="color:#b8860b"&gt;phase&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;* 1. Check &lt;span style="color:#a2f;font-weight:bold"&gt;if&lt;/span&gt; kernel module &lt;span style="color:#b44"&gt;&amp;#39;falco&amp;#39;&lt;/span&gt; is still loaded:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- OK! There is no &lt;span style="color:#b44"&gt;&amp;#39;falco&amp;#39;&lt;/span&gt; module loaded.
&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. Check all versions of kernel module &lt;span style="color:#b44"&gt;&amp;#39;falco&amp;#39;&lt;/span&gt; in dkms:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- There are some versions of &lt;span style="color:#b44"&gt;&amp;#39;falco&amp;#39;&lt;/span&gt; module in dkms.
&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;* 3. Removing all the following versions from dkms:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2.0.0+driver
&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;- Removing 2.0.0+driver...
&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;Deleting module version: 2.0.0+driver
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;completely from the DKMS tree.
&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;Done.
&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;- OK! Removing &lt;span style="color:#b44"&gt;&amp;#39;2.0.0+driver&amp;#39;&lt;/span&gt; succeeded.
&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;&lt;span style="color:#666"&gt;[&lt;/span&gt;SUCCESS&lt;span style="color:#666"&gt;]&lt;/span&gt; Cleaning phase correctly terminated.
&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; Cleaning &lt;span style="color:#b8860b"&gt;phase&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;* Looking &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt; a falco module locally &lt;span style="color:#666"&gt;(&lt;/span&gt;kernel 5.10.0-14-cloud-amd64&lt;span style="color:#666"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Trying to download a prebuilt falco module from 172.17.0.2:8000/2.0.0%2Bdriver/x86_64/falco_debian_5.10.0-14-cloud-amd64_1.ko
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Download succeeded
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Success: falco module found and inserted
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:36:29+0000: Falco version 0.32.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:36:29+0000: Falco initialized with configuration file /etc/falco/falco.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:36:29+0000: Loading rules from file /etc/falco/falco_rules.yaml:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:36:29+0000: 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;2022-08-31T12:36:29+0000: Starting internal webserver, listening on port &lt;span style="color:#666"&gt;8765&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It's a similar output as before, but this time we can see:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;* Trying to download a prebuilt falco module from 172.17.0.2:8000/2.0.0%2Bdriver/x86_64/falco_debian_5.10.0-14-cloud-amd64_1.ko
* Download succeeded
* Success: falco module found and inserted
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The module has been successfully loaded and Falco can start properly.&lt;/p&gt;
&lt;h4 id="loading-the-ebpf-probe"&gt;Loading the eBPF Probe&lt;/h4&gt;
&lt;p&gt;For this, we will make use of another variable, &lt;code&gt;FALCO_BPF_PROBE&lt;/code&gt;. Like it happened with the &lt;code&gt;SKIP_DRIVER_LOADER&lt;/code&gt; variable, its value is not as relevant as the fact that the variable had been defined. We also need to keep the &lt;code&gt;DRIVERS_REPO&lt;/code&gt; variable, since the &lt;code&gt;falco-driver-loader&lt;/code&gt; script will look for the probe in that URL.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker rm -f falco-driver-test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;falco-driver-test
&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;$ docker run -it --privileged &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; --name falco-driver-test &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; -v /dev:/host/dev &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; -v /etc:/host/etc:ro &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; -v /proc:/host/proc:ro &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; -v /var/run/docker.sock:/host/var/run/docker.sock &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; -e &lt;span style="color:#b8860b"&gt;DRIVERS_REPO&lt;/span&gt;&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;DRIVERS_REPO&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; -e &lt;span style="color:#b8860b"&gt;FALCO_BPF_PROBE&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&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; docker.io/falcosecurity/falco:0.32.2
&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;* 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 &lt;span style="color:#a2f;font-weight:bold"&gt;for&lt;/span&gt;: falco &lt;span style="color:#b8860b"&gt;version&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;0.32.2, driver &lt;span style="color:#b8860b"&gt;version&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;2.0.0+driver
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Running falco-driver-loader with: &lt;span style="color:#b8860b"&gt;driver&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;bpf, &lt;span style="color:#b8860b"&gt;compile&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;yes, &lt;span style="color:#b8860b"&gt;download&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;yes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Mounting debugfs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Trying to download a prebuilt eBPF probe from 172.17.0.2:8000/2.0.0%2Bdriver/x86_64/falco_debian_5.10.0-14-cloud-amd64_1.o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Skipping compilation, eBPF probe is already present in /root/.falco/falco_debian_5.10.0-14-cloud-amd64_1.o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* eBPF probe located in /root/.falco/falco_debian_5.10.0-14-cloud-amd64_1.o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* Success: eBPF probe symlinked to /root/.falco/falco-bpf.o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:58:10+0000: Falco version 0.32.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:58:10+0000: Falco initialized with configuration file /etc/falco/falco.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:58:10+0000: Loading rules from file /etc/falco/falco_rules.yaml:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2022-08-31T12:58:10+0000: 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;2022-08-31T12:58:10+0000: Starting internal webserver, listening on port &lt;span style="color:#666"&gt;8765&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This time the output is easier to read: The driver is set to bpf, the URL of the HTTP container points to our local webserver, and it also shows where it downloads the probe before starting Falco.&lt;/p&gt;
&lt;h3 id="debugging"&gt;Debugging&lt;/h3&gt;
&lt;p&gt;As a final tip, if you want to start a container based on the regular &lt;code&gt;falco&lt;/code&gt; image to test the &lt;code&gt;falco-driver-loader&lt;/code&gt; script, we recommend starting the container with the &lt;code&gt;--entrypoint /bin/bash&lt;/code&gt; parameter. This will keep the &lt;code&gt;/docker-entrypoint.sh&lt;/code&gt; script from being executed (that one triggers &lt;code&gt;/usr/bin/falco-driver-loader&lt;/code&gt;) and you'll have a much more comfortable environment to work 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;$ docker run -it --privileged &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; --name falco-driver-test &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; -v /dev:/host/dev &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; -v /etc:/host/etc:ro &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; -v /proc:/host/proc:ro &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; -v /var/run/docker.sock:/host/var/run/docker.sock &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; -e &lt;span style="color:#b8860b"&gt;DRIVERS_REPO&lt;/span&gt;&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;DRIVERS_REPO&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; --entrypoint /bin/bash &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; docker.io/falcosecurity/falco:0.32.2
&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;root@e0c391e0cee1:/#
&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;Falco requires tapping into the kernel to be able to retrieve useful information from it. For that, it has two methods: loading a kernel module in the traditional way, or using an eBPF probe. Both of them instrumentalize the kernel and provide the functionality to retrieve the relevant data.&lt;/p&gt;
&lt;p&gt;Due to the infinite number of combinations of Linux kernels and distributions, it is extremely difficult to offer all possible kernels as downloadable assets. Besides, in some environments, it'll be a requirement to compile the driver of such a critical component. Learning how to use Falco Driverkit will help you to easily deploy Falco in more environments.&lt;/p&gt;</description></item></channel></rss>