Skip to content

SecurityEvent type catalog

SecurityEvent is the headline event type emitted by every operator in ugallu. The platform freezes a closed catalog of 92 types under security.ugallu.io/v1alpha1 - a ValidatingAdmissionPolicy enforces that spec.type matches one of the entries below, so an emitter that ships with a typo is rejected at the API server before any attestor or forensics consumer ever sees it.

apiVersion: security.ugallu.io/v1alpha1
kind: SecurityEvent
spec:
type: ClusterAdminGranted # one of the 92 types below
class: Detection # Detection|Audit|Forensic|Compliance|Anomaly|PolicyViolation
severity: critical # info|low|medium|high|critical
source:
operator: ugallu-audit-detection
cluster: prod-eu-1
subject:
kind: User # User|Pod|Node|Secret|ClusterRoleBinding|...|External
name: alice
uid: 1f...
description: "user alice bound to cluster-admin"
evidence: { auditID: "abcd-...", requestObject: { ... } }
status:
phase: Pending # Pending|Attested|Sealed
attestationBundleRef: { name: ... }
ClassWhen it firesWhere it lands
DetectionA rule or detector matched a hostile or risky pattern.Default whitelist for forensics.spec.trigger.classes.
AuditA non-malicious but auditable API operation.Captured for retention; rarely triggers response.
ForensicLifecycle event of an incident capture pipeline.Emitted by forensics itself - capture started, completed, failed.
ComplianceA scheduled or ad-hoc compliance check completed (kube-bench, backup-verify, attestation).Drives compliance dashboards; ranks via worstSeverity.
AnomalyA platform self-health signal: source went silent, queue grew, key rotation overdue.On-call / SRE dashboards. Not for application incident response.
PolicyViolationA workload deviated from its declared policy (e.g. seccomp drift).Drives gitops-responder or human review.

The class is what ranks an event on the dashboards, not the severity. A Detection critical and a Compliance critical are treated very differently downstream.

The table is grouped by emitter, then sorted by typical severity. The “Severity” column is the value at the emit site - rules and policy can override (e.g. SigmaRule lets the user pick severity per match).

The audit-detection operator turns the apiserver audit log into SecurityEvents through a Sigma rule engine plus a built-in policy allowlist.

TypeClassSeverityTrigger
AnonymousAccessDetectioncriticalunauthenticated user reached the apiserver
ClusterAdminGrantedDetectioncriticalwildcard ClusterRoleBinding to cluster-admin
CRDOverwriteDetectioncriticala CustomResourceDefinition was created or modified
FailOpenWebhookDetectioncriticalwebhook configured failurePolicy: Ignore on a critical resource
APIServiceInsecureDetectionhighAPIService entry without TLS or with invalid CA
CapAddDangerousDetectionhighcontainer adds CAP_SYS_ADMIN / CAP_NET_ADMIN / CAP_NET_RAW / CAP_SYS_PTRACE
ExecIntoPodDetectionhighkubectl exec against a pod
HostIPCPodDetectionhighpod with hostIPC: true
HostNetworkPodDetectionhighpod with hostNetwork: true
HostPathMountDetectionhighpod mounts a hostPath volume
HostPIDPodDetectionhighpod with hostPID: true
ImpersonationUsedDetectionhighrequest used Impersonate-User header
NamespacePSAWeakenedDetectionhigha namespace’s pod-security-admission label downgraded
PortForwardOpenedDetectionhighkubectl port-forward to a pod
PrivilegeEscalationAttemptDetectionhighcontainer allowPrivilegeEscalation: true
PrivilegedPodChangeDetectionhighpod spec mutated to add privileged: true
ServiceAccountTokenRequestDetectionhighTokenRequest API used (often automation)
UnsignedImageDetectionhighcontainer image not signed or signature failed verification
WebhookSideEffectsUnknownDetectionhighwebhook with sideEffects: Unknown
WildcardRBACBindingDetectionhighRBAC rule with * in resources or verbs
ImagePullPolicyAlwaysDetectionmediumcontainer with imagePullPolicy: Always (registry exposure)
LatestImageTagDetectionmediumcontainer image pinned to :latest or untagged
LongLivedSecretTokenDetectionmediumservice account token with extended TTL
RunAsRootContainerDetectionmediumcontainer runAsUser: 0 or unset
SecretMountedAsEnvDetectionmediumsecret data projected into env vars
ServiceAccountTokenAutomountDetectionmediumpod automounts the default SA token
KubernetesAPICallAuditinforaw audit log entry (test of the pipeline)
ProxyAccessAuditinforequest via kubectl proxy
WatchSubscriptionAuditinfoa long-lived watch subscription opened
TypeClassSeverityTrigger
WebhookConfigDeletedDetectioncriticala webhook configuration was deleted (loss of guardrails)
WebhookFailOpenCriticalAPIDetectioncriticalwebhook on a critical API fails open
MutatingWebhookHighRiskDetectionhighrisk score crossed WebhookAuditorConfig.spec.thresholds.alertOn
ValidatingWebhookHighRiskDetectionhighsame, for validating webhooks
WebhookCAUntrustedDetectionhighcaBundle issuer not in trustedCASources
WebhookSecretAccessDetectionhighwebhook references a Secret outside its namespace
WebhookEvalFailedAnomalymediumthe auditor itself failed to evaluate a webhook
TypeClassSeverityTrigger
DNSAnomalousPortDetectionhighDNS query to non-53/853 port
DNSExfiltrationDetectionhighhigh-entropy / long-label query indicating data exfil
DNSTunnelingDetectionhighbase64 / hex pattern in subdomain labels
DNSToBlocklistedFQDNDetectionmediumquery matched a per-namespace blocklist ConfigMap
DNSToYoungDomainDetectionmediumRDAP shows the domain was registered fewer than N days ago
DNSConfigMissingAnomalyhighDNSDetectConfig singleton not found at boot
DNSDetectorDegradedAnomalymediuma per-detector failure is sustained
DNSSourceSilentAnomalymediumno events received from CoreDNS plugin or Tetragon for >1m
TypeClassSeverityTrigger
CrossTenantExecDetectioncriticalexec into a pod whose namespace belongs to a different tenant than the caller
CrossTenantHostPathOverlapDetectioncriticalpod create with hostPath overlapping another tenant’s mount
CrossTenantNetworkPolicyDetectioncriticalNetworkPolicy / CiliumNetworkPolicy crosses a tenant boundary
CrossTenantSecretAccessDetectioncriticalget/list on a Secret outside the caller’s tenant
TenantBoundaryOverlapAnomalycriticaltwo TenantBoundary CRs claim the same namespace
TenantBoundaryEmptyAnomalyhighthe index has zero boundaries (cluster has no tenancy model)
TenantEscapeSourceLaggedAnomalymediumaudit-bus consumer lag exceeded the warning threshold
TypeClassSeverityTrigger
HoneypotTriggeredDetectioncriticalsomething accessed a decoy Secret or SA
HoneypotMisplacedDetectionhigha decoy was found outside its declared namespace
HoneypotConfigInvalidAnomalyhighthe HoneypotConfig failed validation
HoneypotDecoyMissingAnomalyhighthe deployer’s index expected a decoy that the apiserver doesn’t return
TypeClassSeverityTrigger
IncidentCaptureCompletedForensichighthe IR pipeline finished all 3 steps; evidence sealed
IncidentCaptureFailedForensichigha step failed permanently; sandbox + freeze rolled back
IncidentCaptureStartedForensicinfothe trigger predicate matched and the capture began
EvidencePreservedForensicinfoEvidenceUploadStep wrote a content-addressed manifest
PodFrozenForensicinfoPodFreezeStep applied the deny-all NetworkPolicy
PodUnfrozenForensicinfothe suspect pod was unfrozen (manual ack or auto-unfreeze)
TypeClassSeverityTrigger
SeccompTrainingFailedPolicyViolationhighthe engine couldn’t subscribe to the bridge or the training window expired with no syscalls observed
SeccompTrainingCompletedPolicyViolationinfotraining window closed; SeccompTrainingProfile produced
SeccompTrainingStartedPolicyViolationinfoengine attached to the target pod’s syscalls
TypeClassSeverityTrigger
BackupVerifyMismatchDetectioncriticalchecksum diff or full-restore diff exceeded the policy threshold
BackupVerifyFailedCompliancehighthe run itself failed to execute (Velero unreachable, snapshot file missing)
BackupVerifyCompletedComplianceinforun completed clean - findings either empty or all below alertOn
BackupVerifyStartedComplianceinforun picked up by the controller
TypeClassSeverityTrigger
ComplianceScanFailedCompliancehighbackend (kube-bench Job, Falco, CEL) failed to produce a result
ComplianceScanCompletedComplianceinfoscan completed; findings ranked by worstSeverity
ComplianceScanStartedComplianceinforun picked up
TypeClassSeverityTrigger
AttestationFailedCompliancecriticalquote mismatch, device error, or nonce replay
AttestationStartedComplianceinfoDaemonSet pod began producing the quote
AttestationVerifiedComplianceinfoquote matched the policy on PCRs / IDBlock / MRTD

These are emitted by the SDK runtime singletons (attestor, ttl, backpressure, the emitter) and by individual operators when they detect their own degraded paths or a cluster-wide condition. They drive on-call dashboards rather than incident response.

TypeClassSeverityTrigger
IncidentBurstAnomalycriticalincident rate / minute crossed the alert floor (often a real attack)
KeyRotationEmergencyAnomalycriticalthe configured signing key is past its rotation deadline
RBACEscalationChainAnomalycriticala chain of RBAC grants ending in cluster-admin was observed
WORMIntegrityViolationAnomalycriticalthe WORM bucket reported a checksum mismatch on read-back
AttestorUnavailableAnomalyhighattestor health check failed
AuditLogStreamSilentAnomalyhighaudit-detection received zero events for a configurable window
BehaviorBaselineDeviationAnomalyhigha learned baseline (workload, namespace) is exceeded
ClockSkewDetectedAnomalyhighNTP skew on a node exceeded 250ms (attestor / Rekor timestamp risk)
EtcdBackpressureHighAnomalyhighthe apiserver returned 429 on SE writes
GitOpsConflictAnomalyhighthe gitops-responder hit an unresolved merge conflict
ImageRevocationAnomalyhigha pulled image’s signature is no longer valid (post-pull revocation)
LateralMovementSuspectedAnomalyhighreasoner-style correlation: the same identity touched several tenants in a short window
TetragonDataInconsistentAnomalyhighTetragon FineGuidance event fields didn’t match the bridge schema
TTLConfigMissingAnomalyhighTTL controller can’t find its config in a watched namespace
WORMQuotaExceededAnomalyhighbucket usage crossed WORMConfig.spec.quotas.softQuotaPercent
AuditBridgeSilentAnomalymediumtenant-escape’s audit-bus subscription went silent
SourceRateLimitedAnomalymediumemitter SDK shed events to keep the apiserver responsive
AttestorRecoveredAnomalyinfoattestor returned to healthy after a window of failures

The catalog is closed by design. To add a type:

  1. Append the constant to sdk/pkg/api/v1alpha1/types.go and to the KnownTypes map in types_catalog.go.
  2. Update the type-catalog ValidatingAdmissionPolicy enum so the apiserver lets the new spec.type value through.
  3. Run hack/ci-local.sh - the type-catalog parity check fails if the constant, the map, and the policy diverge.

The closed catalog is what lets every downstream consumer (dashboards, attestor’s class-to-severity matrix, the gitops router) treat spec.type as a typed enum.