Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Define cloud billing event types and codes #6037

Merged
merged 4 commits into from
Mar 24, 2021
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
1,608 changes: 1,269 additions & 339 deletions api/types/events/events.pb.go

Large diffs are not rendered by default.

33 changes: 33 additions & 0 deletions api/types/events/events.proto
Original file line number Diff line number Diff line change
Expand Up @@ -1217,6 +1217,36 @@ message MFADeviceDelete {
[ (gogoproto.nullable) = false, (gogoproto.embed) = true, (gogoproto.jsontag) = "" ];
}

// BillingInformationUpdate is emitted when a user updates the billing information.
message BillingInformationUpdate {
// Metadata is a common event metadata.
Metadata Metadata = 1
[ (gogoproto.nullable) = false, (gogoproto.embed) = true, (gogoproto.jsontag) = "" ];
// User is a common user event metadata.
UserMetadata User = 2
[ (gogoproto.nullable) = false, (gogoproto.embed) = true, (gogoproto.jsontag) = "" ];
}

// BillingCardCreate is emitted when a user creates or updates a credit card.
message BillingCardCreate {
// Metadata is a common event metadata.
Metadata Metadata = 1
[ (gogoproto.nullable) = false, (gogoproto.embed) = true, (gogoproto.jsontag) = "" ];
// User is a common user event metadata.
UserMetadata User = 2
[ (gogoproto.nullable) = false, (gogoproto.embed) = true, (gogoproto.jsontag) = "" ];
}

// BillingCardDelete is emitted when a user deletes a credit card.
message BillingCardDelete {
// Metadata is a common event metadata.
Metadata Metadata = 1
[ (gogoproto.nullable) = false, (gogoproto.embed) = true, (gogoproto.jsontag) = "" ];
// User is a common user event metadata.
UserMetadata User = 2
[ (gogoproto.nullable) = false, (gogoproto.embed) = true, (gogoproto.jsontag) = "" ];
}

// OneOf is a union of one of audit events submitted to the auth service
message OneOf {
// Event is one of the audit events
Expand Down Expand Up @@ -1266,6 +1296,9 @@ message OneOf {
events.SessionUpload SessionUpload = 43;
events.MFADeviceAdd MFADeviceAdd = 44;
events.MFADeviceDelete MFADeviceDelete = 45;
events.BillingInformationUpdate BillingInformationUpdate = 46;
events.BillingCardCreate BillingCardCreate = 47;
events.BillingCardDelete BillingCardDelete = 48;
}
}

Expand Down
14 changes: 7 additions & 7 deletions lib/auth/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -1124,7 +1124,7 @@ func (a *Server) GenerateToken(ctx context.Context, req GenerateTokenRequest) (s
return "", trace.Wrap(err)
}

user := clientUsername(ctx)
user := ClientUsername(ctx)
for _, role := range req.Roles {
if role == teleport.RoleTrustedCluster {
if err := a.emitter.EmitAuditEvent(ctx, &events.TrustedClusterTokenCreate{
Expand All @@ -1134,7 +1134,7 @@ func (a *Server) GenerateToken(ctx context.Context, req GenerateTokenRequest) (s
},
UserMetadata: events.UserMetadata{
User: user,
Impersonator: clientImpersonator(ctx),
Impersonator: ClientImpersonator(ctx),
},
}); err != nil {
log.WithError(err).Warn("Failed to emit trusted cluster token create event.")
Expand Down Expand Up @@ -1695,8 +1695,8 @@ func (a *Server) DeleteRole(ctx context.Context, name string) error {
Code: events.RoleDeletedCode,
},
UserMetadata: events.UserMetadata{
User: clientUsername(ctx),
Impersonator: clientImpersonator(ctx),
User: ClientUsername(ctx),
Impersonator: ClientImpersonator(ctx),
},
ResourceMetadata: events.ResourceMetadata{
Name: name,
Expand All @@ -1721,7 +1721,7 @@ func (a *Server) upsertRole(ctx context.Context, role services.Role) error {
Code: events.RoleCreatedCode,
},
UserMetadata: events.UserMetadata{
User: clientUsername(ctx),
User: ClientUsername(ctx),
},
ResourceMetadata: events.ResourceMetadata{
Name: role.GetName(),
Expand Down Expand Up @@ -1774,7 +1774,7 @@ func (a *Server) CreateAccessRequest(ctx context.Context, req services.AccessReq
},
UserMetadata: events.UserMetadata{
User: req.GetUser(),
Impersonator: clientImpersonator(ctx),
Impersonator: ClientImpersonator(ctx),
},
Roles: req.GetRoles(),
RequestID: req.GetName(),
Expand All @@ -1794,7 +1794,7 @@ func (a *Server) SetAccessRequestState(ctx context.Context, params services.Acce
Code: events.AccessRequestUpdateCode,
},
ResourceMetadata: events.ResourceMetadata{
UpdatedBy: clientUsername(ctx),
UpdatedBy: ClientUsername(ctx),
},
RequestID: params.RequestID,
RequestState: params.State.String(),
Expand Down
8 changes: 4 additions & 4 deletions lib/auth/github.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ func (a *Server) upsertGithubConnector(ctx context.Context, connector services.G
Code: events.GithubConnectorCreatedCode,
},
UserMetadata: events.UserMetadata{
User: clientUsername(ctx),
Impersonator: clientImpersonator(ctx),
User: ClientUsername(ctx),
Impersonator: ClientImpersonator(ctx),
},
ResourceMetadata: events.ResourceMetadata{
Name: connector.GetName(),
Expand All @@ -97,8 +97,8 @@ func (a *Server) deleteGithubConnector(ctx context.Context, connectorName string
Code: events.GithubConnectorDeletedCode,
},
UserMetadata: events.UserMetadata{
User: clientUsername(ctx),
Impersonator: clientImpersonator(ctx),
User: ClientUsername(ctx),
Impersonator: ClientImpersonator(ctx),
},
ResourceMetadata: events.ResourceMetadata{
Name: connectorName,
Expand Down
8 changes: 4 additions & 4 deletions lib/auth/oidc.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,8 @@ func (a *Server) UpsertOIDCConnector(ctx context.Context, connector services.OID
Code: events.OIDCConnectorCreatedCode,
},
UserMetadata: events.UserMetadata{
User: clientUsername(ctx),
Impersonator: clientImpersonator(ctx),
User: ClientUsername(ctx),
Impersonator: ClientImpersonator(ctx),
},
ResourceMetadata: events.ResourceMetadata{
Name: connector.GetName(),
Expand All @@ -179,8 +179,8 @@ func (a *Server) DeleteOIDCConnector(ctx context.Context, connectorName string)
Code: events.OIDCConnectorDeletedCode,
},
UserMetadata: events.UserMetadata{
User: clientUsername(ctx),
Impersonator: clientImpersonator(ctx),
User: ClientUsername(ctx),
Impersonator: ClientImpersonator(ctx),
},
ResourceMetadata: events.ResourceMetadata{
Name: connectorName,
Expand Down
8 changes: 4 additions & 4 deletions lib/auth/permissions.go
Original file line number Diff line number Diff line change
Expand Up @@ -622,10 +622,10 @@ const (
// WithDelegator alias for backwards compatibility
var WithDelegator = client.WithDelegator

// clientUsername returns the username of a remote HTTP client making the call.
// ClientUsername returns the username of a remote HTTP client making the call.
// If ctx didn't pass through auth middleware or did not come from an HTTP
// request, teleport.UserSystem is returned.
func clientUsername(ctx context.Context) string {
func ClientUsername(ctx context.Context) string {
userI := ctx.Value(ContextUser)
userWithIdentity, ok := userI.(IdentityGetter)
if !ok {
Expand All @@ -638,9 +638,9 @@ func clientUsername(ctx context.Context) string {
return identity.Username
}

// clientImpersonator returns the impersonator username of a remote client
// ClientImpersonator returns the impersonator username of a remote client
// making the call. If not present, returns an empty string
func clientImpersonator(ctx context.Context) string {
func ClientImpersonator(ctx context.Context) string {
userI := ctx.Value(ContextUser)
userWithIdentity, ok := userI.(IdentityGetter)
if !ok {
Expand Down
4 changes: 2 additions & 2 deletions lib/auth/resetpasswordtoken.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,8 @@ func (s *Server) CreateResetPasswordToken(ctx context.Context, req CreateResetPa
Code: events.ResetPasswordTokenCreateCode,
},
UserMetadata: events.UserMetadata{
User: clientUsername(ctx),
Impersonator: clientImpersonator(ctx),
User: ClientUsername(ctx),
Impersonator: ClientImpersonator(ctx),
},
ResourceMetadata: events.ResourceMetadata{
Name: req.Name,
Expand Down
8 changes: 4 additions & 4 deletions lib/auth/saml.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ func (a *Server) UpsertSAMLConnector(ctx context.Context, connector services.SAM
Code: events.SAMLConnectorCreatedCode,
},
UserMetadata: events.UserMetadata{
User: clientUsername(ctx),
Impersonator: clientImpersonator(ctx),
User: ClientUsername(ctx),
Impersonator: ClientImpersonator(ctx),
},
ResourceMetadata: events.ResourceMetadata{
Name: connector.GetName(),
Expand All @@ -70,8 +70,8 @@ func (a *Server) DeleteSAMLConnector(ctx context.Context, connectorName string)
Code: events.SAMLConnectorDeletedCode,
},
UserMetadata: events.UserMetadata{
User: clientUsername(ctx),
Impersonator: clientImpersonator(ctx),
User: ClientUsername(ctx),
Impersonator: ClientImpersonator(ctx),
},
ResourceMetadata: events.ResourceMetadata{
Name: connectorName,
Expand Down
8 changes: 4 additions & 4 deletions lib/auth/trustedcluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,8 @@ func (a *Server) UpsertTrustedCluster(ctx context.Context, trustedCluster servic
Code: events.TrustedClusterCreateCode,
},
UserMetadata: events.UserMetadata{
User: clientUsername(ctx),
Impersonator: clientImpersonator(ctx),
User: ClientUsername(ctx),
Impersonator: ClientImpersonator(ctx),
},
ResourceMetadata: events.ResourceMetadata{
Name: trustedCluster.GetName(),
Expand Down Expand Up @@ -221,8 +221,8 @@ func (a *Server) DeleteTrustedCluster(ctx context.Context, name string) error {
Code: events.TrustedClusterDeleteCode,
},
UserMetadata: events.UserMetadata{
User: clientUsername(ctx),
Impersonator: clientImpersonator(ctx),
User: ClientUsername(ctx),
Impersonator: ClientImpersonator(ctx),
},
ResourceMetadata: events.ResourceMetadata{
Name: name,
Expand Down
12 changes: 6 additions & 6 deletions lib/auth/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import (
func (s *Server) CreateUser(ctx context.Context, user services.User) error {
if user.GetCreatedBy().IsEmpty() {
user.SetCreatedBy(services.CreatedBy{
User: services.UserRef{Name: clientUsername(ctx)},
User: services.UserRef{Name: ClientUsername(ctx)},
Time: s.GetClock().Now().UTC(),
})
}
Expand All @@ -63,7 +63,7 @@ func (s *Server) CreateUser(ctx context.Context, user services.User) error {
},
UserMetadata: events.UserMetadata{
User: user.GetCreatedBy().User.Name,
Impersonator: clientImpersonator(ctx),
Impersonator: ClientImpersonator(ctx),
},
ResourceMetadata: events.ResourceMetadata{
Name: user.GetName(),
Expand Down Expand Up @@ -97,8 +97,8 @@ func (s *Server) UpdateUser(ctx context.Context, user services.User) error {
Code: events.UserUpdateCode,
},
UserMetadata: events.UserMetadata{
User: clientUsername(ctx),
Impersonator: clientImpersonator(ctx),
User: ClientUsername(ctx),
Impersonator: ClientImpersonator(ctx),
},
ResourceMetadata: events.ResourceMetadata{
Name: user.GetName(),
Expand Down Expand Up @@ -175,8 +175,8 @@ func (s *Server) DeleteUser(ctx context.Context, user string) error {
Code: events.UserDeleteCode,
},
UserMetadata: events.UserMetadata{
User: clientUsername(ctx),
Impersonator: clientImpersonator(ctx),
User: ClientUsername(ctx),
Impersonator: ClientImpersonator(ctx),
},
ResourceMetadata: events.ResourceMetadata{
Name: user,
Expand Down
9 changes: 9 additions & 0 deletions lib/events/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,15 @@ const (
// AccessRequestID is the ID of an access request.
AccessRequestID = "id"

// BillingCardCreateEvent is emitted when a user creates a new credit card.
BillingCardCreateEvent = "billing.create_card"
// BillingCardDeleteEvent is emitted when a user deletes a credit card.
BillingCardDeleteEvent = "billing.delete_card"
// BillingCardUpdateEvent is emitted when a user updates an existing credit card.
BillingCardUpdateEvent = "billing.update_card"
// BillingInformationUpdateEvent is emitted when a user updates their billing information.
BillingInformationUpdateEvent = "billing.update_info"

// UpdatedBy indicates the user who modified some resource:
// - updating a request state
// - updating a user record
Expand Down
9 changes: 9 additions & 0 deletions lib/events/codes.go
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,15 @@ const (
// MFADeviceDeleteEventCode is an event code for users deleting MFA devices.
MFADeviceDeleteEventCode = "T1007I"

// BillingCardCreateCode is an event code for when a user creates a new credit card.
BillingCardCreateCode = "TBL00I"
// BillingCardDeleteCode is an event code for when a user deletes a credit card.
BillingCardDeleteCode = "TBL01I"
// BillingCardUpdateCode is an event code for when a user updates an existing credit card.
BillingCardUpdateCode = "TBL02I"
// BillingInformationUpdateCode is an event code for when a user updates their billing info.
BillingInformationUpdateCode = "TBL03I"

// SessionRejectedCode is an event code for when a user's attempt to create an
// session/connection has been rejected.
SessionRejectedCode = "T1006W"
Expand Down
3 changes: 3 additions & 0 deletions lib/events/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,9 @@ type (
AppSessionStart = events.AppSessionStart
AppSessionChunk = events.AppSessionChunk
AppSessionRequest = events.AppSessionRequest
BillingInformationUpdate = events.BillingInformationUpdate
BillingCardCreate = events.BillingCardCreate
BillingCardDelete = events.BillingCardDelete
OneOf = events.OneOf
OneOf_UserLogin = events.OneOf_UserLogin //nolint
OneOf_UserCreate = events.OneOf_UserCreate //nolint
Expand Down