Skip to content

manifests: Run control plane containers as non-root - #3028

Merged
Benjamin Elder (BenTheElder) merged 1 commit into
agent-substrate:mainfrom
mikedickey:nonroot-images
Oct 25, 2026
Merged

Benjamin Elder (BenTheElder) merged 1 commit into
agent-substrate:mainfrom
mikedickey:nonroot-images

Conversation

@mikedickey

@mikedickey Mike Dickey (mikedickey) commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

ko built every image on a base that runs as root, so runAsNonRoot would have failed every pod with CreateContainerConfigError. Switch defaultBaseImage to static-debian13:nonroot, pinned by digest, and set runAsNonRoot on the control plane containers.

Also set allowPrivilegeEscalation: false and drop all capabilities on containers that lacked them. ate-api-server keeps NET_BIND_SERVICE for :443. The envoy container in atenet-router sets runAsUser: 65532 because its image has no USER. ate-controller gets a read-only root filesystem. atelet and its objectstore-plugin sidecar stay root and only get allowPrivilegeEscalation: false.

Why is this needed? (Or link the issue. Open one first for features, API, install or CI changes.)

Fixes part of #2936

AI use: Ai-assisted, I reviewed and tested it.

  • Tests pass
  • Docs updated

@google-cla

google-cla Bot commented Oct 20, 2026

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

@destijl

Copy link
Copy Markdown
Collaborator

LGTM, agree with all these changes. I think it would be better to get these in before GA because clawing back permissions is always hard. It's much easier if they are minimal from the start.

ko built every image on a base that runs as root, so runAsNonRoot would
have failed every pod with CreateContainerConfigError. Switch
defaultBaseImage to static-debian13:nonroot, pinned by digest, and set
runAsNonRoot on the control plane containers.

Also set allowPrivilegeEscalation: false and drop all capabilities on
containers that lacked them. ate-api-server keeps NET_BIND_SERVICE for
:443. The envoy container in atenet-router sets runAsUser: 65532 because
its image has no USER. ate-controller gets a read-only root filesystem.
atelet and its objectstore-plugin sidecar stay root and only get
allowPrivilegeEscalation: false.
Comment thread .ko.yaml Resolved

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks!

@BenTheElder
Benjamin Elder (BenTheElder) added this pull request to the merge queue Oct 25, 2026
@BenTheElder Benjamin Elder (BenTheElder) added the area/security Security related issue/pr label Oct 25, 2026
Merged via the queue into agent-substrate:main with commit 59a58a5 Oct 25, 2026
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/security Security related issue/pr

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants