mirror of
https://github.com/gravitational/teleport.git
synced 2026-10-16 07:44:31 +08:00
* Refactor most uses of `UserMetadata` into a handful of functions * Add access requests to `UserMetadata` * Explanation for the reserved field in SessionStart
144 lines
4.3 KiB
Go
144 lines
4.3 KiB
Go
/*
|
|
Copyright 2021 Gravitational, Inc.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package auth
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/gravitational/trace"
|
|
|
|
"github.com/gravitational/teleport/api/types"
|
|
apievents "github.com/gravitational/teleport/api/types/events"
|
|
"github.com/gravitational/teleport/lib/events"
|
|
)
|
|
|
|
// UpsertRole creates or updates a role and emits a related audit event.
|
|
func (a *Server) UpsertRole(ctx context.Context, role types.Role) error {
|
|
if err := a.Access.UpsertRole(ctx, role); err != nil {
|
|
return trace.Wrap(err)
|
|
}
|
|
|
|
if err := a.emitter.EmitAuditEvent(a.closeCtx, &apievents.RoleCreate{
|
|
Metadata: apievents.Metadata{
|
|
Type: events.RoleCreatedEvent,
|
|
Code: events.RoleCreatedCode,
|
|
},
|
|
UserMetadata: ClientUserMetadata(ctx),
|
|
ResourceMetadata: apievents.ResourceMetadata{
|
|
Name: role.GetName(),
|
|
},
|
|
}); err != nil {
|
|
log.WithError(err).Warnf("Failed to emit role create event.")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DeleteRole deletes a role and emits a related audit event.
|
|
func (a *Server) DeleteRole(ctx context.Context, name string) error {
|
|
// check if this role is used by CA or Users
|
|
users, err := a.Identity.GetUsers(false)
|
|
if err != nil {
|
|
return trace.Wrap(err)
|
|
}
|
|
for _, u := range users {
|
|
for _, r := range u.GetRoles() {
|
|
if r == name {
|
|
// Mask the actual error here as it could be used to enumerate users
|
|
// within the system.
|
|
log.Warnf("Failed to delete role: role %v is used by user %v.", name, u.GetName())
|
|
return trace.BadParameter("failed to delete role that still in use by a user. Check system server logs for more details.")
|
|
}
|
|
}
|
|
}
|
|
// check if it's used by some external cert authorities, e.g.
|
|
// cert authorities related to external cluster
|
|
cas, err := a.Trust.GetCertAuthorities(types.UserCA, false)
|
|
if err != nil {
|
|
return trace.Wrap(err)
|
|
}
|
|
for _, a := range cas {
|
|
for _, r := range a.GetRoles() {
|
|
if r == name {
|
|
// Mask the actual error here as it could be used to enumerate users
|
|
// within the system.
|
|
log.Warnf("Failed to delete role: role %v is used by user cert authority %v", name, a.GetClusterName())
|
|
return trace.BadParameter("failed to delete role that still in use by a user. Check system server logs for more details.")
|
|
}
|
|
}
|
|
}
|
|
|
|
if err := a.Access.DeleteRole(ctx, name); err != nil {
|
|
return trace.Wrap(err)
|
|
}
|
|
|
|
if err := a.emitter.EmitAuditEvent(a.closeCtx, &apievents.RoleDelete{
|
|
Metadata: apievents.Metadata{
|
|
Type: events.RoleDeletedEvent,
|
|
Code: events.RoleDeletedCode,
|
|
},
|
|
UserMetadata: ClientUserMetadata(ctx),
|
|
ResourceMetadata: apievents.ResourceMetadata{
|
|
Name: name,
|
|
},
|
|
}); err != nil {
|
|
log.WithError(err).Warnf("Failed to emit role delete event.")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// UpsertLock upserts a lock and emits a related audit event.
|
|
func (a *Server) UpsertLock(ctx context.Context, lock types.Lock) error {
|
|
if err := a.Access.UpsertLock(ctx, lock); err != nil {
|
|
return trace.Wrap(err)
|
|
}
|
|
|
|
if err := a.emitter.EmitAuditEvent(a.closeCtx, &apievents.LockCreate{
|
|
Metadata: apievents.Metadata{
|
|
Type: events.LockCreatedEvent,
|
|
Code: events.LockCreatedCode,
|
|
},
|
|
UserMetadata: ClientUserMetadata(ctx),
|
|
ResourceMetadata: apievents.ResourceMetadata{
|
|
Name: lock.GetName(),
|
|
},
|
|
}); err != nil {
|
|
log.WithError(err).Warning("Failed to emit lock create event.")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DeleteLock deletes a lock and emits a related audit event.
|
|
func (a *Server) DeleteLock(ctx context.Context, lockName string) error {
|
|
if err := a.Access.DeleteLock(ctx, lockName); err != nil {
|
|
return trace.Wrap(err)
|
|
}
|
|
|
|
if err := a.emitter.EmitAuditEvent(a.closeCtx, &apievents.LockDelete{
|
|
Metadata: apievents.Metadata{
|
|
Type: events.LockDeletedEvent,
|
|
Code: events.LockDeletedCode,
|
|
},
|
|
UserMetadata: ClientUserMetadata(ctx),
|
|
ResourceMetadata: apievents.ResourceMetadata{
|
|
Name: lockName,
|
|
},
|
|
}); err != nil {
|
|
log.WithError(err).Warning("Failed to emit lock delete event.")
|
|
}
|
|
return nil
|
|
}
|