Who you install from

Requiring a signature

A ceiling decides how wide anything may be. Enforcement decides whether a launch matches what was recorded. Neither asks the question a fleet asks first: whose software is this?

Whether an unsigned package is enrolled

cpak system signatures            # what is in force
cpak system set-signatures required

Two values. optional is the default and behaves as cpak always has: a package nobody signed is enrolled, and the record says it was unsigned. The distinction is written down whether or not the host acts on it, which is what makes turning this on later possible at all.

required refuses to enrol an application that no identity entitled to speak for its origin signed. Read that carefully: it refuses the enrolment, not the install. Software already on disk and working is not made safer by being half removed, so it stays, unenrolled, and is reported as such.

Which is why this setting and enforcement compose instead of fighting. An application left unenrolled is a state enforcement already has an answer for: under warn it starts and says so, under refuse it does not start. You do not need both settings to invent a refusal of their own.

Which publishers this host takes one from

A signature says somebody signed. It does not say you accept them. That is the trust policy, and it is a file:

cpak system set-trust /etc/cpak/trust.json
cpak system trust                 # what is in force
cpak system set-trust none        # remove it
{
  "abi": 1,
  "require_publisher": true,
  "approved_signers": [{ "issuer": "https://token.actions.githubusercontent.com" }],
  "approved_origins": ["github.com/yourcompany/"],
  "revoked": [{ "origin": "github.com/someone/thing", "reason": "key lost" }]
}

An empty policy allows everything, so a host nobody has decided anything about behaves as it does today. A field left out of a signer means any: the example above accepts anything signed through GitHub Actions, whoever the repository belongs to.

Signed by someone, and approved by us

require_publisher and require_approval are two different demands and the file keeps them apart on purpose.

The first says a package must be signed by somebody on your list. The second says your organisation counter-signed this exact state: not the origin, not the publisher, this build. That is the one to reach for when what you need is a review gate rather than a provenance check.

Taking trust back

A revocation withdraws what was already approved. Give it a generation and it withdraws that one; leave the generation out and it withdraws every generation of that origin. The reason is written down beside it, because an administrator six months from now reading their own policy is the person the reason is for.

The decision that comes back always carries why, whether the answer is yes or no. Working out why an application started is the same work as working out why it did not.

Managed deployment has the whole file format.

Projects and technologies around cpak