Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions integration/appaccess/pack.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import (
"github.com/gravitational/teleport/lib/auth"
"github.com/gravitational/teleport/lib/auth/native"
"github.com/gravitational/teleport/lib/client"
"github.com/gravitational/teleport/lib/events"
"github.com/gravitational/teleport/lib/httplib/csrf"
"github.com/gravitational/teleport/lib/reversetunnel"
"github.com/gravitational/teleport/lib/service"
Expand Down Expand Up @@ -357,16 +358,15 @@ func (p *Pack) makeWebapiRequest(method, endpoint string, payload []byte) (int,
}

func (p *Pack) ensureAuditEvent(t *testing.T, eventType string, checkEvent func(event apievents.AuditEvent)) {
ctx := context.Background()
require.Eventuallyf(t, func() bool {
events, _, err := p.rootCluster.Process.GetAuthServer().SearchEvents(
time.Now().Add(-time.Hour),
time.Now().Add(time.Hour),
apidefaults.Namespace,
[]string{eventType},
1,
types.EventOrderDescending,
"",
)
events, _, err := p.rootCluster.Process.GetAuthServer().SearchEvents(ctx, events.SearchEventsRequest{
From: time.Now().Add(-time.Hour),
To: time.Now().Add(time.Hour),
EventTypes: []string{eventType},
Limit: 1,
Order: types.EventOrderDescending,
})
require.NoError(t, err)
if len(events) == 0 {
return false
Expand Down
10 changes: 9 additions & 1 deletion integration/helpers/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import (
"github.com/gravitational/teleport/lib/client/identityfile"
"github.com/gravitational/teleport/lib/cloud"
"github.com/gravitational/teleport/lib/defaults"
"github.com/gravitational/teleport/lib/events"
"github.com/gravitational/teleport/lib/multiplexer"
"github.com/gravitational/teleport/lib/service"
"github.com/gravitational/teleport/lib/service/servicecfg"
Expand Down Expand Up @@ -258,8 +259,15 @@ func WaitForAuditEventTypeWithBackoff(t *testing.T, cli *auth.Server, startTime
if err != nil {
t.Fatalf("failed to create linear backoff: %v", err)
}
ctx := context.Background()
for {
events, _, err := cli.SearchEvents(startTime, time.Now().Add(time.Hour), apidefaults.Namespace, []string{eventType}, 100, types.EventOrderAscending, "")
events, _, err := cli.SearchEvents(ctx, events.SearchEventsRequest{
From: startTime,
To: time.Now().Add(time.Hour),
EventTypes: []string{eventType},
Limit: 100,
Order: types.EventOrderAscending,
})
if err != nil {
t.Fatalf("failed to call SearchEvents: %v", err)
}
Expand Down
7 changes: 6 additions & 1 deletion integration/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2324,7 +2324,12 @@ func twoClustersTunnel(t *testing.T, suite *integrationTestSuite, now time.Time,
eventTypes := []string{events.ExecEvent}

return func() bool {
eventsInSite, _, err := site.SearchEvents(now, now.Add(1*time.Hour), defaults.Namespace, eventTypes, 0, types.EventOrderAscending, "")
eventsInSite, _, err := site.SearchEvents(ctx, events.SearchEventsRequest{
From: now,
To: now.Add(1 * time.Hour),
EventTypes: eventTypes,
Order: types.EventOrderAscending,
})
require.NoError(t, err)
return len(eventsInSite) == count
}
Expand Down
15 changes: 13 additions & 2 deletions lib/auth/apiserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -824,7 +824,13 @@ func (s *APIServer) searchEvents(auth ClientI, w http.ResponseWriter, r *http.Re
}

eventTypes := query[events.EventType]
eventsList, _, err := auth.SearchEvents(from, to, apidefaults.Namespace, eventTypes, limit, types.EventOrderDescending, "")
eventsList, _, err := auth.SearchEvents(r.Context(), events.SearchEventsRequest{
From: from,
To: to,
EventTypes: eventTypes,
Limit: limit,
Order: types.EventOrderDescending,
})
if err != nil {
return nil, trace.Wrap(err)
}
Expand Down Expand Up @@ -864,7 +870,12 @@ func (s *APIServer) searchSessionEvents(auth ClientI, w http.ResponseWriter, r *
}
}
// only pull back start and end events to build list of completed sessions
eventsList, _, err := auth.SearchSessionEvents(from, to, limit, types.EventOrderDescending, "", nil, "")
eventsList, _, err := auth.SearchSessionEvents(r.Context(), events.SearchSessionEventsRequest{
From: from,
To: to,
Limit: limit,
Order: types.EventOrderDescending,
})
if err != nil {
return nil, trace.Wrap(err)
}
Expand Down
31 changes: 18 additions & 13 deletions lib/auth/auth_with_roles.go
Original file line number Diff line number Diff line change
Expand Up @@ -3565,13 +3565,17 @@ func (a *ServerWithRoles) GetSessionEvents(namespace string, sid session.ID, aft
}

func (a *ServerWithRoles) findSessionEndEvent(namespace string, sid session.ID) (apievents.AuditEvent, error) {
sessionEvents, _, err := a.alog.SearchSessionEvents(time.Time{}, a.authServer.clock.Now().UTC(),
defaults.EventsIterationLimit, types.EventOrderAscending, "",
&types.WhereExpr{Equals: types.WhereExpr2{
sessionEvents, _, err := a.alog.SearchSessionEvents(context.TODO(), events.SearchSessionEventsRequest{
From: time.Time{},
To: a.authServer.clock.Now().UTC(),
Limit: defaults.EventsIterationLimit,
Order: types.EventOrderAscending,
Cond: &types.WhereExpr{Equals: types.WhereExpr2{
L: &types.WhereExpr{Field: events.SessionEventID},
R: &types.WhereExpr{Literal: sid.String()},
}}, sid.String(),
)
}},
SessionID: sid.String(),
})
if err != nil {
return nil, trace.Wrap(err)
}
Expand Down Expand Up @@ -4882,37 +4886,38 @@ func (a *ServerWithRoles) IsMFARequired(ctx context.Context, req *proto.IsMFAReq
}

// SearchEvents allows searching audit events with pagination support.
func (a *ServerWithRoles) SearchEvents(fromUTC, toUTC time.Time, namespace string, eventTypes []string, limit int, order types.EventOrder, startKey string) (events []apievents.AuditEvent, lastKey string, err error) {
func (a *ServerWithRoles) SearchEvents(ctx context.Context, req events.SearchEventsRequest) (outEvents []apievents.AuditEvent, lastKey string, err error) {
if err := a.action(apidefaults.Namespace, types.KindEvent, types.VerbList); err != nil {
return nil, "", trace.Wrap(err)
}

events, lastKey, err = a.alog.SearchEvents(fromUTC, toUTC, namespace, eventTypes, limit, order, startKey)
outEvents, lastKey, err = a.alog.SearchEvents(ctx, req)
if err != nil {
return nil, "", trace.Wrap(err)
}

return events, lastKey, nil
return outEvents, lastKey, nil
}

// SearchSessionEvents allows searching session audit events with pagination support.
func (a *ServerWithRoles) SearchSessionEvents(fromUTC, toUTC time.Time, limit int, order types.EventOrder, startKey string, cond *types.WhereExpr, sessionID string) (events []apievents.AuditEvent, lastKey string, err error) {
if cond != nil {
func (a *ServerWithRoles) SearchSessionEvents(ctx context.Context, req events.SearchSessionEventsRequest) (outEvents []apievents.AuditEvent, lastKey string, err error) {
if req.Cond != nil {
return nil, "", trace.BadParameter("cond is an internal parameter, should not be set by client")
}

cond, err = a.actionForListWithCondition(apidefaults.Namespace, types.KindSession, services.SessionIdentifier)
cond, err := a.actionForListWithCondition(apidefaults.Namespace, types.KindSession, services.SessionIdentifier)
if err != nil {
return nil, "", trace.Wrap(err)
}

// TODO(codingllama): Refactor cond out of SearchSessionEvents and simplify signature.
events, lastKey, err = a.alog.SearchSessionEvents(fromUTC, toUTC, limit, order, startKey, cond, sessionID)
req.Cond = cond
outEvents, lastKey, err = a.alog.SearchSessionEvents(ctx, req)
if err != nil {
return nil, "", trace.Wrap(err)
}

return events, lastKey, nil
return outEvents, lastKey, nil
}

// GetLock gets a lock by name.
Expand Down
58 changes: 29 additions & 29 deletions lib/auth/auth_with_roles_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1441,15 +1441,13 @@ func TestStreamSessionEvents_User(t *testing.T) {
// we need to wait for a short period to ensure the event is returned
time.Sleep(500 * time.Millisecond)

searchEvents, _, err := srv.AuthServer.AuditLog.SearchEvents(
srv.Clock().Now().Add(-time.Hour),
srv.Clock().Now().Add(time.Hour),
defaults.Namespace,
[]string{events.SessionRecordingAccessEvent},
1,
types.EventOrderDescending,
"",
)
searchEvents, _, err := srv.AuthServer.AuditLog.SearchEvents(ctx, events.SearchEventsRequest{
From: srv.Clock().Now().Add(-time.Hour),
To: srv.Clock().Now().Add(time.Hour),
EventTypes: []string{events.SessionRecordingAccessEvent},
Limit: 1,
Order: types.EventOrderDescending,
})
require.NoError(t, err)

event := searchEvents[0].(*apievents.SessionRecordingAccess)
Expand All @@ -1474,15 +1472,13 @@ func TestStreamSessionEvents_Builtin(t *testing.T) {
// we need to wait for a short period to ensure the event is returned
time.Sleep(500 * time.Millisecond)

searchEvents, _, err := srv.AuthServer.AuditLog.SearchEvents(
srv.Clock().Now().Add(-time.Hour),
srv.Clock().Now().Add(time.Hour),
defaults.Namespace,
[]string{events.SessionRecordingAccessEvent},
1,
types.EventOrderDescending,
"",
)
searchEvents, _, err := srv.AuthServer.AuditLog.SearchEvents(ctx, events.SearchEventsRequest{
From: srv.Clock().Now().Add(-time.Hour),
To: srv.Clock().Now().Add(time.Hour),
EventTypes: []string{events.SessionRecordingAccessEvent},
Limit: 1,
Order: types.EventOrderDescending,
})
require.NoError(t, err)

require.Equal(t, 0, len(searchEvents))
Expand All @@ -1507,16 +1503,14 @@ func TestGetSessionEvents(t *testing.T) {

// we need to wait for a short period to ensure the event is returned
time.Sleep(500 * time.Millisecond)

searchEvents, _, err := srv.AuthServer.AuditLog.SearchEvents(
srv.Clock().Now().Add(-time.Hour),
srv.Clock().Now().Add(time.Hour),
defaults.Namespace,
[]string{events.SessionRecordingAccessEvent},
1,
types.EventOrderDescending,
"",
)
ctx := context.Background()
searchEvents, _, err := srv.AuthServer.AuditLog.SearchEvents(ctx, events.SearchEventsRequest{
From: srv.Clock().Now().Add(-time.Hour),
To: srv.Clock().Now().Add(time.Hour),
EventTypes: []string{events.SessionRecordingAccessEvent},
Limit: 1,
Order: types.EventOrderDescending,
})
require.NoError(t, err)

event := searchEvents[0].(*apievents.SessionRecordingAccess)
Expand Down Expand Up @@ -2808,7 +2802,13 @@ func TestListResources_SearchAsRoles(t *testing.T) {
if len(tc.expectSearchEventRoles) > 0 {
require.Eventually(t, func() bool {
// make sure an audit event is logged for the search
auditEvents, _, err := srv.AuthServer.AuditLog.SearchEvents(time.Time{}, time.Now(), "", []string{events.AccessRequestResourceSearch}, 10, 0, "")
auditEvents, _, err := srv.AuthServer.AuditLog.SearchEvents(ctx, events.SearchEventsRequest{
From: time.Time{},
To: time.Now(),
EventTypes: []string{events.AccessRequestResourceSearch},
Limit: 10,
Order: types.EventOrderAscending,
})
require.NoError(t, err)
if len(auditEvents) == 0 {
t.Log("no search audit events found")
Expand Down
9 changes: 5 additions & 4 deletions lib/auth/clt.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (

"github.com/gravitational/teleport/api/client"
"github.com/gravitational/teleport/api/client/proto"
apidefaults "github.com/gravitational/teleport/api/defaults"
devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1"
loginrulepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/loginrule/v1"
pluginspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/plugins/v1"
Expand Down Expand Up @@ -289,8 +290,8 @@ func (c *Client) StreamSessionEvents(ctx context.Context, sessionID session.ID,
}

// SearchEvents allows searching for audit events with pagination support.
func (c *Client) SearchEvents(fromUTC, toUTC time.Time, namespace string, eventTypes []string, limit int, order types.EventOrder, startKey string) ([]apievents.AuditEvent, string, error) {
events, lastKey, err := c.APIClient.SearchEvents(context.TODO(), fromUTC, toUTC, namespace, eventTypes, limit, order, startKey)
func (c *Client) SearchEvents(ctx context.Context, req events.SearchEventsRequest) ([]apievents.AuditEvent, string, error) {
events, lastKey, err := c.APIClient.SearchEvents(ctx, req.From, req.To, apidefaults.Namespace, req.EventTypes, req.Limit, req.Order, req.StartKey)
if err != nil {
return nil, "", trace.Wrap(err)
}
Expand All @@ -299,8 +300,8 @@ func (c *Client) SearchEvents(fromUTC, toUTC time.Time, namespace string, eventT
}

// SearchSessionEvents returns session related events to find completed sessions.
func (c *Client) SearchSessionEvents(fromUTC, toUTC time.Time, limit int, order types.EventOrder, startKey string, cond *types.WhereExpr, sessionID string) ([]apievents.AuditEvent, string, error) {
events, lastKey, err := c.APIClient.SearchSessionEvents(context.TODO(), fromUTC, toUTC, limit, order, startKey)
func (c *Client) SearchSessionEvents(ctx context.Context, req events.SearchSessionEventsRequest) ([]apievents.AuditEvent, string, error) {
events, lastKey, err := c.APIClient.SearchSessionEvents(ctx, req.From, req.To, req.Limit, req.Order, req.StartKey)
if err != nil {
return nil, "", trace.Wrap(err)
}
Expand Down
17 changes: 15 additions & 2 deletions lib/auth/grpcserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -3429,7 +3429,14 @@ func (g *GRPCServer) GetEvents(ctx context.Context, req *proto.GetEventsRequest)
return nil, trace.Wrap(err)
}

rawEvents, lastkey, err := auth.ServerWithRoles.SearchEvents(req.StartDate, req.EndDate, req.Namespace, req.EventTypes, int(req.Limit), types.EventOrder(req.Order), req.StartKey)
rawEvents, lastkey, err := auth.ServerWithRoles.SearchEvents(ctx, events.SearchEventsRequest{
From: req.StartDate,
To: req.EndDate,
EventTypes: req.EventTypes,
Limit: int(req.Limit),
Order: types.EventOrder(req.Order),
StartKey: req.StartKey,
})
if err != nil {
return nil, trace.Wrap(err)
}
Expand Down Expand Up @@ -3458,7 +3465,13 @@ func (g *GRPCServer) GetSessionEvents(ctx context.Context, req *proto.GetSession
return nil, trace.Wrap(err)
}

rawEvents, lastkey, err := auth.ServerWithRoles.SearchSessionEvents(req.StartDate, req.EndDate, int(req.Limit), types.EventOrder(req.Order), req.StartKey, nil, "")
rawEvents, lastkey, err := auth.ServerWithRoles.SearchSessionEvents(ctx, events.SearchSessionEventsRequest{
From: req.StartDate,
To: req.EndDate,
Limit: int(req.Limit),
Order: types.EventOrder(req.Order),
StartKey: req.StartKey,
})
if err != nil {
return nil, trace.Wrap(err)
}
Expand Down
17 changes: 7 additions & 10 deletions lib/auth/join_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ import (
"golang.org/x/crypto/ssh"

"github.com/gravitational/teleport/api/client/proto"
apidefaults "github.com/gravitational/teleport/api/defaults"
"github.com/gravitational/teleport/api/types"
apievents "github.com/gravitational/teleport/api/types/events"
"github.com/gravitational/teleport/api/types/wrappers"
Expand Down Expand Up @@ -391,15 +390,13 @@ func TestRegister_Bot(t *testing.T) {
require.True(t, id.Renewable)

// Check audit event
evts, _, err := srv.Auth().SearchEvents(
start,
srv.Clock().Now(),
apidefaults.Namespace,
[]string{events.BotJoinEvent},
1,
types.EventOrderDescending,
"",
)
evts, _, err := srv.Auth().SearchEvents(ctx, events.SearchEventsRequest{
From: start,
To: srv.Clock().Now(),
EventTypes: []string{events.BotJoinEvent},
Limit: 1,
Order: types.EventOrderDescending,
})
require.NoError(t, err)
require.Len(t, evts, 1)
evt, ok := evts[0].(*apievents.BotJoin)
Expand Down
9 changes: 7 additions & 2 deletions lib/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -1987,8 +1987,13 @@ func GetPaginatedSessions(ctx context.Context, fromUTC, toUTC time.Time, pageSiz
if remaining := max - len(sessions); remaining < pageSize {
pageSize = remaining
}
nextEvents, eventKey, err := authClient.SearchSessionEvents(fromUTC, toUTC,
pageSize, order, prevEventKey, nil /* where condition */, "" /* session ID */)
nextEvents, eventKey, err := authClient.SearchSessionEvents(ctx, events.SearchSessionEventsRequest{
From: fromUTC,
To: toUTC,
Limit: pageSize,
Order: order,
StartKey: prevEventKey,
})
if err != nil {
return nil, trace.Wrap(err)
}
Expand Down
Loading