diff --git a/client/android/ssh_client.go b/client/android/ssh_client.go index 1c4015906..fe908a971 100644 --- a/client/android/ssh_client.go +++ b/client/android/ssh_client.go @@ -355,7 +355,7 @@ func (s *SSHClient) buildAuth(cfg *profilemanager.Config, engine *internal.Engin return nil, nil, fmt.Errorf("jwt: %w", err) } auths := []gossh.AuthMethod{gossh.Password(token)} - return auths, nbssh.CreateHostKeyCallback(engine), nil + return auths, nbssh.CreateHostKeyCallback(nbssh.PeerKeyLookup(engine.GetPeerSSHKey)), nil case detection.ServerTypeNetBirdNoJWT: if cfg.SSHKey == "" { @@ -366,7 +366,7 @@ func (s *SSHClient) buildAuth(cfg *profilemanager.Config, engine *internal.Engin return nil, nil, fmt.Errorf("parse netbird ssh key: %w", err) } auths := []gossh.AuthMethod{gossh.PublicKeys(signer)} - return auths, nbssh.CreateHostKeyCallback(engine), nil + return auths, nbssh.CreateHostKeyCallback(nbssh.PeerKeyLookup(engine.GetPeerSSHKey)), nil case detection.ServerTypeRegular: var auths []gossh.AuthMethod diff --git a/client/embed/embed.go b/client/embed/embed.go index 6a3c25c33..1b2d84d7e 100644 --- a/client/embed/embed.go +++ b/client/embed/embed.go @@ -21,6 +21,7 @@ import ( "github.com/netbirdio/netbird/client/internal/auth" "github.com/netbirdio/netbird/client/internal/peer" "github.com/netbirdio/netbird/client/internal/profilemanager" + nbssh "github.com/netbirdio/netbird/client/ssh" "github.com/netbirdio/netbird/client/system" "github.com/netbirdio/netbird/shared/management/domain" mgmProto "github.com/netbirdio/netbird/shared/management/proto" @@ -520,7 +521,7 @@ func (c *Client) VerifySSHHostKey(peerAddress string, key []byte) error { return err } - return engine.VerifySSHHostKey(peerAddress, key) + return nbssh.PeerKeyLookup(engine.GetPeerSSHKey).VerifySSHHostKey(peerAddress, key) } // SetPerformance retunes a running Client. Only PreallocatedBuffersPerPool diff --git a/client/internal/engine_ssh.go b/client/internal/engine_ssh.go index 5c86884db..53d2c1122 100644 --- a/client/internal/engine_ssh.go +++ b/client/internal/engine_ssh.go @@ -12,7 +12,6 @@ import ( firewallManager "github.com/netbirdio/netbird/client/firewall/manager" "github.com/netbirdio/netbird/client/iface/netstack" nftypes "github.com/netbirdio/netbird/client/internal/netflow/types" - nbssh "github.com/netbirdio/netbird/client/ssh" sshauth "github.com/netbirdio/netbird/client/ssh/auth" sshconfig "github.com/netbirdio/netbird/client/ssh/config" sshserver "github.com/netbirdio/netbird/client/ssh/server" @@ -217,16 +216,6 @@ func (e *Engine) GetPeerSSHKey(peerAddress string) ([]byte, bool) { return nil, false } -// VerifySSHHostKey verifies a presented SSH host key against the stored key of -// the peer at peerAddress. It implements ssh.HostKeyVerifier. -func (e *Engine) VerifySSHHostKey(peerAddress string, presentedKey []byte) error { - storedKey, found := e.GetPeerSSHKey(peerAddress) - if !found { - return nbssh.ErrPeerNotFound - } - return nbssh.VerifyHostKey(storedKey, presentedKey, peerAddress) -} - // cleanupSSHConfig removes NetBird SSH client configuration on shutdown func (e *Engine) cleanupSSHConfig() { if netstack.IsEnabled() { diff --git a/client/ssh/common.go b/client/ssh/common.go index 92e647b7d..934bcbba6 100644 --- a/client/ssh/common.go +++ b/client/ssh/common.go @@ -34,6 +34,19 @@ type HostKeyVerifier interface { VerifySSHHostKey(peerAddress string, key []byte) error } +// PeerKeyLookup returns the stored SSH host key for a peer address. +type PeerKeyLookup func(peerAddress string) ([]byte, bool) + +// VerifySSHHostKey implements HostKeyVerifier by looking up the stored key +// and comparing it against the presented key. +func (l PeerKeyLookup) VerifySSHHostKey(peerAddress string, presentedKey []byte) error { + storedKey, found := l(peerAddress) + if !found { + return ErrPeerNotFound + } + return VerifyHostKey(storedKey, presentedKey, peerAddress) +} + // DaemonHostKeyVerifier implements HostKeyVerifier using the NetBird daemon type DaemonHostKeyVerifier struct { client proto.DaemonServiceClient @@ -193,4 +206,3 @@ func buildAddressList(hostname string, remote net.Addr) []string { } return addresses } -