containerd Security Best Practices
Secure your containerd deployment with industry-standard best practices. This guide covers seccomp profiles, AppArmor and SELinux policies, image signing, and security hardening for production container workloads.
Containers share the host kernel, making security boundaries critical. A container escape can compromise the entire host and all workloads running on it. containerd provides multiple security layers to protect your infrastructure: seccomp profiles, AppArmor/SELinux policies, image signing, and more.
This guide covers security best practices for containerd deployments, from basic hardening to advanced security features. Implementing these practices helps protect against container escapes, privilege escalation, and supply chain attacks.
seccomp
AppArmor
SELinux
Image Signing
Rootless Mode
Secrets Management
seccomp (Secure Computing Mode) restricts the system calls a container can make. This reduces the attack surface by preventing malicious or unnecessary syscalls.
# Default seccomp profile (in /etc/containerd/config.toml)
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "runc"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
# Enable seccomp
SystemdCgroup = true
# Use default seccomp profile
SeccompProfile = "/usr/share/containerd/seccomp/default.json"
# Custom seccomp profile (minimal)
{
"defaultAction": "SCMP_ACT_ERRNO",
"architectures": ["SCMP_ARCH_X86_64"],
"syscalls": [
{"names": ["accept", "accept4", "access", "alarm"], "action": "SCMP_ACT_ALLOW"},
{"names": ["mount", "unmount", "umount2"], "action": "SCMP_ACT_ERRNO"}
]
}
# Disable seccomp (not recommended)
# SeccompProfile = "unconfined"
AppArmor provides MAC policies that restrict container capabilities, file access, and network permissions. It's widely used on Debian/Ubuntu systems.
# Create an AppArmor profile for nginx
sudo cat > /etc/apparmor.d/containerd-nginx <
# Network permissions
network inet tcp,
network inet udp,
# File access
/usr/sbin/nginx r,
/etc/nginx/** r,
/var/log/nginx/** w,
/var/run/nginx.pid rw,
/run/nginx.pid rw,
# Deny shell access
deny /bin/sh r,
deny /usr/bin/bash r,
}
EOF
# Load the profile
sudo apparmor_parser -r /etc/apparmor.d/containerd-nginx
# Apply to container (in config.toml)
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
AppArmorProfile = "containerd-nginx"
# Check AppArmor status
sudo aa-status | grep containerd
SELinux (Security-Enhanced Linux) provides advanced MAC using security labels. It's widely used on RHEL, CentOS, and Fedora systems.
# Check SELinux status
sestatus
# Set SELinux to enforcing mode
sudo setenforce 1
# Configure SELinux for containerd
sudo semanage permissive -a container_runtime_t
sudo semodule -d container_runtime
# Apply SELinux context to containerd directories
sudo chcon -R -t container_runtime_t /var/lib/containerd
sudo chcon -R -t container_runtime_t /var/run/containerd
# Configure containerd for SELinux (in config.toml)
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SELinuxContext = "system_u:system_r:container_runtime_t:s0"
# Verify SELinux labels
ls -Z /var/lib/containerd
Image signing ensures container images come from trusted sources and haven't been tampered with. Use Cosign (Sigstore) or Notary for image signing.
# Install Cosign
curl -L https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 -o /usr/local/bin/cosign
chmod +x /usr/local/bin/cosign
# Sign an image
cosign sign --key cosign.key ghcr.io/user/nginx:latest
# Verify an image
cosign verify --key cosign.pub ghcr.io/user/nginx:latest
# Configure containerd for image verification (in config.toml)
[plugins."io.containerd.grpc.v1.cri".registry]
# Verify signatures
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."ghcr.io".tls]
insecure_skip_verify = false
Running containerd and containers without root privileges significantly reduces the impact of a container escape. See the Rootless containerd guide for detailed instructions.
# Enable rootless mode
export CONTAINERD_NAMESPACE=default
export DOCKER_HOST=unix:///run/user/$UID/docker.sock
# Run container without root
nerdctl run --rm --user 1000:1000 alpine echo "Hello"
# Check user mapping
cat /proc/self/uid_map
Linux capabilities are a per-thread permission model. Dropping unnecessary capabilities reduces the attack surface.
# Run container with limited capabilities
nerdctl run --rm --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx
# Configure capabilities in config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
# Drop all capabilities by default
Capabilities = ["NET_BIND_SERVICE", "CHOWN", "SETUID", "SETGID"]
# Common capabilities to drop:
# CAP_SYS_ADMIN (mount, filesystem)
# CAP_SYS_PTRACE (debugging)
# CAP_SYS_TIME (system time)
# CAP_MKNOD (device nodes)
Restrict container network access using network policies and CNI plugins.
# Network policy (Kubernetes)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
# CNI plugin configuration (Calico)
# /etc/cni/net.d/10-calico.conflist
{
"name": "k8s-pod-network",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "calico",
"policy": {
"type": "k8s"
}
}
]
}
- ✓ Enable seccomp - Use default or custom profiles.
- ✓ Configure AppArmor or SELinux - Enforce MAC policies.
- ✓ Drop unnecessary capabilities - Use minimal capability sets.
- ✓ Verify image signatures - Use Cosign or Notary.
- ✓ Use rootless mode - For development and CI/CD.
- ✓ Implement network policies - Restrict ingress/egress.
- ✓ Log and monitor - Use metrics and audit logs.
- ✓ Keep containerd updated - Apply security patches.
- ✓ Use minimal base images - Alpine or distroless.
- ✓ Scan images for vulnerabilities - Trivy, Clair.
Security is a journey, not a destination. Start with the basics, monitor your workloads, and continuously improve your security posture.