use correct session recording mode in session start and end events (#29584)

This commit is contained in:
Andrew LeFevre
2023-07-26 15:14:18 +00:00
committed by GitHub
parent 3628eae679
commit c399d8ac9d
2 changed files with 109 additions and 2 deletions
+19 -2
View File
@@ -883,7 +883,7 @@ func (s *session) emitSessionStartEvent(ctx *ServerContext) {
RemoteAddr: ctx.ServerConn.RemoteAddr().String(),
Protocol: events.EventProtocolSSH,
},
SessionRecording: ctx.SessionRecordingConfig.GetMode(),
SessionRecording: s.sessionRecordingMode(),
InitialCommand: initialCommand,
}
@@ -1041,7 +1041,7 @@ func (s *session) emitSessionEndEvent() {
Interactive: s.term != nil,
StartTime: start,
EndTime: end,
SessionRecording: ctx.SessionRecordingConfig.GetMode(),
SessionRecording: s.sessionRecordingMode(),
}
for _, p := range s.participants {
@@ -1067,6 +1067,23 @@ func (s *session) emitSessionEndEvent() {
}
}
func (s *session) sessionRecordingMode() string {
sessionRecMode := s.scx.SessionRecordingConfig.GetMode()
subKind := s.serverMeta.ServerSubKind
// agentless connections always record the session at the proxy
if !services.IsRecordAtProxy(sessionRecMode) && (subKind == types.SubKindOpenSSHNode ||
subKind == types.SubKindOpenSSHEC2InstanceConnectEndpointNode) {
if services.IsRecordSync(sessionRecMode) {
sessionRecMode = types.RecordAtProxySync
} else {
sessionRecMode = types.RecordAtProxy
}
}
return sessionRecMode
}
func (s *session) setEndingContext(ctx *ServerContext) {
s.mu.Lock()
defer s.mu.Unlock()
+90
View File
@@ -908,3 +908,93 @@ func TestTrackingSession(t *testing.T) {
})
}
}
func TestSessionRecordingMode(t *testing.T) {
tests := []struct {
name string
serverSubKind string
mode string
expectedMode string
}{
{
name: "teleport node record at node",
serverSubKind: types.SubKindTeleportNode,
mode: types.RecordAtNode,
expectedMode: types.RecordAtNode,
},
{
name: "teleport node record at proxy",
serverSubKind: types.SubKindTeleportNode,
mode: types.RecordAtProxy,
expectedMode: types.RecordAtProxy,
},
{
name: "agentless node record at node",
serverSubKind: types.SubKindOpenSSHNode,
mode: types.RecordAtNode,
expectedMode: types.RecordAtProxy,
},
{
name: "agentless node record at proxy",
serverSubKind: types.SubKindOpenSSHNode,
mode: types.RecordAtProxy,
expectedMode: types.RecordAtProxy,
},
{
name: "agentless node record at node sync",
serverSubKind: types.SubKindOpenSSHNode,
mode: types.RecordAtNodeSync,
expectedMode: types.RecordAtProxySync,
},
{
name: "agentless node record at proxy sync",
serverSubKind: types.SubKindOpenSSHNode,
mode: types.RecordAtProxySync,
expectedMode: types.RecordAtProxySync,
},
{
name: "ec2 node record at node",
serverSubKind: types.SubKindOpenSSHEC2InstanceConnectEndpointNode,
mode: types.RecordAtNode,
expectedMode: types.RecordAtProxy,
},
{
name: "ec2 node record at proxy",
serverSubKind: types.SubKindOpenSSHEC2InstanceConnectEndpointNode,
mode: types.RecordAtProxy,
expectedMode: types.RecordAtProxy,
},
{
name: "ec2 node record at node sync",
serverSubKind: types.SubKindOpenSSHEC2InstanceConnectEndpointNode,
mode: types.RecordAtNodeSync,
expectedMode: types.RecordAtProxySync,
},
{
name: "ec2 node record at proxy sync",
serverSubKind: types.SubKindOpenSSHEC2InstanceConnectEndpointNode,
mode: types.RecordAtProxySync,
expectedMode: types.RecordAtProxySync,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
sess := session{
scx: &ServerContext{
SessionRecordingConfig: &types.SessionRecordingConfigV2{
Spec: types.SessionRecordingConfigSpecV2{
Mode: tt.mode,
},
},
},
serverMeta: apievents.ServerMetadata{
ServerSubKind: tt.serverSubKind,
},
}
gotMode := sess.sessionRecordingMode()
require.Equal(t, tt.expectedMode, gotMode)
})
}
}