feat: SSH remote host ingest — pull logs from remote systems over SSH #22
Labels
No labels
compliance
demo
deployment
docs
enhancement
parser
patterns
performance
security
ux
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: Circuit-Forge/turnstone#22
Loading…
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?
Summary
Add SSH as a transport layer for log ingestion, so Turnstone can pull logs from remote hosts without requiring a persistent agent on that host. The user registers a remote host with SSH credentials; Turnstone connects, runs the appropriate remote command, and pipes the output through the existing local parsers.
Motivation
All current ingest modules (
journald,docker_log,syslog,caddy, etc.) read from the local system only. A common field workflow is: technician opens Turnstone on their own machine, connects to a remote system over SSH, pulls logs, and analyzes them locally. This requires no changes to the remote host — only SSH access and the standard tools (journalctl,docker, etc.) already present there.Design
SSH is a transport wrapper, not a new parser. The existing ingest modules handle parsing; SSH handles delivery.
New module:
app/ingest/ssh.pyWrap
paramiko(orsubprocess ssh) to:Source registration
Extend source config to support a
transportfield:Sources without
transport(ortransport: local) continue to work as today — no regression.Acceptance Criteria
app/ingest/ssh.py— SSH transport; connects, runs command, returns stdout streamjournald,docker_log,syslog, andplaintextparsers usable over SSH transporttransport: ssh,host,user,key_pathfieldsPOST /api/sourcesaccepts SSH source registrationImplementation notes
paramikoover subprocess ssh for programmatic control and better error handlingOut of scope