vArmor: Kubernetes Container Hardening Through CRDs, Enforcers and an Envoy Sidecar
vArmor is a cloud-native container hardening system that leverages AppArmor/BPF/Seccomp and NetworkProxy technologies to enforce access control from system calls to application protocols — protecting workloads including AI Agents.
At a glance
- What is it?
- vArmor turns AppArmor, BPF LSM, Seccomp and an Envoy-based network proxy into Kubernetes custom resources. It suits clusters that cannot move to hardware-virtualized containers but still need syscall and egress control, and it is honest in the README that it is not a Kata replacement.
- Who is it for?
- Adopt vArmor if you run Kubernetes workloads that need syscall-level restriction or L7 egress control and you cannot use Kata-style hardware isolation: start from the built-in Allow-by-Default rules, then move specific workloads to a deny-by-default allowlist profile. Do not adopt it as a substitute for compute isolation, and do not deploy NetworkProxy without first checking kernel and Envoy compatibility on your nodes.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 2 days ago.
- What is it written in?
- Mainly Go, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What vArmor Is For, and Who Should Care
The README frames vArmor around a specific gap. In multi-tenant clusters where hardware-virtualized container solutions are ruled out by cost or technical conditions, you still want to raise the cost of container escape and lateral movement. vArmor addresses that with kernel-level mandatory access control and, separately, with application-protocol-level egress control. It is a Kubernetes Operator, so the interface is a CRD rather than a hand-written AppArmor profile per node. The stated audience includes teams running critical business containers, teams sitting on high-risk vulnerabilities they cannot patch immediately, and teams deploying AI agents or LLM-based applications that need outbound access pinned down. That last group is the newest and the most interesting: prompt injection turning into tool abuse or data exfiltration is a network egress problem as much as a model problem, and vArmor's NetworkProxy enforcer is aimed squarely at it. The README is also unusually direct about what vArmor is not. It states that runc plus vArmor does not provide an isolation level equivalent to hardware virtualization containers such as Kata Containers, and that anyone needing high-intensity isolation should use those for compute isolation and CNI NetworkPolicy for network isolation. Treat that note as the boundary of the product, not as marketing hedging.
Enforcers as Building Blocks: AppArmor, BPF LSM, Seccomp, NetworkProxy
vArmor abstracts four enforcement mechanisms and lets you combine them. AppArmor LSM and BPF LSM handle file access and process execution style restrictions. Seccomp handles syscalls. NetworkProxy, an Envoy-based sidecar, handles network egress. The README describes NetworkProxy as operating at L4 (TCP), L7 (HTTP/HTTPS) and TLS SNI, with TLS MITM termination for decrypted HTTPS inspection, per-domain HTTP header injection, anti-Domain-Fronting protection, allow-list and deny-list modes, audit logging, and dynamic policy updates without Pod restarts. The combination is what makes the design coherent: a kernel enforcer can stop a process from calling a syscall, but it cannot tell whether an HTTPS request is going to an approved API endpoint. The proxy can. Conversely, the proxy cannot stop a process from opening a file it should not read. The README positions NetworkProxy as complementary to NetworkPolicy, listing L7 control for HTTP and HTTPS, TLS SNI domain filtering, header injection, anti-Domain-Fronting and audit logging as things NetworkPolicy does not offer. The mechanism for interception is a sidecar proxy, which means traffic from the workload is redirected through a container that shares the Pod. That is a real architectural commitment: it adds a container per protected Pod, and TLS MITM implies certificate material that the proxy must present to the workload. The README does not, in the supplied text, describe how that trust is bootstrapped, so verify it in the docs before enabling MITM on production traffic.
Policy Model: Allow-by-Default, Built-in Rules, and the Deny-by-Default Path
The README states that vArmor currently focuses on the Allow-by-Default model, where only explicitly declared behaviors are blocked. Two consequences follow. First, performance impact is described as minimized, because the default path is permissive. Second, usability is higher, because you do not need to enumerate everything a workload legitimately does before you can ship a policy. vArmor ships built-in rules designed for that model, so a team without AppArmor or Seccomp expertise can apply something useful immediately. Violations can also be audited rather than blocked, which is the right first step: run in audit mode, observe what the workload actually does, then convert to enforcement. The README also says vArmor is capable of using allowlist profiles for a deny-by-default posture, described as a more user-friendly approach to developing and managing profiles. The trade-off is explicit and worth stating plainly. Allow-by-default is easier to adopt and weaker in coverage: anything not declared is permitted. Deny-by-default is stronger but requires you to know the workload's full behavior, and a missed item becomes an outage rather than a gap. The README's own bullet list repeats the built-in rules description under a second heading called Behavior Modeling, which reads like a documentation error in the README rather than a second feature. Check varmor.org for what Behavior Modeling actually means before relying on it.
Installing vArmor and the Resources You Manipulate
The README does not inline installation commands. It points to the documentation site, with an Installation page under getting_started and a Quick Start under introduction. What the README does establish is the operating model: vArmor follows the Kubernetes Operator design pattern, so hardening a workload means creating or editing custom resources through the CRD API, and the controller reconciles them into enforcers on the nodes. The practical shape is therefore a controller plus a node-level agent, with policies expressed as CRDs. The README's Architecture section is an image (docs/img/architecture.svg) and the supplied text does not enumerate the resource kinds, so I cannot name the exact CRD without guessing. Anyone evaluating vArmor should read the Policies and Rules guide on varmor.org before writing anything, because the resource schema is the actual API surface and it is not reproduced here. Two other details are confirmed in the README: the project is written in Go, and it is licensed under Apache 2.0 except for something the truncated README cuts off mid-sentence. That exception matters and is discussed below.
The Licence Has an Exception You Need to Read
The README's licence section says the project is licensed under Apache 2.0, except for a carve-out that the supplied text truncates. The badge block at the top of the README also shows a GPL badge alongside the Apache 2.0 badge, which suggests some component or directory is under GPL-2.0. That is consistent with a project that bundles or links against kernel-adjacent tooling. The consequence is practical rather than theoretical: if you redistribute vArmor, or vendor parts of it into a product, the Apache 2.0 terms may not cover everything you are shipping. Read the full licence section in the repository and identify which files or directories fall under the exception before you make a distribution decision. This is not legal advice, and the exact scope of the exception is not determinable from the truncated README. Treat the licence question as an open item to resolve from the source tree, not as something the README settles.
Where vArmor Is the Wrong Tool
The README names the biggest limitation itself: runc plus vArmor is not equivalent to hardware virtualization. If your threat model includes a hostile tenant running arbitrary code with kernel exploit capability, syscall filtering and LSM policy raise the cost but do not provide the compute boundary a lightweight VM provides. vArmor's own guidance is to use Kata-style containers for that and CNI NetworkPolicy for network isolation. There is a second limitation that follows from the enforcer design. AppArmor and BPF LSM availability depends on the host kernel and its configuration; a policy that works on one node pool may not load on another. The README does not describe fallback behavior when a required LSM is unavailable, so that is a question for the docs. Third, the NetworkProxy enforcer adds a sidecar to every protected Pod and, with TLS MITM enabled, inserts itself into the TLS path. That is a meaningful change to the data plane for latency-sensitive services, and the README does not quantify it in the supplied text. Fourth, the Allow-by-Default focus means the out-of-the-box posture is deliberately permissive. If you deploy vArmor and stop at the built-in rules, you have bought partial coverage, not a hardened cluster.
How vArmor Differs From Kubernetes NetworkPolicy and Pod Security Admission
The most direct comparison is Kubernetes NetworkPolicy, and the README makes the case itself. NetworkPolicy operates at L3/L4 and is enforced by the CNI. vArmor's NetworkProxy enforcer adds L7 HTTP and HTTPS control, TLS SNI domain filtering, per-domain HTTP header injection, anti-Domain-Fronting protection and audit logging. The difference in approach is where enforcement happens: NetworkPolicy drops or allows packets based on addresses and ports, while vArmor terminates and inspects the connection in a sidecar. That buys protocol awareness at the cost of a proxy in the path and, for HTTPS inspection, a MITM trust setup. The second comparison is Pod Security Admission, which applies a cluster-wide or namespace-wide baseline and restricted profile. PSA is a blunt setting; vArmor policies are per-workload CRDs, so a single namespace can contain a tightly restricted AI agent Pod and a loosely restricted batch job. The cost of that granularity is that someone has to author and maintain the per-workload policies, and the README's built-in rules exist precisely to reduce that burden. Neither PSA nor NetworkPolicy covers syscall restriction the way Seccomp does, and neither covers file and process access the way AppArmor or BPF LSM do.
Maintenance, Releases and Upgrade Surface
The repository shows a steady release cadence: v0.10.3 in July 2026, a beta and then v0.10.4 in August 2026, with the last push to main in September 2026. The version numbering is still 0.x, which is worth noting for anyone planning a long-lived deployment: minor releases in a 0.x line can carry breaking changes to CRD schemas, and CRD changes are the expensive kind because they affect every policy object in the cluster. The README says the project is still in active development, created by the Elkeid Team in ByteDance's endpoint security department. There is a development guide on varmor.org and a code of conduct in the repository. Two upgrade costs are specific to this design. First, the node agent must be upgraded in step with the controller, and a version skew between them is a failure mode you should test. Second, NetworkProxy policies are described as dynamically updatable without Pod restarts, which reduces one class of disruption, but the sidecar image itself still has to roll. Before upgrading, check the release notes for CRD schema changes and confirm the new agent version supports the LSM hooks your existing policies reference. The README does not describe an upgrade procedure, so that comes from the docs.
Editorial conclusion
Adopt vArmor if you run Kubernetes workloads that need syscall-level restriction or L7 egress control and you cannot use Kata-style hardware isolation: start from the built-in Allow-by-Default rules, then move specific workloads to a deny-by-default allowlist profile. Do not adopt it as a substitute for compute isolation, and do not deploy NetworkProxy without first checking kernel and Envoy compatibility on your nodes. Before rollout, verify three things: that your kernel exposes the AppArmor or BPF LSM hooks you intend to use, that the vArmor agent DaemonSet is healthy on every node, and that your NetworkProxy policy behaves as expected against a non-production namespace.
Community notes