Your admin tool exports a support bundle of effective settings to an outside vendor — which copies of the warehouse credential leave the boundary?
answer
- the bundle resolves values by design
- you cannot recall what you sent
- name patterns miss composed settings
- classify settings, do not match names
- emit name, source and version
basics
~20 sEvery resolved copy the bundle collects: the effective setting itself, the rendered file the collector sweeps up, and any composed address whose value embeds the password. Once sent, retention and further copies are outside your control, so the value counts as exposed.
solid answer
~50 sA support bundle exists to show what the software is actually doing, so by design it resolves settings rather than listing references — which means it carries the delivered value, not the name it came from. It usually also sweeps the rendered configuration file off the host, and it carries any setting whose value has the credential embedded inside a longer composed address. The moment it is sent, you control neither retention nor further copies: it lands in a ticket system, on support engineers' machines, in their backups, possibly in an attachment forwarded onward. So the value must be treated as exposed and replaced. The structural fix is to build the bundle by classification rather than by name pattern: for anything classified as a secret, emit the setting's name, its source and the value version, and withhold the value; patterns over names miss exactly the composed settings that matter.
code
pseudocode · 13 lines# building a support bundle, by classification
for each setting in effectiveConfig:
if setting.classification == SECRET or setting.classification == UNSET:
emit(setting.name, "<withheld>",
source = setting.sourceName,
version = setting.valueVersion)
else:
emit(setting.name, setting.value)
# the name-pattern alternative, for contrast:
# if setting.name matches "pass|secret|token": emit(setting.name, "<redacted>")
# else: emit(setting.name, setting.value)
# -> "warehouseAddress" matches nothing, so its value leaves in fullgo deeper
Recall that an export built to show effective settings carries resolved values, so a credential leaves inside it unless the collector was designed to withhold it.
Explain why a name-pattern denylist fails — it misses composed settings and anything named for what it addresses — and what an allowlist by classification emits instead.
Demonstrate the operating consequence: once sent you control neither retention nor copies, so the value is exposed and replacement is the remedy, not a deletion request.
Set the standard: which settings are classified, what an unclassified setting defaults to, and who owns the rule that any outward-bound artifact is built from classifications rather than guesses.
## Why a bundle is a delivery-side problem A support bundle is built to answer the question *what is this installation actually running with*. To answer it, the collector resolves configuration: it prints effective values rather than the references the template held, because a reference tells the reader nothing about what the process ended up using. That is the feature, and it is also the escape path. The credential is in the bundle because the delivery design left resolved copies lying around for a collector to find. Three copies typically leave together: - **The effective setting** — the resolved value as the process sees it. - **The rendered configuration file**, when the collector sweeps a directory rather than asking the process. - **A composed address setting** whose value embeds the password inside a longer string, which reads as an address and is classified as one. ## What sending it actually changes Once the bundle crosses an organisational boundary, three things stop being yours: 1. **Retention.** How long the vendor keeps it, and in which systems, is their policy, not yours. 2. **Further copies.** A bundle attached to a ticket is downloaded by whoever picks the ticket up, copied to a machine to be opened, and included in that machine's backups. 3. **Recall.** There is no move that un-sends it. A deletion request is a courtesy, not a control, and it cannot reach the copies already made. The consequence is blunt and worth saying plainly in an interview: **from the moment the bundle is sent, the value is exposed.** The remedy is to put a different value in place and withdraw the old one at the warehouse — deleting your own copy of the bundle changes nothing about the copies that left. ## Building a bundle that can be sent The wrong shape is a denylist of name patterns — redact anything matching *password*, *secret*, *token*. It fails in the predictable direction: it matches nothing in a setting named for what it addresses rather than for what it holds, and it matches nothing in a value the operator composed by hand. A denylist over names is guessing at where secrets are. The right shape is an allowlist by **classification**. Each setting carries a classification decided where the setting is defined, and the collector's rule is mechanical: | Setting classification | What the bundle emits | |---|---| | Ordinary configuration | The name and the resolved value | | Secret | The name, the source it was read from, the value version delivered, and a withheld marker | | Unclassified | Treated as secret until someone classifies it | That last row is what keeps the rule safe as the software grows: a new setting that nobody has thought about is withheld rather than printed, and the failure mode of forgetting is a support engineer asking a question rather than a credential leaving the building. ## What the vendor still gets The objection is that withholding values makes the bundle useless for diagnosis. It does not, because what support actually needs is almost never the value: - **Is the setting present at all?** — answered by the name appearing. - **Where did it come from?** — answered by the source. - **Is this host running the value we think it is?** — answered by the version, and by a short fingerprint if two hosts must be compared. - **Did it change when the incident started?** — answered by the render time. If a case genuinely turns on the value being wrong, the vendor can be told the version and asked to compare behaviour; the value itself is the one thing a third party never needs to hold. ## Where this sits This is the same argument as the rendered file, one hop further out. Injection decided where the value came from. It did not decide how many resolved copies the running system keeps within reach of a collector, and a bundle is simply a collector with an addressee outside the company. The design question is not *should we redact* — it is *why is a resolved copy reachable by a tool whose output is meant to be handed to someone else*.
- The vendor is under contract and promises not to retain the bundle. Does that bound the exposure?No. A contract allocates liability; it does not control copies. The bundle is downloaded, opened on machines you do not administer and swept into their backups. You may still choose to accept the risk, but the honest status of the value after sending is exposed, and the decision is whether to replace it now or accept that.
- What should support be able to diagnose without ever seeing the value?Whether the setting is present, which name it was read from, which version was delivered and when it was rendered — plus a short fingerprint if two hosts must be compared. Those answer presence, provenance, sameness and timing, which is what configuration diagnosis actually turns on.
saying these in an interview costs you the question
- Redacting by matching setting names against a pattern list
- Treating a contracted vendor as inside the trust boundary
- Believing a deletion request contains what was sent
- Assuming only obviously named settings carry the value
- Concluding nothing left the host, so nothing needs replacing