<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux on Le Site de François</title><link>https://lesitedefrancois.be/en/tags/linux/</link><description>Recent content in Linux on Le Site de François</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>© 2026 François</copyright><atom:link href="https://lesitedefrancois.be/en/tags/linux/index.xml" rel="self" type="application/rss+xml"/><item><title>AIDE (Advanced Intrusion Detection Environment)</title><link>https://lesitedefrancois.be/en/security/aide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/aide/</guid><description>&lt;p&gt;&lt;strong&gt;AIDE (Advanced Intrusion Detection Environment)&lt;/strong&gt; is a host-based intrusion detection tool that implements &lt;strong&gt;file integrity monitoring (FIM)&lt;/strong&gt;: it builds a baseline database capturing cryptographic hashes and metadata for every file it is configured to watch, and on subsequent runs compares the live filesystem against that database, reporting anything that has been added, removed, or changed. Its security premise is detection after the fact: AIDE does not prevent modifications (that is the role of &lt;strong&gt;fapolicyd&lt;/strong&gt;, &lt;strong&gt;SELinux&lt;/strong&gt;, and &lt;strong&gt;IMA&lt;/strong&gt;), but it provides a reliable, auditable record that modifications occurred, when a check was run, and which specific attributes changed. An attacker who compromises a system and modifies a binary, a configuration file, a cron job, or an SSH &lt;code&gt;authorized_keys&lt;/code&gt; file will leave a fingerprint in the next AIDE check — provided the database has not also been compromised, which is the central operational concern the tool&amp;rsquo;s deployment model must address.&lt;/p&gt;</description></item><item><title>AppArmor (Application Armor)</title><link>https://lesitedefrancois.be/en/security/apparmor/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/apparmor/</guid><description>&lt;p&gt;&lt;strong&gt;AppArmor (Application Armor)&lt;/strong&gt; is a &lt;strong&gt;Mandatory Access Control (MAC)&lt;/strong&gt; system implemented as a major &lt;strong&gt;LSM&lt;/strong&gt; (Linux Security Module), developed originally by Immunix and now maintained by Canonical. It is the default MAC system on Ubuntu, Debian, and their derivatives, and the default container confinement mechanism for containerd and Docker on those distributions. Where &lt;strong&gt;SELinux&lt;/strong&gt; assigns security labels to every object on the system and enforces policy based on label interactions, AppArmor takes a fundamentally different approach: it confines programs by &lt;strong&gt;filesystem path&lt;/strong&gt;. A profile for &lt;code&gt;nginx&lt;/code&gt; lists the specific file paths that nginx is allowed to read, write, and execute, the network operations it may perform, and the Linux capabilities it may use — anything not listed is denied. No relabelling of the filesystem is required and no extended attributes are set: AppArmor&amp;rsquo;s confinement decisions are made purely from the path of the file being accessed and the identity of the confined process. This path-based model makes AppArmor profiles far simpler to read, write, and audit than SELinux policy, and eliminates the mislabelled-file failure mode that is the most common SELinux operational problem.&lt;/p&gt;</description></item><item><title>bootc (Bootable Containers)</title><link>https://lesitedefrancois.be/en/security/bootc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/bootc/</guid><description>&lt;p&gt;&lt;strong&gt;bootc&lt;/strong&gt; is a CNCF sandbox project, created by Colin Walters, that applies the OCI container model to operating system delivery. Where conventional container images package an application to run inside a host OS, a bootc image packages the entire OS — kernel (under &lt;code&gt;/usr/lib/modules&lt;/code&gt;), initrd, systemd units, firmware, and all userspace — as a standard &lt;strong&gt;OCI&lt;/strong&gt; image that can be built with &lt;code&gt;podman build&lt;/code&gt; or &lt;code&gt;buildah&lt;/code&gt;, stored in any OCI-conformant registry, signed with standard supply chain tools, and pulled to a machine where it becomes the running system. At runtime the base OS is not running inside a container; systemd is pid 1 as usual. The container image format is purely a transport and build model, not an execution model.&lt;/p&gt;</description></item><item><title>cgroups (Control Groups) v2</title><link>https://lesitedefrancois.be/en/security/cgroups/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/cgroups/</guid><description>&lt;p&gt;&lt;strong&gt;Control Groups (cgroups)&lt;/strong&gt; is a Linux kernel mechanism, introduced in 2.6.24 (2008), that organises processes into a hierarchy of named groups and uses &lt;strong&gt;controllers&lt;/strong&gt; to account for and limit each group&amp;rsquo;s consumption of CPU time, memory, I/O bandwidth, and process count. Every container runtime in existence — Docker, containerd, CRI-O, Podman — uses cgroups to enforce the resource limits declared in a container spec (&lt;code&gt;--memory&lt;/code&gt;, &lt;code&gt;--cpus&lt;/code&gt;, &lt;code&gt;requests.memory&lt;/code&gt;, &lt;code&gt;limits.cpu&lt;/code&gt;). Every systemd service on a modern Linux system runs in its own cgroup slice. Without cgroups, a container or service could consume all available memory, CPU, or file descriptors, starving other workloads on the same host. The current production version is &lt;strong&gt;cgroups v2&lt;/strong&gt; (also written cgroupv2, unified hierarchy), stable since kernel 4.5 and the default on all major distributions since RHEL 9, Ubuntu 21.10, and Fedora 31.&lt;/p&gt;</description></item><item><title>composefs</title><link>https://lesitedefrancois.be/en/security/composefs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/composefs/</guid><description>&lt;p&gt;&lt;strong&gt;composefs&lt;/strong&gt; is a Linux filesystem technology created by Alexander Larsson and Giuseppe Scrivano at Red Hat that provides cryptographically verified, read-only filesystem trees with opportunistic file-level sharing across images. Its motivating problem is a gap that neither &lt;strong&gt;dm-verity&lt;/strong&gt; nor plain &lt;strong&gt;overlayfs&lt;/strong&gt; fills cleanly: dm-verity provides strong integrity over a whole block device but requires a self-contained disk image and cannot share files between images; overlayfs allows layered, shared filesystems but protects only file contents (via &lt;strong&gt;fs-verity&lt;/strong&gt;) and not the directory structure or metadata — an attacker who can manipulate a file&amp;rsquo;s name, permissions, or position in the tree is not caught. composefs closes that gap by separately protecting content and metadata, then composing them at mount time.&lt;/p&gt;</description></item><item><title>dm-verity</title><link>https://lesitedefrancois.be/en/security/dm-verity/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/dm-verity/</guid><description>&lt;p&gt;&lt;strong&gt;dm-verity&lt;/strong&gt; is a Linux device mapper target, available since kernel 3.4, that provides &lt;strong&gt;transparent read-only integrity verification&lt;/strong&gt; for block devices. When a block device is mapped through dm-verity, every data block read from the underlying device is verified against a pre-computed &lt;strong&gt;Merkle tree&lt;/strong&gt; of cryptographic hashes before being returned to the caller — any modification to any block, whether from corruption, bit rot, or deliberate tampering, produces a hash mismatch that dm-verity detects and handles according to its configured error mode. The verification is transparent to the filesystem and applications mounted above it: they read from the dm-verity device as if it were a normal block device, with no awareness that every read is being hash-checked. The security guarantee is that the integrity of the entire block device is committed to by a single &lt;strong&gt;root hash&lt;/strong&gt; — a 32-byte SHA-256 value that covers the entire Merkle tree and therefore the entire data volume. If the root hash is known to be correct (because it was measured into a &lt;strong&gt;TPM&lt;/strong&gt; PCR, embedded in a &lt;strong&gt;UKI&lt;/strong&gt;, or signed by a &lt;strong&gt;Secure Boot&lt;/strong&gt; key), then any verified read from the dm-verity device is guaranteed to return exactly the data that was present when the Merkle tree was computed.&lt;/p&gt;</description></item><item><title>eBPF (Extended Berkeley Packet Filter)</title><link>https://lesitedefrancois.be/en/security/ebpf/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/ebpf/</guid><description>&lt;p&gt;&lt;strong&gt;eBPF (Extended Berkeley Packet Filter)&lt;/strong&gt; is a Linux kernel subsystem, its modern form dating to kernel 3.18 (2014), that allows user-authored programs to run inside the kernel with near-native performance, subject to safety guarantees enforced at load time by a &lt;strong&gt;verifier&lt;/strong&gt;. The name is historical: the original BPF (Berkeley Packet Filter, 1992) was a narrow packet filtering mechanism for tools like &lt;code&gt;tcpdump&lt;/code&gt;. eBPF extended the instruction set, registers, and capabilities far beyond packet filtering into a general-purpose in-kernel programmability platform. The central design constraint is that eBPF programs must be provably safe: they cannot crash the kernel, loop infinitely, or access memory out of bounds. The verifier statically analyses every program at load time, checking that all memory accesses are bounds-checked, all loops are bounded or unrolled, and all pointer dereferences are preceded by null checks. Only programs that pass verification are accepted; once accepted, the kernel JIT-compiles the eBPF bytecode to native machine code for the host architecture — x86-64, ARM64, RISC-V — so eBPF programs run at the same speed as compiled kernel code, not as an interpreter.&lt;/p&gt;</description></item><item><title>fapolicyd (File Access Policy Daemon)</title><link>https://lesitedefrancois.be/en/security/fapolicyd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/fapolicyd/</guid><description>&lt;p&gt;&lt;strong&gt;fapolicyd (File Access Policy Daemon)&lt;/strong&gt; is an application allowlisting framework for Linux, developed by Red Hat and shipped as a supported component of RHEL 8+. Its security premise is supply-chain integrity at the execution layer: only software that was installed through a trusted package manager (DNF/RPM) or explicitly declared as trusted by an administrator may execute on the system. An attacker who achieves a foothold and drops a new binary — a reverse shell, a lateral movement tool, a cryptominer — will find that binary blocked at execution time, because it is absent from the trust database, regardless of its Unix permissions or SELinux label. fapolicyd addresses a different dimension of access control than &lt;strong&gt;SELinux&lt;/strong&gt;: SELinux models how applications behave (what resources they may access); fapolicyd models whether applications are trusted at all (whether they may execute in the first place). The two are complementary: SELinux confines a trusted application&amp;rsquo;s behaviour; fapolicyd prevents untrusted applications from running.&lt;/p&gt;</description></item><item><title>firewalld</title><link>https://lesitedefrancois.be/en/security/firewalld/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/firewalld/</guid><description>&lt;p&gt;&lt;strong&gt;firewalld&lt;/strong&gt; is the firewall management daemon on RHEL, CentOS Stream, Fedora, SUSE, and their derivatives, providing a higher-level policy model and a runtime-safe management API on top of &lt;strong&gt;nftables&lt;/strong&gt; (RHEL 8+ / Fedora 32+) or iptables (older systems). Its defining feature is &lt;strong&gt;runtime versus permanent configuration&lt;/strong&gt;: firewall rule changes can be applied immediately to the running system without restarting the service or dropping existing connections (&lt;code&gt;--runtime&lt;/code&gt;, the default), and separately persisted to disk so they survive reboots (&lt;code&gt;--permanent&lt;/code&gt;). This two-phase model solves the operational problem that raw nftables or iptables rule changes traditionally required either accepting a momentary policy gap during reload or building custom transaction logic. The daemon exposes its API over &lt;strong&gt;D-Bus&lt;/strong&gt;, allowing NetworkManager, libvirt, Podman, and other system components to request firewall policy changes programmatically — when a VM is started in libvirt or a container port is published in Podman, the respective tool calls firewalld over D-Bus to open the required port rather than directly manipulating nftables rules.&lt;/p&gt;</description></item><item><title>fs-verity</title><link>https://lesitedefrancois.be/en/security/fs-verity/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/fs-verity/</guid><description>&lt;p&gt;&lt;strong&gt;fs-verity&lt;/strong&gt; is a Linux kernel filesystem feature, merged in kernel 5.4, that provides &lt;strong&gt;read-only, content-addressable integrity verification at the individual file level&lt;/strong&gt;. When fs-verity is enabled on a file (via the &lt;code&gt;FS_IOC_ENABLE_VERITY&lt;/code&gt; ioctl), the kernel builds a &lt;strong&gt;Merkle tree&lt;/strong&gt; of the file&amp;rsquo;s content blocks and stores it in a filesystem-specific location (in an ext4 or f2fs Merkle tree block range, or in a separate xattr-adjacent structure on btrfs). From that point, the file becomes immutable — writes are rejected — and every page read from the file is verified against the Merkle tree before being returned to userspace. The file&amp;rsquo;s &lt;strong&gt;fs-verity digest&lt;/strong&gt; is the SHA-256 (or SHA-512) root hash of the Merkle tree, computable without reading the file at all once the tree is built: &lt;code&gt;fsverity digest file&lt;/code&gt; returns this digest. A file&amp;rsquo;s fs-verity digest is a stable, content-derived identity: two files with the same content have the same digest, and any byte-level modification produces a different digest that verification will detect and reject with &lt;code&gt;EIO&lt;/code&gt;. The kernel caches verified Merkle tree nodes in the page cache alongside file data, so the amortised verification overhead is low for sequentially-read files.&lt;/p&gt;</description></item><item><title>GRUB (GNU GRand Unified Bootloader)</title><link>https://lesitedefrancois.be/en/security/grub/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/grub/</guid><description>&lt;p&gt;&lt;strong&gt;GRUB (GNU GRand Unified Bootloader)&lt;/strong&gt; is the bootloader used by the majority of Linux distributions on x86 and x86-64 systems. Its role is to bridge the gap between what firmware hands control to and what the Linux kernel needs: firmware (BIOS or UEFI) loads GRUB, and GRUB locates the kernel image and initrd on disk, assembles a kernel command line, and transfers control to the kernel. Because GRUB understands a wide range of filesystem formats — ext4, XFS, Btrfs, FAT, and more — it can read its own configuration and the kernel directly from the root or boot partition without any intermediate step, which is what distinguishes it from simpler bootloaders that can only read from FAT.&lt;/p&gt;</description></item><item><title>IMA (Integrity Measurement Architecture)</title><link>https://lesitedefrancois.be/en/security/ima/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/ima/</guid><description>&lt;p&gt;&lt;strong&gt;IMA (Integrity Measurement Architecture)&lt;/strong&gt; is a Linux kernel subsystem, merged in kernel 2.6.30, that hooks into the kernel&amp;rsquo;s file access paths — &lt;code&gt;execve()&lt;/code&gt;, &lt;code&gt;mmap()&lt;/code&gt;, &lt;code&gt;open()&lt;/code&gt; — and computes a cryptographic hash of each file&amp;rsquo;s contents before it is accessed, according to a configurable policy. It is the &lt;strong&gt;runtime&lt;/strong&gt; half of the Linux integrity story: where &lt;strong&gt;TPM&lt;/strong&gt; PCR measurements and &lt;strong&gt;Secure Boot&lt;/strong&gt; cover what was loaded during the boot sequence, IMA covers what happens after the OS is running, hashing executables, libraries, kernel modules, firmware, and configuration files as they are opened, creating a continuously updated record of everything the system has actually used.&lt;/p&gt;</description></item><item><title>initramfs (initial RAM filesystem)</title><link>https://lesitedefrancois.be/en/security/initramfs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/initramfs/</guid><description>&lt;p&gt;&lt;strong&gt;initramfs (initial RAM filesystem)&lt;/strong&gt; is the temporary root filesystem the Linux kernel mounts immediately after loading itself and before switching to the machine’s real root. The bootloader — &lt;strong&gt;GRUB&lt;/strong&gt;, &lt;strong&gt;systemd-boot&lt;/strong&gt;, or firmware loading a &lt;strong&gt;UKI&lt;/strong&gt; — passes a compressed &lt;strong&gt;cpio&lt;/strong&gt; image (historically called an &lt;em&gt;initrd&lt;/em&gt;, though modern Linux always unpacks it as an initramfs into &lt;strong&gt;tmpfs&lt;/strong&gt;, not a separate ramdisk block device). The kernel extracts this archive into an in-memory tree, executes &lt;code&gt;/init&lt;/code&gt; as pid 1, and that early userspace environment is responsible for everything the bare kernel cannot yet do: loading storage and filesystem kernel modules, bringing up networking, discovering and unlocking &lt;strong&gt;LUKS&lt;/strong&gt; volumes, activating &lt;strong&gt;LVM&lt;/strong&gt; or multipath devices, mounting the true root partition, and finally calling &lt;code&gt;switch_root&lt;/code&gt; (or &lt;code&gt;pivot_root&lt;/code&gt;) to hand control to the installed system’s init — typically &lt;strong&gt;systemd&lt;/strong&gt; on current distributions. If the initramfs fails, the boot stops before userspace on the real root ever starts; if it succeeds, it is discarded and its memory reclaimed once the pivot completes.&lt;/p&gt;</description></item><item><title>iptables</title><link>https://lesitedefrancois.be/en/security/iptables/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/iptables/</guid><description>&lt;p&gt;&lt;strong&gt;iptables&lt;/strong&gt; is the user-space command-line interface to the Linux kernel&amp;rsquo;s &lt;strong&gt;Netfilter&lt;/strong&gt; packet filtering framework, the dominant firewall tool on Linux from its introduction in 2001 until nftables began replacing it in the mid-2010s. Netfilter inserts hook points at five positions in the kernel&amp;rsquo;s IPv4 (and separately IPv6, via &lt;code&gt;ip6tables&lt;/code&gt;) packet processing path: &lt;strong&gt;PREROUTING&lt;/strong&gt; (immediately after a packet arrives, before routing), &lt;strong&gt;INPUT&lt;/strong&gt; (packets destined for the local host), &lt;strong&gt;FORWARD&lt;/strong&gt; (packets being routed through the host), &lt;strong&gt;OUTPUT&lt;/strong&gt; (packets generated by local processes), and &lt;strong&gt;POSTROUTING&lt;/strong&gt; (after routing, before transmission). At each hook point, Netfilter calls into the active &lt;strong&gt;tables&lt;/strong&gt;, each of which contains ordered &lt;strong&gt;chains&lt;/strong&gt; of &lt;strong&gt;rules&lt;/strong&gt;. A rule is a match condition (source IP, destination port, protocol, connection state, interface, packet mark, and many more via match extensions) paired with a &lt;strong&gt;target&lt;/strong&gt; — the action to take if the rule matches: &lt;code&gt;ACCEPT&lt;/code&gt;, &lt;code&gt;DROP&lt;/code&gt;, &lt;code&gt;REJECT&lt;/code&gt;, &lt;code&gt;LOG&lt;/code&gt;, &lt;code&gt;MASQUERADE&lt;/code&gt;, &lt;code&gt;DNAT&lt;/code&gt;, &lt;code&gt;SNAT&lt;/code&gt;, or a jump to a user-defined chain. Rules are evaluated in order; the first matching rule&amp;rsquo;s target is applied and evaluation stops (unless the target is &lt;code&gt;LOG&lt;/code&gt; or another non-terminating target). If no rule matches, the chain&amp;rsquo;s &lt;strong&gt;policy&lt;/strong&gt; (the default target) applies.&lt;/p&gt;</description></item><item><title>Keylime</title><link>https://lesitedefrancois.be/en/security/keylime/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/keylime/</guid><description>&lt;p&gt;&lt;strong&gt;Keylime&lt;/strong&gt; is a CNCF project, originating at MIT Lincoln Laboratory, that turns the raw cryptographic primitives of the &lt;strong&gt;TPM&lt;/strong&gt; into an operable remote attestation system for fleets of Linux machines. Its mission is narrow but important: given that a TPM can produce a signed quote over PCR values, and that &lt;strong&gt;IMA&lt;/strong&gt; can accumulate a runtime measurement log into PCR 10, Keylime provides the infrastructure to continuously collect those quotes from many machines, verify them against policy, react to failures, and gate secret delivery on attestation success — without requiring operators to understand TPM protocols directly.&lt;/p&gt;</description></item><item><title>KVM/QEMU</title><link>https://lesitedefrancois.be/en/security/kvm-qemu/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/kvm-qemu/</guid><description>&lt;p&gt;&lt;strong&gt;KVM&lt;/strong&gt; (Kernel-based Virtual Machine) and &lt;strong&gt;QEMU&lt;/strong&gt; (Quick Emulator) solve different halves of the same problem and are almost always used together. &lt;strong&gt;KVM&lt;/strong&gt; is a Linux kernel module that turns the kernel into a hypervisor: with &lt;strong&gt;Intel VT-x&lt;/strong&gt; or &lt;strong&gt;AMD-V&lt;/strong&gt;, guest CPUs run on real hardware at near-native speed and guest memory is managed through extended page tables. KVM has no device model of its own — no disk, network, or firmware emulation. &lt;strong&gt;QEMU&lt;/strong&gt; supplies that in userspace (virtio, USB, VGA, ACPI) and controls KVM by issuing &lt;strong&gt;ioctl&lt;/strong&gt; calls on &lt;strong&gt;&lt;code&gt;/dev/kvm&lt;/code&gt;&lt;/strong&gt; — creating VMs, mapping memory, running vCPUs via &lt;code&gt;KVM_RUN&lt;/code&gt; — while &lt;strong&gt;QMP&lt;/strong&gt; exposes external management over a Unix socket. &lt;strong&gt;libvirt&lt;/strong&gt;, originally from Red Hat, sits above both: it translates &lt;strong&gt;domain XML&lt;/strong&gt; into QEMU command lines and lifecycle operations. The stack is the default on Linux: &lt;strong&gt;RHEL&lt;/strong&gt; ships &lt;code&gt;qemu-kvm&lt;/code&gt;, &lt;strong&gt;OpenShift Virtualization&lt;/strong&gt; runs &lt;strong&gt;KubeVirt&lt;/strong&gt; (&lt;code&gt;virt-launcher&lt;/code&gt; → libvirt → QEMU), and &lt;strong&gt;OpenShift Sandboxed Containers&lt;/strong&gt; uses &lt;strong&gt;Kata Containers&lt;/strong&gt; with the same hypervisor to isolate pods in micro-VMs.&lt;/p&gt;</description></item><item><title>libvirt</title><link>https://lesitedefrancois.be/en/security/libvirt/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/libvirt/</guid><description>&lt;p&gt;&lt;strong&gt;libvirt&lt;/strong&gt; is an open-source library, daemon, and toolset that provides a unified, stable API for managing virtualisation infrastructure — virtual machines, storage volumes, virtual networks, and host devices — across multiple hypervisor backends. It was originally written by Daniel Berrange at Red Hat and has since become the standard virtualisation management layer on Linux, underpinning &lt;strong&gt;KubeVirt&lt;/strong&gt;, OpenStack Nova, oVirt/RHEV, Proxmox, and the &lt;code&gt;virsh&lt;/code&gt; / &lt;code&gt;virt-manager&lt;/code&gt; administrative tools. The core value proposition is &lt;strong&gt;hypervisor abstraction&lt;/strong&gt;: the same &lt;code&gt;libvirt&lt;/code&gt; API call creates a VM on KVM/QEMU, Xen, LXC, or (historically) VMware ESXi, without the management layer caring about the underlying implementation. In practice, the KVM/QEMU driver is the dominant use case on Linux; the others are progressively less-maintained but remain supported. libvirt communicates with hypervisors through driver-specific mechanisms — with QEMU, it generates the full QEMU command line from the domain XML definition and manages the QEMU process lifecycle, communicating with the running VM through the QEMU Monitor Protocol (QMP) over a Unix socket.&lt;/p&gt;</description></item><item><title>LSM (Linux Security Module)</title><link>https://lesitedefrancois.be/en/security/lsm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/lsm/</guid><description>&lt;p&gt;&lt;strong&gt;Linux Security Modules (LSM)&lt;/strong&gt; is a hook-based framework integrated into the Linux kernel since 2.6 (2003) that provides a general mechanism for implementing Mandatory Access Control (MAC) without modifying the core kernel. Its origin is the NSA&amp;rsquo;s presentation of SELinux at the 2001 Linux Kernel Summit: Linus Torvalds accepted the need for flexible access control but refused to hardcode a single security model, directing instead the development of a framework into which any security model could be plugged. The result is LSM: a set of strategically placed hook functions throughout the kernel&amp;rsquo;s execution paths — over 240 hooks in recent kernels — at points where security-relevant decisions occur: file open, process creation, capability checks, socket operations, IPC access, memory mapping, and more. Each hook is a call into the currently active security module(s), which examine the operation&amp;rsquo;s context and return allow or deny. The core kernel enforces whatever the security module decides.&lt;/p&gt;</description></item><item><title>LUKS (Linux Unified Key Setup)</title><link>https://lesitedefrancois.be/en/security/luks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/luks/</guid><description>&lt;p&gt;&lt;strong&gt;LUKS (Linux Unified Key Setup)&lt;/strong&gt; is the standard specification for block device encryption on Linux, created by Clemens Fruhwirth in 2004. It sits above the kernel&amp;rsquo;s &lt;strong&gt;dm-crypt&lt;/strong&gt; subsystem — which performs the actual AES sector-by-sector encryption via the device mapper — and adds a structured, on-disk header that decouples key management from the encryption itself. Any block device can be a LUKS container: a partition, a logical volume, a loop device; anything that sits beneath it (filesystem, swap, LVM) is encrypted transparently, with no changes required to the software using it. The managed &lt;code&gt;cryptsetup&lt;/code&gt; tool and the &lt;code&gt;libcryptsetup&lt;/code&gt; library provide userspace access to LUKS volumes, and are the canonical interface for all operations on them.&lt;/p&gt;</description></item><item><title>Measured Boot</title><link>https://lesitedefrancois.be/en/security/measured-boot/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/measured-boot/</guid><description>&lt;p&gt;&lt;strong&gt;Measured Boot&lt;/strong&gt; is a boot process architecture in which each component in the boot chain — firmware, bootloader, kernel, initrd, kernel command line — is cryptographically hashed and that hash is recorded into a &lt;strong&gt;TPM&lt;/strong&gt; Platform Configuration Register (PCR) before the component executes. The critical distinction from &lt;strong&gt;Secure Boot&lt;/strong&gt; is in what each mechanism provides: Secure Boot is an &lt;em&gt;enforcement&lt;/em&gt; mechanism that prevents unauthorised components from running at all; Measured Boot is a &lt;em&gt;recording&lt;/em&gt; mechanism that creates a tamper-evident log of exactly what did run, without necessarily preventing anything. The two are complementary and typically deployed together — Secure Boot enforces a policy at boot time, Measured Boot produces the evidence that the policy was enforced as claimed. A system can have Measured Boot without Secure Boot (it records everything that ran, even unsigned components), but Secure Boot without Measured Boot provides enforcement with no attestable evidence of what was enforced.&lt;/p&gt;</description></item><item><title>NBDE / Clevis / Tang (Network-Bound Disk Encryption)</title><link>https://lesitedefrancois.be/en/security/nbde-clevis-tang/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/nbde-clevis-tang/</guid><description>&lt;p&gt;&lt;strong&gt;NBDE (Network-Bound Disk Encryption)&lt;/strong&gt; is an approach to automatic &lt;strong&gt;LUKS&lt;/strong&gt; disk unlocking that binds the volume key not to hardware state (a &lt;strong&gt;TPM&lt;/strong&gt; PCR measurement) but to network presence: a &lt;strong&gt;LUKS&lt;/strong&gt;-encrypted volume unlocks automatically at boot if and only if the machine can reach a designated &lt;strong&gt;Tang&lt;/strong&gt; server on a trusted network. Remove the machine from that network — because it was stolen, because a data centre drive was pulled, because someone exfiltrated the hardware — and the volume key becomes unrecoverable without a fallback passphrase. The threat model is therefore complementary to TPM-based unlocking: TPM sealing asks &amp;ldquo;is this the right software stack?&amp;rdquo; and locks the key to a specific platform measurement; NBDE asks &amp;ldquo;is this machine on the trusted network?&amp;rdquo; and locks the key to network presence. Neither addresses both threat classes alone, which is why the two are routinely combined — and why RHEL formalises NBDE as a subcategory of the broader &lt;strong&gt;Policy-Based Decryption (PBD)&lt;/strong&gt; framework that the Clevis pin system implements.&lt;/p&gt;</description></item><item><title>nftables</title><link>https://lesitedefrancois.be/en/security/nftables/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/nftables/</guid><description>&lt;p&gt;&lt;strong&gt;nftables&lt;/strong&gt; is the successor to &lt;strong&gt;iptables&lt;/strong&gt; within the Linux Netfilter framework, merged into the mainline kernel in 3.13 (2014) and now the default firewall backend on all major distributions — Debian 10+, Ubuntu 20.04+, RHEL 8+, Fedora 32+. It replaces not just iptables but the entire family of legacy Netfilter frontends: &lt;code&gt;ip6tables&lt;/code&gt; (IPv6), &lt;code&gt;arptables&lt;/code&gt; (ARP), and &lt;code&gt;ebtables&lt;/code&gt; (Ethernet bridging) are all unified under a single &lt;code&gt;nft&lt;/code&gt; command and a single kernel subsystem. The kernel component is a generic, protocol-independent packet classification engine; the protocol-specific logic (IPv4, IPv6, ARP, bridging) is expressed in user-space rule syntax rather than hardcoded in separate kernel modules. This unification eliminates the fragmented ruleset management of the iptables era, where a firewall with consistent IPv4/IPv6 and bridging policy required coordinating four separate tools with four separate rulesets and four separate persistence mechanisms.&lt;/p&gt;</description></item><item><title>RHCOS (Red Hat Enterprise Linux CoreOS)</title><link>https://lesitedefrancois.be/en/security/rhcos/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/rhcos/</guid><description>&lt;p&gt;&lt;strong&gt;RHCOS (Red Hat Enterprise Linux CoreOS)&lt;/strong&gt; is the operating system that runs on every OpenShift control plane and worker node. It is not a general-purpose Linux distribution — it is a purpose-built, immutable, container-optimised OS designed to run exclusively as a managed node in an OpenShift cluster. Its security posture is architecturally different from a hardened RHEL installation: rather than hardening a mutable system through configuration management, RHCOS makes the OS layer structurally resistant to modification by design. The root filesystem&amp;rsquo;s &lt;code&gt;/usr&lt;/code&gt; tree is &lt;strong&gt;read-only&lt;/strong&gt; (enforced at mount time by rpm-ostree and, in recent versions, by &lt;strong&gt;composefs&lt;/strong&gt; over the OSTree object store), &lt;code&gt;/etc&lt;/code&gt; and &lt;code&gt;/var&lt;/code&gt; are writable but managed exclusively by the &lt;strong&gt;Machine Config Operator (MCO)&lt;/strong&gt;, and no package manager is available at runtime for ad-hoc software installation. An operator who wants to change any node-level configuration — kernel arguments, sysctl settings, systemd units, certificates, kubelet configuration — creates a &lt;strong&gt;MachineConfig&lt;/strong&gt; object in the OpenShift API; the MCO renders it into an Ignition config, applies it to the target MachineConfigPool (master, worker, or custom), and drains and reboots the affected nodes in a rolling fashion. Direct SSH access to nodes for configuration changes is explicitly unsupported and actively discouraged — &lt;code&gt;oc debug node/&amp;lt;name&amp;gt;&lt;/code&gt; is the supported emergency access path, dropping into a privileged container on the node&amp;rsquo;s host namespaces under audit.&lt;/p&gt;</description></item><item><title>seccomp (Secure Computing Mode)</title><link>https://lesitedefrancois.be/en/security/seccomp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/seccomp/</guid><description>&lt;p&gt;&lt;strong&gt;seccomp (Secure Computing Mode)&lt;/strong&gt; is a Linux kernel facility, activated by the &lt;code&gt;seccomp(2)&lt;/code&gt; syscall, that restricts which system calls a process may subsequently invoke. In its original &lt;code&gt;SECCOMP_SET_MODE_STRICT&lt;/code&gt; form (2005) it was a blunt instrument: the process could call only &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;write&lt;/code&gt;, &lt;code&gt;_exit&lt;/code&gt;, and &lt;code&gt;sigreturn&lt;/code&gt;. The operationally useful form is &lt;code&gt;SECCOMP_SET_MODE_FILTER&lt;/code&gt;, introduced in kernel 3.5 (2012), which accepts a &lt;strong&gt;BPF&lt;/strong&gt; (classic BPF, predating eBPF) filter program that receives each syscall&amp;rsquo;s number and arguments and returns one of several verdicts: &lt;code&gt;ALLOW&lt;/code&gt; (continue normally), &lt;code&gt;ERRNO&lt;/code&gt; (return a specified error to the process), &lt;code&gt;KILL_PROCESS&lt;/code&gt; or &lt;code&gt;KILL_THREAD&lt;/code&gt; (terminate immediately without giving the process a chance to handle signals), &lt;code&gt;TRAP&lt;/code&gt; (deliver &lt;code&gt;SIGSYS&lt;/code&gt;), or &lt;code&gt;TRACE&lt;/code&gt; (notify a ptracer). Once installed, a seccomp filter cannot be removed, and child processes created by &lt;code&gt;fork()&lt;/code&gt; or threads created by &lt;code&gt;clone()&lt;/code&gt; inherit it. Filters may only add restrictions, never loosen them — so a chain of filters is the intersection of all their allowlists. The filter runs entirely in the kernel, in BPF bytecode verified for safety, before the syscall implementation is entered, making it extremely low-overhead relative to the security it provides.&lt;/p&gt;</description></item><item><title>Secure Boot (UEFI Secure Boot)</title><link>https://lesitedefrancois.be/en/security/secure-boot/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/secure-boot/</guid><description>&lt;p&gt;&lt;strong&gt;UEFI Secure Boot&lt;/strong&gt; is a firmware-level mechanism that ensures each binary executed during the boot process — bootloader, kernel, UEFI drivers — is cryptographically signed by a key the firmware trusts, before it is allowed to run. It is defined in the UEFI specification and implemented by the firmware on virtually all modern x86 and ARM platforms. Its threat model is bootkits and rootkits that install themselves before the OS loads and therefore survive reboots, OS reinstalls, and cannot be detected by any software running after them.&lt;/p&gt;</description></item><item><title>SELinux (Security-Enhanced Linux)</title><link>https://lesitedefrancois.be/en/security/selinux/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/selinux/</guid><description>&lt;p&gt;&lt;strong&gt;SELinux (Security-Enhanced Linux)&lt;/strong&gt; is a &lt;strong&gt;Mandatory Access Control (MAC)&lt;/strong&gt; implementation developed by the NSA and released as open source in 2000, merged into the mainline Linux kernel in 2.6 via the &lt;strong&gt;LSM&lt;/strong&gt; framework in 2003. Its defining characteristic is &lt;strong&gt;default deny&lt;/strong&gt;: unlike the standard Linux Discretionary Access Control model (file permission bits), where anything not explicitly forbidden is permitted, SELinux refuses all access that is not explicitly allowed by policy. Every process and every object — every file, socket, pipe, device node, and IPC object — carries a &lt;strong&gt;security context&lt;/strong&gt; (also called a label) of the form &lt;code&gt;user:role:type:level&lt;/code&gt;. The policy is a compiled set of rules, loaded at boot, that defines precisely which combinations of process context and object context may interact and how. An Apache web server process running in the &lt;code&gt;httpd_t&lt;/code&gt; domain can read files labelled &lt;code&gt;httpd_sys_content_t&lt;/code&gt; but is denied access to files labelled &lt;code&gt;user_home_t&lt;/code&gt; or &lt;code&gt;shadow_t&lt;/code&gt;, regardless of what Unix file permission bits say. If the web server is compromised, the attacker is confined to what &lt;code&gt;httpd_t&lt;/code&gt; permits — typically a narrow, well-defined set of files and network operations — rather than having the full access of the user account running Apache.&lt;/p&gt;</description></item><item><title>SSH (Secure Shell)</title><link>https://lesitedefrancois.be/en/security/ssh/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/ssh/</guid><description>&lt;p&gt;&lt;strong&gt;SSH (Secure Shell)&lt;/strong&gt; is a cryptographic protocol, standardised in RFC 4251–4254, that provides a secure channel over an unsecured network for remote login, remote command execution, file transfer (via SFTP and SCP), and general TCP port forwarding. It replaced the plaintext protocols it was designed to obsolete — Telnet, rlogin, rsh, rcp — by providing mutual authentication and full session encryption. SSH is the universal administrative access mechanism for Linux servers, network devices, and embedded systems, and the transport layer for Git over SSH, Ansible, Fabric, and most configuration management tooling. The protocol stack has three layers: &lt;strong&gt;SSH-TRANS&lt;/strong&gt; (the transport layer — handles the initial key exchange, server authentication, and establishes the encrypted channel), &lt;strong&gt;SSH-AUTH&lt;/strong&gt; (the authentication protocol — authenticates the client to the server using one of several methods), and &lt;strong&gt;SSH-CONN&lt;/strong&gt; (the connection protocol — multiplexes the encrypted channel into multiple logical channels for sessions, port forwards, and X11 forwarding).&lt;/p&gt;</description></item><item><title>SSSD (System Security Services Daemon)</title><link>https://lesitedefrancois.be/en/security/sssd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/sssd/</guid><description>&lt;p&gt;&lt;strong&gt;SSSD (System Security Services Daemon)&lt;/strong&gt; is a multi-daemon suite that connects Linux systems to remote identity and authentication providers, presenting their data through the standard Linux identity interfaces — &lt;strong&gt;NSS (Name Service Switch)&lt;/strong&gt; for identity lookups (user names, UIDs, GIDs, group membership) and &lt;strong&gt;PAM (Pluggable Authentication Modules)&lt;/strong&gt; for authentication and session management — without creating local user accounts. It was originally developed as a component of the FreeIPA project at Red Hat, introduced in Fedora 11 (2009), and quickly became the standard identity integration layer across RHEL, Fedora, Ubuntu, Debian, and most enterprise Linux distributions. Before SSSD, integrating a Linux host with &lt;strong&gt;LDAP&lt;/strong&gt; or &lt;strong&gt;AD&lt;/strong&gt; required configuring &lt;code&gt;nss_ldap&lt;/code&gt;, &lt;code&gt;pam_ldap&lt;/code&gt;, &lt;code&gt;pam_krb5&lt;/code&gt;, and &lt;code&gt;pam_winbind&lt;/code&gt; independently — each with its own caching (or lack thereof), its own reconnection logic, and its own configuration syntax. SSSD replaced this collection with a single, unified daemon providing caching, offline authentication, multi-domain support, and access control in one place.&lt;/p&gt;</description></item><item><title>Syscall (System Call)</title><link>https://lesitedefrancois.be/en/security/syscall/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/syscall/</guid><description>&lt;p&gt;A &lt;strong&gt;system call (syscall)&lt;/strong&gt; is the formal interface through which a user-space process asks the kernel to perform a privileged operation on its behalf — opening a file, allocating memory, creating a process, establishing a network connection, sending a signal, or any other action that requires kernel mediation. User-space code runs at CPU privilege level 3 (ring 3) and cannot directly access hardware, manipulate kernel data structures, or perform I/O; the kernel runs at ring 0 with unrestricted access. A syscall is the crossing point: the process places its request in a defined register convention and issues a &lt;code&gt;syscall&lt;/code&gt; instruction (on x86-64) that atomically switches the CPU to ring 0 and transfers control to the kernel&amp;rsquo;s syscall dispatch table. The kernel validates the request, performs the operation if permitted by standard Unix permissions and any active &lt;strong&gt;LSM&lt;/strong&gt; hooks, and returns the result. From a security perspective, the syscall boundary is the complete list of what a process can ask the kernel to do — and therefore the complete list of operations that security controls like &lt;strong&gt;seccomp&lt;/strong&gt; and &lt;strong&gt;BPF LSM&lt;/strong&gt; can police.&lt;/p&gt;</description></item><item><title>TCB (Trusted Computing Base)</title><link>https://lesitedefrancois.be/en/security/tcb/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/tcb/</guid><description>&lt;p&gt;The &lt;strong&gt;Trusted Computing Base (TCB)&lt;/strong&gt; is everything you must trust for your security guarantees to hold: CPU and firmware, the host kernel, the hypervisor, the container runtime, the kubelet, identity and secrets infrastructure, and any management plane that can change workload configuration. If any component in the TCB is buggy, misconfigured, or controlled by an adversary, the whole security argument fails — regardless of how well the application itself is written. The classic design principle is &lt;strong&gt;TCB minimisation&lt;/strong&gt;: keep this set as small as possible, because every added component is another place where a flaw can void your policy. &amp;ldquo;Trusted&amp;rdquo; here does not mean &amp;ldquo;trustworthy in practice&amp;rdquo;; it means &amp;ldquo;assumed correct by the security model.&amp;rdquo;&lt;/p&gt;</description></item><item><title>UKI (Unified Kernel Image)</title><link>https://lesitedefrancois.be/en/security/uki/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/uki/</guid><description>&lt;p&gt;A &lt;strong&gt;Unified Kernel Image (UKI)&lt;/strong&gt; is a single EFI executable that packages together the Linux kernel, the initramfs (initrd), the kernel command line, and optionally other resources like a splash screen or system credentials. Instead of relying on a bootloader to assemble these components at runtime, a UKI bundles them statically into one signed binary.&lt;/p&gt;</description></item><item><title>USBGuard</title><link>https://lesitedefrancois.be/en/security/usbguard/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/usbguard/</guid><description>&lt;p&gt;&lt;strong&gt;USBGuard&lt;/strong&gt; is a security framework for Linux that controls which USB devices are permitted to interact with the system. It sits above the kernel&amp;rsquo;s native USB authorisation subsystem — a per-device authorisation flag in the USB core that determines whether a device can be configured and begin sending data — and enforces a policy defined in a rule file against every device that connects or is present at startup. The threat model USBGuard addresses is both insider threat (unauthorised storage devices, data exfiltration) and hardware attack: &lt;strong&gt;BadUSB&lt;/strong&gt; devices — malicious firmware embedded in devices that present themselves as HID keyboards, network adapters, or other trusted classes — can be blocked by a sufficiently specific USBGuard policy that restricts which USB interface classes are permitted. A USB device that claims to be a keyboard (&lt;code&gt;03:01:01&lt;/code&gt;) but was not explicitly authorised cannot send keystrokes; a USB storage device plugged into a workstation with a policy that only allows a specific keyboard and mouse is blocked outright. USBGuard cannot protect against devices present at boot (before the daemon starts), so it is a defence-in-depth control for the running OS rather than a substitute for physical port security.&lt;/p&gt;</description></item><item><title>WireGuard</title><link>https://lesitedefrancois.be/en/security/wireguard/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lesitedefrancois.be/en/security/wireguard/</guid><description>&lt;p&gt;&lt;strong&gt;WireGuard&lt;/strong&gt; is a VPN protocol and implementation designed by Jason Donenfeld, merged into the Linux kernel in 5.6 (2020) and subsequently ported to Windows, macOS, iOS, Android, and BSD. Its defining characteristic is &lt;strong&gt;radical simplicity&lt;/strong&gt;: the reference Linux kernel implementation is approximately 4,000 lines of code, compared to tens of thousands for &lt;strong&gt;IPsec&lt;/strong&gt;&amp;rsquo;s XFRM subsystem and hundreds of thousands for OpenVPN. This simplicity is a deliberate security property — a smaller codebase has a smaller attack surface, is easier to audit, and is less likely to contain implementation vulnerabilities. WireGuard achieves this by making every design decision that allows optionality to be eliminated: there is no algorithm negotiation, no handshake negotiation, no cipher suite selection. The cryptographic suite is fixed: &lt;strong&gt;X25519&lt;/strong&gt; for key exchange, &lt;strong&gt;ChaCha20-Poly1305&lt;/strong&gt; for authenticated encryption, &lt;strong&gt;BLAKE2s&lt;/strong&gt; for hashing and key derivation (via a custom HKDF-like construction), and &lt;strong&gt;Curve25519&lt;/strong&gt; for the static key pairs that identify peers. Peers are identified exclusively by their 32-byte Curve25519 public key, making WireGuard a &lt;strong&gt;public-key routed&lt;/strong&gt; VPN: there are no usernames, passwords, certificates, or CAs; access control is entirely a function of which public keys are listed in each peer&amp;rsquo;s configuration.&lt;/p&gt;</description></item></channel></rss>