mirror of
https://github.com/netbirdio/netbird.git
synced 2025-06-04 00:55:58 +02:00
[client] Report client system flags to management server on login (#3187)
This commit is contained in:
parent
c6f7a299a9
commit
bc7b2c6ba3
@ -162,7 +162,7 @@ func (a *Auth) login(urlOpener URLOpener) error {
|
|||||||
|
|
||||||
// check if we need to generate JWT token
|
// check if we need to generate JWT token
|
||||||
err := a.withBackOff(a.ctx, func() (err error) {
|
err := a.withBackOff(a.ctx, func() (err error) {
|
||||||
needsLogin, err = internal.IsLoginRequired(a.ctx, a.config.PrivateKey, a.config.ManagementURL, a.config.SSHKey)
|
needsLogin, err = internal.IsLoginRequired(a.ctx, a.config)
|
||||||
return
|
return
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -183,7 +183,7 @@ func (c *ConnectClient) run(mobileDependency MobileDependency, probes *ProbeHold
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
// connect (just a connection, no stream yet) and login to Management Service to get an initial global Wiretrustee config
|
// connect (just a connection, no stream yet) and login to Management Service to get an initial global Wiretrustee config
|
||||||
loginResp, err := loginToManagement(engineCtx, mgmClient, publicSSHKey)
|
loginResp, err := loginToManagement(engineCtx, mgmClient, publicSSHKey, c.config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debug(err)
|
log.Debug(err)
|
||||||
if s, ok := gstatus.FromError(err); ok && (s.Code() == codes.PermissionDenied) {
|
if s, ok := gstatus.FromError(err); ok && (s.Code() == codes.PermissionDenied) {
|
||||||
@ -463,7 +463,7 @@ func connectToSignal(ctx context.Context, wtConfig *mgmProto.WiretrusteeConfig,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// loginToManagement creates Management Services client, establishes a connection, logs-in and gets a global Wiretrustee config (signal, turn, stun hosts, etc)
|
// loginToManagement creates Management Services client, establishes a connection, logs-in and gets a global Wiretrustee config (signal, turn, stun hosts, etc)
|
||||||
func loginToManagement(ctx context.Context, client mgm.Client, pubSSHKey []byte) (*mgmProto.LoginResponse, error) {
|
func loginToManagement(ctx context.Context, client mgm.Client, pubSSHKey []byte, config *Config) (*mgmProto.LoginResponse, error) {
|
||||||
|
|
||||||
serverPublicKey, err := client.GetServerPublicKey()
|
serverPublicKey, err := client.GetServerPublicKey()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -471,6 +471,15 @@ func loginToManagement(ctx context.Context, client mgm.Client, pubSSHKey []byte)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sysInfo := system.GetInfo(ctx)
|
sysInfo := system.GetInfo(ctx)
|
||||||
|
sysInfo.SetFlags(
|
||||||
|
config.RosenpassEnabled,
|
||||||
|
config.RosenpassPermissive,
|
||||||
|
config.ServerSSHAllowed,
|
||||||
|
config.DisableClientRoutes,
|
||||||
|
config.DisableServerRoutes,
|
||||||
|
config.DisableDNS,
|
||||||
|
config.DisableFirewall,
|
||||||
|
)
|
||||||
loginResp, err := client.Login(*serverPublicKey, sysInfo, pubSSHKey)
|
loginResp, err := client.Login(*serverPublicKey, sysInfo, pubSSHKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -716,6 +716,15 @@ func (e *Engine) updateChecksIfNew(checks []*mgmProto.Checks) error {
|
|||||||
log.Warnf("failed to get system info with checks: %v", err)
|
log.Warnf("failed to get system info with checks: %v", err)
|
||||||
info = system.GetInfo(e.ctx)
|
info = system.GetInfo(e.ctx)
|
||||||
}
|
}
|
||||||
|
info.SetFlags(
|
||||||
|
e.config.RosenpassEnabled,
|
||||||
|
e.config.RosenpassPermissive,
|
||||||
|
&e.config.ServerSSHAllowed,
|
||||||
|
e.config.DisableClientRoutes,
|
||||||
|
e.config.DisableServerRoutes,
|
||||||
|
e.config.DisableDNS,
|
||||||
|
e.config.DisableFirewall,
|
||||||
|
)
|
||||||
|
|
||||||
if err := e.mgmClient.SyncMeta(info); err != nil {
|
if err := e.mgmClient.SyncMeta(info); err != nil {
|
||||||
log.Errorf("could not sync meta: error %s", err)
|
log.Errorf("could not sync meta: error %s", err)
|
||||||
@ -824,6 +833,15 @@ func (e *Engine) receiveManagementEvents() {
|
|||||||
log.Warnf("failed to get system info with checks: %v", err)
|
log.Warnf("failed to get system info with checks: %v", err)
|
||||||
info = system.GetInfo(e.ctx)
|
info = system.GetInfo(e.ctx)
|
||||||
}
|
}
|
||||||
|
info.SetFlags(
|
||||||
|
e.config.RosenpassEnabled,
|
||||||
|
e.config.RosenpassPermissive,
|
||||||
|
&e.config.ServerSSHAllowed,
|
||||||
|
e.config.DisableClientRoutes,
|
||||||
|
e.config.DisableServerRoutes,
|
||||||
|
e.config.DisableDNS,
|
||||||
|
e.config.DisableFirewall,
|
||||||
|
)
|
||||||
|
|
||||||
// err = e.mgmClient.Sync(info, e.handleSync)
|
// err = e.mgmClient.Sync(info, e.handleSync)
|
||||||
err = e.mgmClient.Sync(e.ctx, info, e.handleSync)
|
err = e.mgmClient.Sync(e.ctx, info, e.handleSync)
|
||||||
@ -1354,6 +1372,16 @@ func (e *Engine) close() {
|
|||||||
|
|
||||||
func (e *Engine) readInitialSettings() ([]*route.Route, *nbdns.Config, error) {
|
func (e *Engine) readInitialSettings() ([]*route.Route, *nbdns.Config, error) {
|
||||||
info := system.GetInfo(e.ctx)
|
info := system.GetInfo(e.ctx)
|
||||||
|
info.SetFlags(
|
||||||
|
e.config.RosenpassEnabled,
|
||||||
|
e.config.RosenpassPermissive,
|
||||||
|
&e.config.ServerSSHAllowed,
|
||||||
|
e.config.DisableClientRoutes,
|
||||||
|
e.config.DisableServerRoutes,
|
||||||
|
e.config.DisableDNS,
|
||||||
|
e.config.DisableFirewall,
|
||||||
|
)
|
||||||
|
|
||||||
netMap, err := e.mgmClient.GetNetworkMap(info)
|
netMap, err := e.mgmClient.GetNetworkMap(info)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
|
@ -17,8 +17,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// IsLoginRequired check that the server is support SSO or not
|
// IsLoginRequired check that the server is support SSO or not
|
||||||
func IsLoginRequired(ctx context.Context, privateKey string, mgmURL *url.URL, sshKey string) (bool, error) {
|
func IsLoginRequired(ctx context.Context, config *Config) (bool, error) {
|
||||||
mgmClient, err := getMgmClient(ctx, privateKey, mgmURL)
|
mgmURL := config.ManagementURL
|
||||||
|
mgmClient, err := getMgmClient(ctx, config.PrivateKey, mgmURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
@ -33,12 +34,12 @@ func IsLoginRequired(ctx context.Context, privateKey string, mgmURL *url.URL, ss
|
|||||||
}()
|
}()
|
||||||
log.Debugf("connected to the Management service %s", mgmURL.String())
|
log.Debugf("connected to the Management service %s", mgmURL.String())
|
||||||
|
|
||||||
pubSSHKey, err := ssh.GeneratePublicKey([]byte(sshKey))
|
pubSSHKey, err := ssh.GeneratePublicKey([]byte(config.SSHKey))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = doMgmLogin(ctx, mgmClient, pubSSHKey)
|
_, err = doMgmLogin(ctx, mgmClient, pubSSHKey, config)
|
||||||
if isLoginNeeded(err) {
|
if isLoginNeeded(err) {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
@ -67,10 +68,10 @@ func Login(ctx context.Context, config *Config, setupKey string, jwtToken string
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
serverKey, err := doMgmLogin(ctx, mgmClient, pubSSHKey)
|
serverKey, err := doMgmLogin(ctx, mgmClient, pubSSHKey, config)
|
||||||
if serverKey != nil && isRegistrationNeeded(err) {
|
if serverKey != nil && isRegistrationNeeded(err) {
|
||||||
log.Debugf("peer registration required")
|
log.Debugf("peer registration required")
|
||||||
_, err = registerPeer(ctx, *serverKey, mgmClient, setupKey, jwtToken, pubSSHKey)
|
_, err = registerPeer(ctx, *serverKey, mgmClient, setupKey, jwtToken, pubSSHKey, config)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,7 +100,7 @@ func getMgmClient(ctx context.Context, privateKey string, mgmURL *url.URL) (*mgm
|
|||||||
return mgmClient, err
|
return mgmClient, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func doMgmLogin(ctx context.Context, mgmClient *mgm.GrpcClient, pubSSHKey []byte) (*wgtypes.Key, error) {
|
func doMgmLogin(ctx context.Context, mgmClient *mgm.GrpcClient, pubSSHKey []byte, config *Config) (*wgtypes.Key, error) {
|
||||||
serverKey, err := mgmClient.GetServerPublicKey()
|
serverKey, err := mgmClient.GetServerPublicKey()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("failed while getting Management Service public key: %v", err)
|
log.Errorf("failed while getting Management Service public key: %v", err)
|
||||||
@ -107,13 +108,22 @@ func doMgmLogin(ctx context.Context, mgmClient *mgm.GrpcClient, pubSSHKey []byte
|
|||||||
}
|
}
|
||||||
|
|
||||||
sysInfo := system.GetInfo(ctx)
|
sysInfo := system.GetInfo(ctx)
|
||||||
|
sysInfo.SetFlags(
|
||||||
|
config.RosenpassEnabled,
|
||||||
|
config.RosenpassPermissive,
|
||||||
|
config.ServerSSHAllowed,
|
||||||
|
config.DisableClientRoutes,
|
||||||
|
config.DisableServerRoutes,
|
||||||
|
config.DisableDNS,
|
||||||
|
config.DisableFirewall,
|
||||||
|
)
|
||||||
_, err = mgmClient.Login(*serverKey, sysInfo, pubSSHKey)
|
_, err = mgmClient.Login(*serverKey, sysInfo, pubSSHKey)
|
||||||
return serverKey, err
|
return serverKey, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// registerPeer checks whether setupKey was provided via cmd line and if not then it prompts user to enter a key.
|
// registerPeer checks whether setupKey was provided via cmd line and if not then it prompts user to enter a key.
|
||||||
// Otherwise tries to register with the provided setupKey via command line.
|
// Otherwise tries to register with the provided setupKey via command line.
|
||||||
func registerPeer(ctx context.Context, serverPublicKey wgtypes.Key, client *mgm.GrpcClient, setupKey string, jwtToken string, pubSSHKey []byte) (*mgmProto.LoginResponse, error) {
|
func registerPeer(ctx context.Context, serverPublicKey wgtypes.Key, client *mgm.GrpcClient, setupKey string, jwtToken string, pubSSHKey []byte, config *Config) (*mgmProto.LoginResponse, error) {
|
||||||
validSetupKey, err := uuid.Parse(setupKey)
|
validSetupKey, err := uuid.Parse(setupKey)
|
||||||
if err != nil && jwtToken == "" {
|
if err != nil && jwtToken == "" {
|
||||||
return nil, status.Errorf(codes.InvalidArgument, "invalid setup-key or no sso information provided, err: %v", err)
|
return nil, status.Errorf(codes.InvalidArgument, "invalid setup-key or no sso information provided, err: %v", err)
|
||||||
@ -121,6 +131,15 @@ func registerPeer(ctx context.Context, serverPublicKey wgtypes.Key, client *mgm.
|
|||||||
|
|
||||||
log.Debugf("sending peer registration request to Management Service")
|
log.Debugf("sending peer registration request to Management Service")
|
||||||
info := system.GetInfo(ctx)
|
info := system.GetInfo(ctx)
|
||||||
|
info.SetFlags(
|
||||||
|
config.RosenpassEnabled,
|
||||||
|
config.RosenpassPermissive,
|
||||||
|
config.ServerSSHAllowed,
|
||||||
|
config.DisableClientRoutes,
|
||||||
|
config.DisableServerRoutes,
|
||||||
|
config.DisableDNS,
|
||||||
|
config.DisableFirewall,
|
||||||
|
)
|
||||||
loginResp, err := client.Register(serverPublicKey, validSetupKey.String(), jwtToken, info, pubSSHKey)
|
loginResp, err := client.Register(serverPublicKey, validSetupKey.String(), jwtToken, info, pubSSHKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("failed registering peer %v,%s", err, validSetupKey.String())
|
log.Errorf("failed registering peer %v,%s", err, validSetupKey.String())
|
||||||
|
@ -207,7 +207,7 @@ func (c *Client) IsLoginRequired() bool {
|
|||||||
ConfigPath: c.cfgFile,
|
ConfigPath: c.cfgFile,
|
||||||
})
|
})
|
||||||
|
|
||||||
needsLogin, _ := internal.IsLoginRequired(ctx, cfg.PrivateKey, cfg.ManagementURL, cfg.SSHKey)
|
needsLogin, _ := internal.IsLoginRequired(ctx, cfg)
|
||||||
return needsLogin
|
return needsLogin
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ func (a *Auth) Login() error {
|
|||||||
|
|
||||||
// check if we need to generate JWT token
|
// check if we need to generate JWT token
|
||||||
err := a.withBackOff(a.ctx, func() (err error) {
|
err := a.withBackOff(a.ctx, func() (err error) {
|
||||||
needsLogin, err = internal.IsLoginRequired(a.ctx, a.config.PrivateKey, a.config.ManagementURL, a.config.SSHKey)
|
needsLogin, err = internal.IsLoginRequired(a.ctx, a.config)
|
||||||
return
|
return
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -59,6 +59,31 @@ type Info struct {
|
|||||||
SystemManufacturer string
|
SystemManufacturer string
|
||||||
Environment Environment
|
Environment Environment
|
||||||
Files []File // for posture checks
|
Files []File // for posture checks
|
||||||
|
|
||||||
|
RosenpassEnabled bool
|
||||||
|
RosenpassPermissive bool
|
||||||
|
ServerSSHAllowed bool
|
||||||
|
DisableClientRoutes bool
|
||||||
|
DisableServerRoutes bool
|
||||||
|
DisableDNS bool
|
||||||
|
DisableFirewall bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Info) SetFlags(
|
||||||
|
rosenpassEnabled, rosenpassPermissive bool,
|
||||||
|
serverSSHAllowed *bool,
|
||||||
|
disableClientRoutes, disableServerRoutes,
|
||||||
|
disableDNS, disableFirewall bool,
|
||||||
|
) {
|
||||||
|
i.RosenpassEnabled = rosenpassEnabled
|
||||||
|
i.RosenpassPermissive = rosenpassPermissive
|
||||||
|
if serverSSHAllowed != nil {
|
||||||
|
i.ServerSSHAllowed = *serverSSHAllowed
|
||||||
|
}
|
||||||
|
i.DisableClientRoutes = disableClientRoutes
|
||||||
|
i.DisableServerRoutes = disableServerRoutes
|
||||||
|
i.DisableDNS = disableDNS
|
||||||
|
i.DisableFirewall = disableFirewall
|
||||||
}
|
}
|
||||||
|
|
||||||
// StaticInfo is an object that contains machine information that does not change
|
// StaticInfo is an object that contains machine information that does not change
|
||||||
|
@ -540,5 +540,15 @@ func infoToMetaData(info *system.Info) *proto.PeerSystemMeta {
|
|||||||
Platform: info.Environment.Platform,
|
Platform: info.Environment.Platform,
|
||||||
},
|
},
|
||||||
Files: files,
|
Files: files,
|
||||||
|
|
||||||
|
Flags: &proto.Flags{
|
||||||
|
RosenpassEnabled: info.RosenpassEnabled,
|
||||||
|
RosenpassPermissive: info.RosenpassPermissive,
|
||||||
|
ServerSSHAllowed: info.ServerSSHAllowed,
|
||||||
|
DisableClientRoutes: info.DisableClientRoutes,
|
||||||
|
DisableServerRoutes: info.DisableServerRoutes,
|
||||||
|
DisableDNS: info.DisableDNS,
|
||||||
|
DisableFirewall: info.DisableFirewall,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -128,6 +128,16 @@ message File {
|
|||||||
bool processIsRunning = 3;
|
bool processIsRunning = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message Flags {
|
||||||
|
bool rosenpassEnabled = 1;
|
||||||
|
bool rosenpassPermissive = 2;
|
||||||
|
bool serverSSHAllowed = 3;
|
||||||
|
bool disableClientRoutes = 4;
|
||||||
|
bool disableServerRoutes = 5;
|
||||||
|
bool disableDNS = 6;
|
||||||
|
bool disableFirewall = 7;
|
||||||
|
}
|
||||||
|
|
||||||
// PeerSystemMeta is machine meta data like OS and version.
|
// PeerSystemMeta is machine meta data like OS and version.
|
||||||
message PeerSystemMeta {
|
message PeerSystemMeta {
|
||||||
string hostname = 1;
|
string hostname = 1;
|
||||||
@ -146,6 +156,7 @@ message PeerSystemMeta {
|
|||||||
string sysManufacturer = 14;
|
string sysManufacturer = 14;
|
||||||
Environment environment = 15;
|
Environment environment = 15;
|
||||||
repeated File files = 16;
|
repeated File files = 16;
|
||||||
|
Flags flags = 17;
|
||||||
}
|
}
|
||||||
|
|
||||||
message LoginResponse {
|
message LoginResponse {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user