Skip to content

Commit 98d36f4

Browse files
committed
fixing duplicate port forwarding events and blocking node:forwarding SessionData events on ServerContext.Close()
1 parent e124d38 commit 98d36f4

File tree

2 files changed

+14
-10
lines changed

2 files changed

+14
-10
lines changed

lib/srv/forward/sshserver.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -875,7 +875,7 @@ func (s *Server) handleConnection(ctx context.Context, chans <-chan ssh.NewChann
875875

876876
// handleClientChannels handles channel open requests from the remote server.
877877
func (s *Server) handleClientChannels(ctx context.Context, forwardedTCPIP <-chan ssh.NewChannel, localAddr, remoteAddr string) {
878-
forwarding := false
878+
var forwarding bool
879879
defer func() {
880880
// don't log the stop code unless we've logged the start code
881881
if !forwarding {
@@ -1710,7 +1710,15 @@ func isTeleportEnv(varName string) bool {
17101710
}
17111711

17121712
func (s *Server) emitAuditEventWithLog(ctx context.Context, event apievents.AuditEvent) {
1713+
// avoid emitting duplicate port forward audit events when targeting and agent
1714+
if !s.targetServer.IsOpenSSHNode() {
1715+
switch event.GetType() {
1716+
case events.PortForwardEvent, events.PortForwardLocalEvent, events.PortForwardRemoteEvent, events.PortForwardRemoteConnEvent:
1717+
return
1718+
}
1719+
}
1720+
17131721
if err := s.EmitAuditEvent(ctx, event); err != nil {
1714-
s.logger.WarnContext(ctx, "Failed to emit event", "type", event.GetType(), "code", event.GetCode())
1722+
s.logger.WarnContext(ctx, "Failed to emit event", "type", event.GetType(), "code", event.GetCode(), "error", err)
17151723
}
17161724
}

lib/srv/regular/sshserver.go

+4-8
Original file line numberDiff line numberDiff line change
@@ -1384,7 +1384,7 @@ func (s *Server) HandleNewChan(ctx context.Context, ccx *sshutils.ConnectionCont
13841384
d, ok := ccx.IncrSessions(max)
13851385
if !ok {
13861386
// user has exceeded their max concurrent ssh sessions.
1387-
if err := s.EmitAuditEvent(s.ctx, &apievents.SessionReject{
1387+
s.emitAuditEventWithLog(s.ctx, &apievents.SessionReject{
13881388
Metadata: apievents.Metadata{
13891389
Type: events.SessionRejectedEvent,
13901390
Code: events.SessionRejectedCode,
@@ -1402,9 +1402,7 @@ func (s *Server) HandleNewChan(ctx context.Context, ccx *sshutils.ConnectionCont
14021402
},
14031403
Reason: events.SessionRejectedReasonMaxSessions,
14041404
Maximum: max,
1405-
}); err != nil {
1406-
s.logger.WarnContext(ctx, "Failed to emit session reject event", "error", err)
1407-
}
1405+
})
14081406
s.rejectChannel(ctx, nch, ssh.Prohibited, fmt.Sprintf("too many session channels for user %q (max=%d)", identityContext.TeleportUser, max))
14091407
return
14101408
}
@@ -2339,9 +2337,7 @@ func (s *Server) handleTCPIPForwardRequest(ctx context.Context, ccx *sshutils.Co
23392337
// been closed already via a cancel-tcpip-forward request.
23402338
ccx.AddCloser(utils.CloseFunc(func() error {
23412339
event := scx.GetPortForwardEvent(events.PortForwardRemoteEvent, events.PortForwardStopCode, addr)
2342-
if err := s.EmitAuditEvent(context.Background(), &event); err != nil {
2343-
s.logger.WarnContext(context.Background(), "Failed to emit audit event", "error", err)
2344-
}
2340+
s.emitAuditEventWithLog(ctx, &event)
23452341

23462342
listener, ok := s.remoteForwardingMap.LoadAndDelete(scx.SrcAddr)
23472343
if ok {
@@ -2461,6 +2457,6 @@ func (s *Server) handlePuTTYWinadj(ctx context.Context, req *ssh.Request) error
24612457

24622458
func (s *Server) emitAuditEventWithLog(ctx context.Context, event apievents.AuditEvent) {
24632459
if err := s.EmitAuditEvent(ctx, event); err != nil {
2464-
s.logger.WarnContext(ctx, "Failed to emit event", "type", event.GetType(), "code", event.GetCode())
2460+
s.logger.WarnContext(ctx, "Failed to emit event", "type", event.GetType(), "code", event.GetCode(), "error", err)
24652461
}
24662462
}

0 commit comments

Comments
 (0)