Isolate BOS signing from privileged Actions runners #75

Merged
Breadway merged 3 commits from fix/bos-39-isolate-signing into main 2026-10-02 14:34:11 +08:00
Owner

Actions currently imports one shared private key on the privileged ISO builder and uses it for pacman repository signing. This change prepares unsigned repository artifacts and ISO draft candidates instead. Separate offline signers pin the public identity, require finite future expiry, reject reuse of the repository identity for ISO checksums, and refuse Actions environments. The ISO signer verifies one BOS ISO checksum before signing SHA256SUMS. Candidates are immutable: any existing tag release or draft makes the builder refuse all mutations. Every new upload checks draft state. Offline publication must wait for the associated build run to complete successfully, with the documented exclusive handoff.

Verified with temporary unrelated signing identities: real ISO checksum signature, rejection of altered bytes and extra checksum entries, rejection of a shared or non-expiring identity, real pacman package/database signatures, and Actions refusal. Workflow YAML, every workflow shell block, Python compilation, and diff checks pass.

Activation remains required before production adoption: provision the distinct expiring ISO public key and record its actual fingerprint, move repository private material to a dedicated non-runner signer, remove the former shared Actions secret everywhere, and independently approve candidate publication. Existing installed repository trust and production secrets are unchanged. New ISO publication/GitHub announcement/stable promotion now follow offline approval. docs/signed-repo.md records these steps explicitly; this PR does not claim that production migration has happened.

Closes #39

Actions currently imports one shared private key on the privileged ISO builder and uses it for pacman repository signing. This change prepares unsigned repository artifacts and ISO draft candidates instead. Separate offline signers pin the public identity, require finite future expiry, reject reuse of the repository identity for ISO checksums, and refuse Actions environments. The ISO signer verifies one BOS ISO checksum before signing SHA256SUMS. Candidates are immutable: any existing tag release or draft makes the builder refuse all mutations. Every new upload checks draft state. Offline publication must wait for the associated build run to complete successfully, with the documented exclusive handoff. Verified with temporary unrelated signing identities: real ISO checksum signature, rejection of altered bytes and extra checksum entries, rejection of a shared or non-expiring identity, real pacman package/database signatures, and Actions refusal. Workflow YAML, every workflow shell block, Python compilation, and diff checks pass. Activation remains required before production adoption: provision the distinct expiring ISO public key and record its actual fingerprint, move repository private material to a dedicated non-runner signer, remove the former shared Actions secret everywhere, and independently approve candidate publication. Existing installed repository trust and production secrets are unchanged. New ISO publication/GitHub announcement/stable promotion now follow offline approval. docs/signed-repo.md records these steps explicitly; this PR does not claim that production migration has happened. Closes #39
Author
Owner

Independent source and isolated integration review PASS at 1c6e242f6e. Offline signing tests independently verify distinct expiring temporary identities, ISO checksum-only signing, tamper rejection, signed pacman packages/database, and Actions refusal. Reviewed and requested removal of mutable draft rebuilds; revised workflow refuses all existing candidates and checks draft state before each fresh upload. Mocked workflow checks confirm existing tags and API failures cause no mutation, fresh candidates upload exactly two assets, and a changed draft state stops the next upload. YAML, every workflow shell block, signing Python/shell and diff checks pass. No configured CI statuses.

This is a reviewed migration implementation, with production activation outstanding. The second ISO public fingerprint is not provisioned; private material relocation, deletion of old Actions secrets, protected policy/source, provenance approval and publication exclusion remain required as explicitly documented. No production keys or trust were changed, and this review does not claim the security migration is activated.

Independent source and isolated integration review PASS at 1c6e242f6e0aa6301d382edb18a84a4519e6e43a. Offline signing tests independently verify distinct expiring temporary identities, ISO checksum-only signing, tamper rejection, signed pacman packages/database, and Actions refusal. Reviewed and requested removal of mutable draft rebuilds; revised workflow refuses all existing candidates and checks draft state before each fresh upload. Mocked workflow checks confirm existing tags and API failures cause no mutation, fresh candidates upload exactly two assets, and a changed draft state stops the next upload. YAML, every workflow shell block, signing Python/shell and diff checks pass. No configured CI statuses. This is a reviewed migration implementation, with production activation outstanding. The second ISO public fingerprint is not provisioned; private material relocation, deletion of old Actions secrets, protected policy/source, provenance approval and publication exclusion remain required as explicitly documented. No production keys or trust were changed, and this review does not claim the security migration is activated.
Sign in to join this conversation.
No description provided.