
jason.woltjeandClaude Opus 4.6
73074932f6
feat(#360): Add federation credential isolation
Implement explicit deny-lists in QueryService and CommandService to prevent
user credentials from leaking across federation boundaries.
## Changes
### Core Implementation
- QueryService: Block all credential-related queries with keyword detection
- CommandService: Block all credential operations (create/update/delete/read)
- Case-insensitive keyword matching for both queries and commands
### Security Features
- Deny-list includes: credential, api_key, secret, token, password, oauth
- Errors returned for blocked operations
- No impact on existing allowed operations (tasks, events, projects, agent commands)
### Testing
- Added 2 unit tests to query.service.spec.ts
- Added 3 unit tests to command.service.spec.ts
- Added 8 integration tests in credential-isolation.integration.spec.ts
- All 377 federation tests passing
### Documentation
- Created comprehensive security doc at docs/security/federation-credential-isolation.md
- Documents 4 security guarantees (G1-G4)
- Includes testing strategy and incident response procedures
## Security Guarantees
1. G1: Credential Confidentiality - Credentials never leave instance in plaintext
2. G2: Cross-Instance Isolation - Compromised key on one instance doesn't affect others
3. G3: Query/Command Isolation - Federated instances cannot query/modify credentials
4. G4: Accidental Exposure Prevention - Credentials cannot leak via messages
## Defense-in-Depth
This implementation adds application-layer protection on top of existing:
- Transit key separation (mosaic-credentials vs mosaic-federation)
- Per-instance OpenBao servers
- Workspace-scoped credential access
Fixes #360
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-07 16:55:49 -06:00
..
2026-02-03 22:02:08 -06:00
2026-02-04 03:08:09 +00:00
2026-02-03 19:53:09 -06:00
2026-02-03 14:37:06 -06:00
2026-02-06 12:51:37 -06:00
2026-02-03 20:47:41 -06:00
2026-02-03 13:30:16 -06:00
2026-02-03 13:30:16 -06:00
2026-02-07 16:55:49 -06:00
2026-02-07 16:55:49 -06:00
2026-02-03 22:00:43 -06:00
2026-02-03 22:07:55 -06:00
2026-02-03 22:00:43 -06:00
2026-02-07 16:55:49 -06:00
2026-02-03 21:35:15 -06:00
2026-02-07 13:16:43 -06:00
2026-02-03 13:45:00 -06:00
2026-02-03 13:45:00 -06:00
2026-02-03 13:45:00 -06:00
2026-02-03 13:45:00 -06:00
2026-02-04 03:08:09 +00:00
2026-02-04 03:08:09 +00:00
2026-02-03 16:50:06 -06:00
2026-02-03 20:07:49 -06:00
2026-02-05 16:55:48 -06:00
2026-02-05 16:55:48 -06:00
2026-02-06 12:15:21 -06:00
2026-02-05 16:55:48 -06:00
2026-02-05 16:55:48 -06:00
2026-02-06 12:15:21 -06:00
2026-02-03 21:33:57 -06:00
2026-02-04 03:08:09 +00:00
2026-02-03 21:36:31 -06:00
2026-02-03 21:36:31 -06:00
2026-02-03 12:55:37 -06:00
2026-02-03 16:50:06 -06:00
2026-02-03 12:55:37 -06:00
2026-02-03 12:55:37 -06:00
2026-02-03 19:53:09 -06:00
2026-02-05 16:03:09 -06:00
2026-02-05 16:03:09 -06:00
2026-02-03 13:12:12 -06:00
2026-02-03 13:12:12 -06:00
2026-02-07 16:55:49 -06:00
2026-02-07 16:55:49 -06:00
2026-02-03 21:43:01 -06:00
2026-02-03 21:43:01 -06:00
2026-02-03 21:50:13 -06:00