Repository navigation
Set the vault's defaults from the standards rather than from caution - #82
Merged
Merged
Conversation
…om caution Slice 025 shipped with sealing off for every class and a note that the choice was the deployment's. That was a decision deferred rather than made, and the research says the answer differs by class. What the standards actually say. CISA's secure-by-design guidance asks that the secure configuration be the baseline. For CUI at rest, NIST SP 800-171 3.13.16 is satisfied by encrypting once, and full-disk encryption on the endpoint is the ordinary implementation, so application-level sealing layered on an encrypted volume protects a different threat rather than the same one twice. 3.13.11 requires a FIPS-validated module and 3.13.16 inherits it, and this project's crypto is validated only on the FIPS leg, so sealing here must not be presented as a CUI at-rest control. And SC-12(1) makes availability of information under key loss a control in its own right, which bounds how far a default should reach when escrow and recovery are out of scope. So: staged skill changes are sealed by default, because they are machine-local and short-lived and discarding one is already supported, so a lost key costs a proposal that can be made again. Exports are not, because an export exists in order to move and its destination is where that data's at-rest control belongs. Skill files are not, because they are meant to be opened in an editor and an encrypted file a person cannot read is a broken skill rather than a safer one. The first attempt at the secure default was wrong and the tests said so immediately. "Seal, and raise if you cannot" broke ten tests on a machine with no passphrase, no systemd credential and no TPM tooling, which is every developer machine and most first runs: staging a skill proposal failed outright. CISA's own wording is that a product should be resilient out of the box without end-users having to take additional steps, and requiring key custody to be configured before a core feature works is such a step. A default that turns an unconfigured install into a broken one is an outage with a rationale. Sealing now degrades where no key source exists: the blob is written in the clear and the fact is logged once per class rather than hidden, because an operator who believed sealing was on should learn it from a log and not from an incident. sealed?/1 reports what any blob actually is, so nothing is inferred from configuration. mix gate exit 0; 612 passed; coverage 80.31%. Signed-off-by: Ayla Croft <aylacroft@proton.me>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Slice 025 shipped with sealing off for every class and a note that the choice was the deployment's. That was a decision deferred rather than made. Researching it gives a different answer, and a per-class one.
What the standards actually say
Three consequences. Layering application sealing over an encrypted volume does not satisfy the at-rest control twice — it protects a different threat. This project's crypto is validated only on the FIPS leg, so sealing here is not a CUI at-rest control and must not be mistaken for one; the volume is. And with escrow and recovery explicitly out of this slice's scope, SC-12(1) bounds how far a default should reach.
The defaults that fall out
The first attempt was wrong, and the tests said so immediately
"Seal, and raise if you cannot" is what secure-by-default sounds like it should mean. It broke ten tests on a machine with no passphrase, no systemd credential and no TPM tooling — which is every developer machine and most first runs. Staging a skill proposal failed outright.
CISA's own wording is that a product should be resilient out of the box without end-users having to take additional steps, and requiring key custody to be configured before a core feature works is exactly such a step. A default that turns an unconfigured install into a broken one is an outage with a rationale.
Sealing now degrades: where no key source exists the blob is written in the clear and the fact is logged once per class rather than hidden, because an operator who believed sealing was on should learn it from a log and not from an incident.
sealed?/1reports what any blob actually is, so nothing is inferred from configuration.Evidence
mix gateexit 0; 612 passed, 18 excluded; coverage 80.31%. The reasoning is recorded indocs/encryption-at-rest.mdunder "Which layer carries the compliance control, and which does not", so the next person to ask this question finds the answer and its sources rather than re-deriving them.