sshpiper
is the reverse proxy for sshd. all protocols, including ssh, scp, port forwarding, running on top of ssh are supported.
Note: this is v1
version, checkout legacy v0
here
downstream
: the client side, typically an ssh client.upstream
: the server side, typically an ssh server.plugin
: handles the routing from downstream
to upstream
. The plugin
is also responsible for mapping authentication methods to the upstream server. For example, the downstream may use password authentication, but the upstream server may receive public key authentication mapped by sshpiper
.additional challenge
: some plugins
will not only perform routing but also add additional challenges to SSH authentication for the upstream
server. For example, the downstream
may be asked for two-factor authentication provided by the plugin
.+---------+ +------------------+ +-----------------+
| | | | | |
| Bob +----ssh -l bob----+ | sshpiper +-------------> Bob' machine |
| | | | | | | |
+---------+ | | | | +-----------------+
+---> pipe-by-name--+ |
+---------+ | | | | +-----------------+
| | | | | | | |
| Alice +----ssh -l alice--+ | +-------------> Alice' machine |
| | | | | |
+---------+ +------------------+ +-----------------+
downstream sshpiper upstream
git clone https://github.com/tg123/sshpiper
cd sshpiper
git submodule update --init --recursive
mkdir out
go build -tags full -o out ./...
docker run -d -e USER_NAME=user -e USER_PASSWORD=pass -e PASSWORD_ACCESS=true -p 127.0.0.1:5522:2222 lscr.io/linuxserver/openssh-server
sshpiperd
with fixed
plugin targeting the dummy sshd server./out/sshpiperd -i /tmp/sshpiperkey --server-key-generate-mode notexist --log-level=trace ./out/fixed --target 127.0.0.1:5522
pass
)ssh 127.0.0.1 -l user -p 2222
Here illustrates the example of addional challenge
before the fixed
plugin.
./out/sshpiperd -i /tmp/sshpiperkey --server-key-generate-mode notexist --log-level=trace ./out/simplemath -- ./out/fixed --target 127.0.0.1:5522
Plugin list
/home
-like directory to managed upstreams routing by sshpiped.recording the screen in asciicast
format https://docs.asciinema.org/manual/asciicast/v2/
To use it, start sshpiperd with --screen-recording-format asciicast
and --screen-recording-dir /path/to/recordingdir
Example:
```
ssh user_name@
... do some commands
exit
asciinema play /path/to/recordingdir/<conn_guid>/shell-channel-0.cast
```
recording the screen in typescript
format (not the lang). The format is compatible with scriptreplay(1)
To use it, start sshpiperd with --screen-recording-format typescript
and --screen-recording-dir /path/to/recordingdir
Example:
```
ssh user_name@127.0.0.1 -p 2222
... do some commands
exit
$ cd /path/to/recordingdir/<conn_guid>
$ ls *.timing *.typescript
1472847798.timing 1472847798.typescript
$ scriptreplay -t 1472847798.timing 1472847798.typescript # will replay the ssh session
```
During SSH publickey auth, RFC 4252 Section 7,
ssh client sign session_id
and some other data using private key into a signature sig
.
This is for server to verify that the connection is from the client not the man in the middle
.
However, sshpiper actually holds two ssh connection, and it is doing what the man in the middle
does.
the two ssh connections' session_id
will never be the same, because they are hash of the shared secret. RFC 4253 Section 7.2.
To support publickey auth, sshpiper
routing plugin must provide a new private key for the upstream
to sign the session_id
. This new private key is called mapping key
.
How this work
+------------+ +------------------------+
| | | |
| client | | sshpiper |
| PK_X +--------> | |
| | | v |
| | | Check Permission |
+------------+ | | |
| | |
| | | +----------------+
| v | | |
| sign again | | server |
| using PK_Y +--------------> check PK_Y |
| | | |
| | | |
+------------------------+ +----------------+
v0
v1
sshpiperd
code.grpc
is first class now, the plugins are built on top of itFor plugins already in v1
, you need change params to new params. However, not all plugins are migrated to v1
yet, they are being migrated gradually. you can still use the old plugins in v0
branch
see CONTRIBUTING.md
MIT