Docker audit fixes
Container Hardening: fixing all 5 checks
The container hardening audit inspects each running container's privileged mode, user, capabilities, no-new-privileges and root filesystem: the settings that decide how far a compromise reaches.
All five read docker ps -q, so a host whose containers are all stopped reports five skips rather than five passes. Only Privileged Containers distinguishes "Docker daemon not reachable" from "No running containers"; the other four print one message for both.
Transcribed from the docker-security-container-hardening audit script.
Find your finding
Listed in the order the audit runs them. Take the check name from the third field of the result line and open its page.
Privileged Containers
SoonCheck whether any running container uses --privileged, which grants every capability and device
HighNeeds root3 resultsNo New Privileges
SoonCheck whether running containers set the no-new-privileges security option to block setuid escalation
HighNeeds root3 resultsContainer User
SoonCheck whether running containers execute as a non-root user or rely on user namespace remapping
HighNeeds root4 resultsContainer Capabilities
SoonCheck for dangerous added capabilities and whether containers drop the default capability set
MediumNeeds root4 resultsRead-Only Filesystem
SoonCheck whether running containers use a read-only root filesystem
LowNeeds root3 results
How the Container Hardening audit reads your server
Every check in this audit runs after the same preamble, and several of its results only make sense once you know what that preamble could and could not see.
All inspect running containers only (docker ps -q). Stopped containers are not evaluated.
Docker detection: DOCK=direct if docker ps works as the audit user (docker group), DOCK=root if it works through sudo; the dk helper wraps docker accordingly. IDS is the list of running container IDs and NRUN their count; dk inspect --format is used with Go templates. Podman is recognised but not audited.
A SKIP is never a pass
A skipped check verified nothing at all. The most common cause is privilege: 5 of the 5 checks in this audit need root for a complete result. Before every run, each script works out which of four privilege modes it is in.
| Mode | How it is reached | What it means for your results |
|---|---|---|
root | The audit runs as UID 0. | Every privileged branch runs directly. No check skips for lack of permission. |
nopass | sudo -n true succeeds, so the account has passwordless sudo. | Privileged commands run through sudo -n. |
pass | A sudo password was supplied in the CtrlOps audit settings and accepted. | Privileged commands run through sudo -S. |
none | None of the above worked. | CAN_ROOT=0. Every privileged branch returns SKIP with a "Need root" message rather than guessing. |
If many checks skip with a “need root” message, run the audit as root, grant the audit account sudo (with or without NOPASSWD), or supply the sudo password in the CtrlOps audit settings. For Docker checks, membership of the docker group is an alternative to sudo: run usermod -aG docker <user> and log in again.
Container Hardening questions
Run all 5 Container Hardening checks, in one click
CtrlOps runs this audit over your existing SSH connection - no agents, no scripts to manage. $7/user/month after a 1 month free trial - no credit card required.
✓ Start instantly·✓ No credit card·✓ No sneaky autorenewals