It answers who signed the image. Not what is in it.
policy-controller is the reference answer to one question, written by the project that defines the format the answer is in. If signature and attestation verification is the whole job, it is hard to argue with. The question it does not ask is what the image contains.
What policy-controller is
An admission controller from the Sigstore project. A ClusterImagePolicy names
the authorities an image must satisfy — a public key, or a keyless identity and issuer —
and the attestations it must carry; a pod is admitted when every matching policy has at
least one authority that passes. It resolves tags to digests so that what runs is what was
admitted, enforcement is switched on per namespace, and a CUE or Rego policy can be applied
to the contents of an attestation once its signature has been verified.
It is Apache-2.0, free, small, and it is maintained by the people who define cosign's formats. For a cluster whose supply-chain story is "everything we run is signed by our own build system", that is a complete answer and you should use it.
Where they overlap
Squarely on signature and attestation verification at admission. Attestkeep verifies cosign signatures with a key or keylessly against an identity and issuer, checks in-toto attestations and can require them to be no older than a maximum age, requires a verified SBOM or provenance statement where the policy says so, and pins images to digests. If that list is what you came for, policy-controller does it and costs nothing.
Where the seam is
A signature says somebody vouched for these bytes. It does not say the bytes are safe. An image signed this morning by a build system you trust can carry a critical vulnerability published last night, and every policy in the cluster will admit it, correctly, because the signature is valid. Verification and vulnerability are different questions and only one of them is being asked.
policy-controller has no scanner, keeps no vulnerability database and holds no history: it evaluates the request in front of it and moves on. Attestkeep asks both questions from one verdict — the signature, and Trivy's findings on the same digest, with CISA's known-exploited catalogue marking the ones under attack — then keeps the answer. The database refreshes every six hours and every image is rescanned daily, so an image that was clean when it was admitted does not stay clean by assumption.
And the record outlives the request. Verdicts are written to a PostgreSQL you control under the hash of the policy that produced them, which is what makes a period report possible at all: thirteen regulations and control sets, 293 clauses, each quoted by citation and marked met, partial, gap or outside scope, signed inside your cluster and verifiable by your auditor without us.
Side by side
| Capability | policy-controller | Attestkeep |
|---|---|---|
| Signature verification at admission | Yes, key and keyless | Yes, key and keyless |
| Attestation verification | Yes, with CUE or Rego over the contents | Yes, with a maximum age |
| Tag resolved to a digest | Yes | Yes |
| Vulnerability scanning | No | Trivy, pinned into the release |
| Rescans images that are already running | No | Every image, daily |
| Known-exploited vulnerabilities marked | No | CISA KEV |
| History of decisions kept | No | PostgreSQL you control |
| Exceptions with an expiry, break-glass, audit log | No | Yes |
| Console in the same release | No | Yes |
| Period report against a control set | No | 13 instruments, 293 cited clauses |
| Licence | Apache-2.0, free | Community free forever; paid editions add capacity, SSO, support |
Which one you need
policy-controller alone when the images you run are all built and signed by you, when what you need enforced is provenance rather than content, and when you would rather stay as close to the Sigstore project as a deployment can get.
Attestkeep when "signed" is not the same as "safe" in your threat model — base images from elsewhere, vendor images, anything you did not build — or when the signature check has to be evidence rather than behaviour. Both run as validating webhooks and can sit in one cluster, though an image rule is better expressed once, in one of them. Community Edition is free forever, so you can put ours next to yours before you decide.
Install it yourself.
Create an account, confirm your e-mail with the code we send, take the free Community key from the Licenses page, and install with Helm.
Create an account