diff --git a/cmd/sshpiperd/daemon.go b/cmd/sshpiperd/daemon.go index 98fe986b..b43d318b 100644 --- a/cmd/sshpiperd/daemon.go +++ b/cmd/sshpiperd/daemon.go @@ -19,7 +19,8 @@ type daemon struct { lis net.Listener loginGraceTime time.Duration - recorddir string + recorddir string + filterHostkeysReqeust bool } func newDaemon(ctx *cli.Context) (*daemon, error) { @@ -147,6 +148,8 @@ func (d *daemon) run() error { log.Infof("ssh connection pipe created %v (username [%v]) -> %v (username [%v])", p.DownstreamConnMeta().RemoteAddr(), p.DownstreamConnMeta().User(), p.UpstreamConnMeta().RemoteAddr(), p.UpstreamConnMeta().User()) var uphook func([]byte) ([]byte, error) + var downhook func([]byte) ([]byte, error) + if d.recorddir != "" { recorddir := path.Join(d.recorddir, p.DownstreamConnMeta().User()) err = os.MkdirAll(recorddir, 0700) @@ -164,7 +167,22 @@ func (d *daemon) run() error { uphook = recorder.loggingTty } - err = p.WaitWithHook(uphook, nil) + if d.filterHostkeysReqeust { + uphook = func(b []byte) ([]byte, error) { + if b[0] == 80 { + var x struct { + RequestName string `sshtype:"80"` + } + _ = ssh.Unmarshal(b, &x) + if x.RequestName == "hostkeys-prove-00@openssh.com" || x.RequestName == "hostkeys-00@openssh.com" { + return nil, nil + } + } + return b, nil + } + } + + err = p.WaitWithHook(uphook, downhook) log.Infof("connection from %v closed reason: %v", c.RemoteAddr(), err) }(conn) diff --git a/cmd/sshpiperd/main.go b/cmd/sshpiperd/main.go index e46cac42..ca2d0be1 100644 --- a/cmd/sshpiperd/main.go +++ b/cmd/sshpiperd/main.go @@ -127,6 +127,12 @@ func main() { Usage: "display a banner from file before authentication", EnvVars: []string{"SSHPIPERD_BANNERFILE"}, }, + &cli.BoolFlag{ + Name: "drop-hostkeys-message", + Value: false, + Usage: "filter out hostkeys-00@openssh.com which cause client side warnings", + EnvVars: []string{"SSHPIPERD_DROP_HOSTKEYS_MESSAGE"}, + }, }, Action: func(ctx *cli.Context) error { level, err := log.ParseLevel(ctx.String("log-level")) @@ -201,6 +207,7 @@ func main() { } d.recorddir = ctx.String("typescript-log-dir") + d.filterHostkeysReqeust = ctx.Bool("drop-hostkeys-message") go func() { quit <- d.run()