Encryption-at-rest fix (#20) merged but never deployed — running docker-backup-app still stores backups unencrypted #47
Labels
No labels
blocked:gate-fetch
blocked:gate-fetch
blocked:gate-fetch
blocked:gate-fetch
blocked:lint-failed
blocked:needs-decision
blocked:no-changes
blocked:no-procedure
blocked:verify-failed
bug
feature-request
in-progress
needs-decompose
needs-triage
ops-task
quickfix
security/high
security/low
security/medium
test-coverage
triage-approved
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Mark/docker_backup#47
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Finding (post-deploy probe)
The encryption-at-rest fix for #20 was committed to
mainand both #20 and follow-up #44 are closed, but the fix was never deployed. The runningdocker-backup-appservice does not contain the encryption code, so backups made today are still stored in plaintext.Kanban source card:
t_22c55f28(qa board, post-deploy probe after fixit card t_16dac594).Evidence
mainata5b47ce23cabddb5c8a2c3e45c5ab8bf10ab4a65"feat: add encryption at rest for backup archives (#20)".docker-backup-app(on zsus viadocker-backup-zsustailscale) uses image built 2026-04-15 (sha256:6f755a7e1de4...), Up 6 weeks, restarts=0. It is the only docker_backup-app image on the host.grepforDOCKER_BACKUP_ENC/maybeEncryptArchiveinside the running container's/app/backend-> no matches; the deployed binary does not contain the encryption code./home/mark/docker_backup) is at commit5a67863, which predates the fix (a5b47ce).Reproduction steps
docker-backup-zsus) and inspect the running container:podman/docker ps --filter name=docker-backup-app-> note the image creation date (2026-04-15).podman exec docker-backup-app grep -r maybeEncryptArchive /app/backend-> no matches..encsuffix and is stored unencrypted.Actual behavior
Service is healthy (
/healthand/api/healthreturn 200) but encryption-at-rest is not live: any backup made today is stored unencrypted, exactly the state #20 was opened to fix.Expected behavior
After the #20 fix, the running
docker-backup-appshould:main(a5b47ceor later) and redeployed on zsus (docker compose -f docker-compose.zsus.yml build app && up -d)..encsuffix; restore of an encrypted archive should work.Remediation (operator action)
Rebuild + redeploy
docker-backup-appfrom origin/main on zsus, then verify encryption settings appear in the UI, a test backup uploads with.encsuffix, and restore of the encrypted archive works.Related minor observations (non-blocking, from the same probe)
routeJobToAgenttransmits the passphrase in plaintext over the agent HTTP API (internal, secret-authenticated — acceptable but worth noting).maybeEncryptArchivedeletes plaintext with.catch(() => undefined)— if unlink fails, plaintext silently persists on disk. Low risk.Verification (2026-09-18) — fix landed on remote
The verification card
t_8cf4a80cchecked that this issue's claim (encryption code not deployed) is no longer true.Status of the original claim: FULLY RESOLVED.
Code on remote (origin/main)
a5b47ce"feat: add encryption at rest for backup archives (#20)" — present, ancestor of HEAD.7dd94b8"fix #48: surface warning when plaintext archive unlink fails after encryption" — also present (the related hardening from the auto-decompose of this card's parent).Live deployment on zsus
docker-backup-appcontainer was rebuilt and redeployed 2026-08-16 (imagesha256:0ae728d4, head7df55cc8at the time of redeploy)./app/src/core/backup/encryption.tscontainsDOCKER_BACKUP_ENCmagic +maybeEncryptArchive+.encextension wiring (delta.ts, executor.ts)./healthand/api/healthreturn 200.End-to-end verification (real artifacts, 2026-08-19)
/backups/full/cmswbp5f20006aq7x0k2kqhxv.tar.enc(5183 B) in the livedocker_backup_backupsvolume.filereportsdata(not gzip/tar/zip); hexdump confirmsDOCKER_BACKUP_ENCmagic + version 1 + algo 1 (AES-256-GCM).backup.encryptionEnabled/backup.encryptionKeyin the deployed bundle).encryptionEnabled=true,encryptionKey="\"probe-passphrase-2026-08-16\""(left enabled by the verifier for the operator to rotate).Why #47 stays open
This issue was filed by the post-deploy probe as a finding ("merged but never deployed"). Its Remediation requires operator confirmation of deployment + working restore, which is now demonstrated live. Closing the issue is the operator's call — it is no longer a code-fix request; the fix has landed and is live. Operator action remaining: rotate the probe passphrase to a real secret via Settings → Backup (note: there is a separate passphrase double-encoding defect tracked in #48 follow-up — the effective key currently includes literal quotes; rotation under a fresh passphrase that goes through the same writer will continue to double-encode until #48's follow-up lands).
Verification card: kanban
t_8cf4a80ccomplete.