Implement OWASP/NIST-Aligned Audit Trail for SEMOSS
Summary
Implement a centralized audit trail for SEMOSS and Monolith that records security-sensitive and administrative actions in UserTrackingDatabase, following OWASP Logging Cheat Sheet and NIST SP 800-92 guidance.
References:
Goals
- Create a centralized audit event table for user, permission, project, workspace, and engine lifecycle activity.
- Ensure audit logging is best-effort and does not break the main user flow.
- Allow admins to query audit events.
- Capture enough context to answer:
- Who performed the action?
- What action was performed?
- What resource was affected?
- When did it happen?
- Was it successful or failed?
- What changed?
- Which user or group was affected, when applicable?
- Which request/session caused it, when available?
- Align the audit trail design with OWASP and NIST logging guidance.
Scope
Implement the audit trail as one complete backend feature across:
Frontend audit viewing can be handled separately unless required for admin validation.
Proposed Audit Table
Create/extend USER_AUDIT_EVENTS in UserTrackingDatabase.
Required columns:
EVENT_ID
EVENT_TIME
EVENT_OCCURRED_TIME
EVENT_TYPE
ACTION
STATUS
SEVERITY
CATEGORY
ACTOR_USER_ID
ACTOR_USER_TYPE
ACTOR_USER_NAME
ACTOR_IS_ADMIN
SUBJECT_USER_ID
SUBJECT_USER_TYPE
SUBJECT_USER_NAME
SESSION_ID_HASH
REQUEST_ID
IP_ADDR
USER_AGENT
HTTP_METHOD
REQUEST_PATH
HTTP_STATUS
TARGET_TYPE
TARGET_ID
TARGET_NAME
PROJECT_ID
ENGINE_ID
INSIGHT_ID
ROOM_ID
OLD_VALUE
NEW_VALUE
DETAILS
ERROR_CODE
ERROR_MESSAGE
SOURCE_APP
SOURCE_MODULE
SOURCE_CLASS
HASH_PREVIOUS
HASH_CURRENT
Column Definitions
| Column |
Purpose |
EVENT_ID |
Unique audit event id |
EVENT_TIME |
Time audit row was written |
EVENT_OCCURRED_TIME |
Time the business event occurred, if different |
EVENT_TYPE |
High-level event name, e.g. LOGIN, PERMISSION_UPDATE |
ACTION |
Specific action performed |
STATUS |
SUCCESS, FAILURE, DENIED, ERROR |
SEVERITY |
LOW, MEDIUM, HIGH, CRITICAL |
CATEGORY |
AUTH, AUTHZ, USER_ADMIN, PROJECT, WORKSPACE, ENGINE, AUDIT, etc. |
ACTOR_* |
User who performed the action |
SUBJECT_USER_* |
User affected by the action, e.g. permission grantee or created user |
SESSION_ID_HASH |
Hashed session id, not raw session id |
REQUEST_ID |
Request correlation id |
IP_ADDR |
Client IP address |
USER_AGENT |
Client user agent |
HTTP_METHOD |
Request method |
REQUEST_PATH |
Request path |
HTTP_STATUS |
Response status when available |
TARGET_* |
Resource affected by the event |
PROJECT_ID |
Project context |
ENGINE_ID |
Engine context |
INSIGHT_ID |
Insight context |
ROOM_ID |
Workspace/room context |
OLD_VALUE |
Sanitized JSON before-value |
NEW_VALUE |
Sanitized JSON after-value |
DETAILS |
Sanitized event-specific JSON |
ERROR_CODE |
Stable error code, if failed |
ERROR_MESSAGE |
Sanitized error summary |
SOURCE_* |
Application/module/class that emitted the audit event |
HASH_PREVIOUS / HASH_CURRENT |
Optional tamper-evidence chain |
Event Types To Implement
Authentication
LOGIN
LOGOUT
LOGIN_FAILED
Authorization / Permissions
AUTHORIZATION_DENIED
PERMISSION_ADD
PERMISSION_UPDATE
PERMISSION_DELETE
ACCESS_REQUEST_APPROVE
ACCESS_REQUEST_REJECT
Covered resources:
- Project permissions
- Engine permissions
- Insight permissions
- Group project permissions
- Group engine permissions
- Group insight permissions
User Administration
USER_CREATE
USER_UPDATE
USER_DELETE
USER_ACTIVATE
USER_DEACTIVATE
USER_ROLE_UPDATE
USER_PASSWORD_RESET
Must include actions from the admin member dashboard.
Group Administration
GROUP_CREATE
GROUP_UPDATE
GROUP_DELETE
GROUP_MEMBER_ADD
GROUP_MEMBER_REMOVE
Project Lifecycle
PROJECT_CREATE
PROJECT_UPLOAD
PROJECT_UPDATE
PROJECT_DELETE
Workspace Lifecycle
WORKSPACE_CREATE
WORKSPACE_UPDATE
WORKSPACE_DELETE
Engine Lifecycle
ENGINE_CREATE
ENGINE_UPDATE
ENGINE_DELETE
MODEL_CREATE
VECTOR_CREATE
STORAGE_CREATE
FUNCTION_CREATE
GUARDRAIL_CREATE
Metadata / Visibility Updates
- Engine display name update
- Engine canonical name update
- Engine global flag update
- Engine discoverable flag update
- Engine visibility update
- Engine metadata update
- Database metadata update
These can be recorded as:
EVENT_TYPE = ENGINE_UPDATE
CATEGORY = ENGINE
DETAILS.field = displayName | name | global | discoverable | visibility | metadata
Audit Access
Implementation Requirements
Backend Table Creation
- Add
USER_AUDIT_EVENTS to UserTrackingDatabase.
- Ensure schema creation works when
USER_TRACKING_ENABLED=true.
- Ensure system does not crash when
USER_TRACKING_ENABLED=false.
Audit Utility
Create or update a central audit utility that supports:
- Success audit events
- Failure audit events
- Actor extraction
- Subject user extraction
- Target resource context
- Request context
- Old/new value JSON
- Details JSON
- Error code/message
- Sanitization/redaction
- Session id hashing
- Best-effort insert behavior
Audit insert failures must be logged to application logs but must not break the primary business action.
Request Context
Add request context collection where available:
- request id
- client IP
- user agent
- HTTP method
- request path
- HTTP status
For non-request background cleanup events, missing request fields are acceptable.
Sanitization / Redaction
Audit logging must not store:
- passwords
- access tokens
- refresh tokens
- API keys
- secrets
- full connection strings
- raw private keys
- sensitive model prompts/responses
- sensitive SQL result data
- sensitive file contents
Sensitive keys in JSON should be redacted before insert.
Example:
{
"apiKey": "[REDACTED]",
"password": "[REDACTED]"
}
Permission Event Semantics
For permission changes:
TARGET_* must represent the resource being permissioned.
SUBJECT_USER_* must represent the affected user/grantee when applicable.
- Group permission changes should include group id/type in
DETAILS or equivalent subject fields if group subject columns are added.
OLD_VALUE should contain previous permission where available.
NEW_VALUE should contain new permission where available.
- Updates must produce one
PERMISSION_UPDATE row only.
- Internal implementation cleanup must not produce false
PERMISSION_DELETE rows.
Project / Engine Event Semantics
For lifecycle events:
TARGET_ID must be the stable project/engine id.
TARGET_NAME should be populated when available.
PROJECT_ID or ENGINE_ID should be populated for joins.
DETAILS should include useful non-sensitive metadata such as type, global flag, mode, resource counts, or metadata keys.
Failure Logging
Log failure events for sensitive flows, including:
- failed login
- authorization denied
- invalid permission changes
- failed create/upload/delete
- metadata validation failure
- access request failure
Failure events should include:
STATUS = FAILURE | DENIED | ERROR
ERROR_CODE
ERROR_MESSAGE
ERROR_MESSAGE must be sanitized and should not expose secrets or internal stack traces.
Admin Query Reactor
Implement an admin-only reactor to query audit events.
Requirements:
- Only admins can query audit events.
- If user tracking is disabled, return a clear error.
- If user tracking DB is not loaded, return a clear error.
- Support filtering by:
- event type
- category
- status
- actor user id
- subject user id
- target type
- target id
- project id
- engine id
- insight id
- date range
- Support sorting by event time.
- Support limit/page size.
Operational Requirements
Based on OWASP and NIST guidance:
- Define audit retention configuration.
- Define who can view audit logs.
- Define whether audit export is allowed and track it as
AUDIT_EXPORT.
- Ensure audit logs are protected from unauthorized modification.
- Consider append-only behavior or tamper-evidence using
HASH_PREVIOUS and HASH_CURRENT.
- Add monitoring/alert rules for high-risk events:
- repeated failed login
- repeated authorization denied
- admin user created
- user role changed
- engine/project deleted
- audit export
- audit query spike
Acceptance Criteria
Schema
Config Behavior
Authentication
Permissions
User / Group Admin
Project / Workspace
Engine
Failure Events
Sanitization
Admin Query
Tests
Notes
This task should be implemented as a complete audit-trail feature, using OWASP and NIST guidance as references. Existing SEMOSS query/model/guardrail tracking mechanisms are outside the scope unless they are explicitly converted into sanitized audit summary events later.
Implement OWASP/NIST-Aligned Audit Trail for SEMOSS
Summary
Implement a centralized audit trail for SEMOSS and Monolith that records security-sensitive and administrative actions in
UserTrackingDatabase, following OWASP Logging Cheat Sheet and NIST SP 800-92 guidance.References:
Goals
Scope
Implement the audit trail as one complete backend feature across:
SemossMonolithFrontend audit viewing can be handled separately unless required for admin validation.
Proposed Audit Table
Create/extend
USER_AUDIT_EVENTSinUserTrackingDatabase.Required columns:
Column Definitions
EVENT_IDEVENT_TIMEEVENT_OCCURRED_TIMEEVENT_TYPELOGIN,PERMISSION_UPDATEACTIONSTATUSSUCCESS,FAILURE,DENIED,ERRORSEVERITYLOW,MEDIUM,HIGH,CRITICALCATEGORYAUTH,AUTHZ,USER_ADMIN,PROJECT,WORKSPACE,ENGINE,AUDIT, etc.ACTOR_*SUBJECT_USER_*SESSION_ID_HASHREQUEST_IDIP_ADDRUSER_AGENTHTTP_METHODREQUEST_PATHHTTP_STATUSTARGET_*PROJECT_IDENGINE_IDINSIGHT_IDROOM_IDOLD_VALUENEW_VALUEDETAILSERROR_CODEERROR_MESSAGESOURCE_*HASH_PREVIOUS/HASH_CURRENTEvent Types To Implement
Authentication
LOGINLOGOUTLOGIN_FAILEDAuthorization / Permissions
AUTHORIZATION_DENIEDPERMISSION_ADDPERMISSION_UPDATEPERMISSION_DELETEACCESS_REQUEST_APPROVEACCESS_REQUEST_REJECTCovered resources:
User Administration
USER_CREATEUSER_UPDATEUSER_DELETEUSER_ACTIVATEUSER_DEACTIVATEUSER_ROLE_UPDATEUSER_PASSWORD_RESETMust include actions from the admin member dashboard.
Group Administration
GROUP_CREATEGROUP_UPDATEGROUP_DELETEGROUP_MEMBER_ADDGROUP_MEMBER_REMOVEProject Lifecycle
PROJECT_CREATEPROJECT_UPLOADPROJECT_UPDATEPROJECT_DELETEWorkspace Lifecycle
WORKSPACE_CREATEWORKSPACE_UPDATEWORKSPACE_DELETEEngine Lifecycle
ENGINE_CREATEENGINE_UPDATEENGINE_DELETEMODEL_CREATEVECTOR_CREATESTORAGE_CREATEFUNCTION_CREATEGUARDRAIL_CREATEMetadata / Visibility Updates
These can be recorded as:
Audit Access
AUDIT_QUERYAUDIT_EXPORTImplementation Requirements
Backend Table Creation
USER_AUDIT_EVENTStoUserTrackingDatabase.USER_TRACKING_ENABLED=true.USER_TRACKING_ENABLED=false.Audit Utility
Create or update a central audit utility that supports:
Audit insert failures must be logged to application logs but must not break the primary business action.
Request Context
Add request context collection where available:
For non-request background cleanup events, missing request fields are acceptable.
Sanitization / Redaction
Audit logging must not store:
Sensitive keys in JSON should be redacted before insert.
Example:
{ "apiKey": "[REDACTED]", "password": "[REDACTED]" }Permission Event Semantics
For permission changes:
TARGET_*must represent the resource being permissioned.SUBJECT_USER_*must represent the affected user/grantee when applicable.DETAILSor equivalent subject fields if group subject columns are added.OLD_VALUEshould contain previous permission where available.NEW_VALUEshould contain new permission where available.PERMISSION_UPDATErow only.PERMISSION_DELETErows.Project / Engine Event Semantics
For lifecycle events:
TARGET_IDmust be the stable project/engine id.TARGET_NAMEshould be populated when available.PROJECT_IDorENGINE_IDshould be populated for joins.DETAILSshould include useful non-sensitive metadata such as type, global flag, mode, resource counts, or metadata keys.Failure Logging
Log failure events for sensitive flows, including:
Failure events should include:
ERROR_MESSAGEmust be sanitized and should not expose secrets or internal stack traces.Admin Query Reactor
Implement an admin-only reactor to query audit events.
Requirements:
Operational Requirements
Based on OWASP and NIST guidance:
AUDIT_EXPORT.HASH_PREVIOUSandHASH_CURRENT.Acceptance Criteria
Schema
USER_AUDIT_EVENTSexists inUserTrackingDatabase.Config Behavior
USER_TRACKING_ENABLED=false, audit writes are no-op and business flows do not crash.Authentication
LOGINevent.LOGOUTevent.IP_ADDR.LOGIN_FAILEDevent with sanitized error.Permissions
ACCESS_REQUEST_APPROVE.ACCESS_REQUEST_REJECT.SUBJECT_USER_IDis populated for user/grantee permission flows.User / Group Admin
USER_CREATE.USER_UPDATE.USER_DELETEorUSER_DEACTIVATE.USER_ROLE_UPDATE.USER_PASSWORD_RESET.Project / Workspace
PROJECT_CREATE.PROJECT_UPLOAD.PROJECT_UPDATE.PROJECT_DELETE.WORKSPACE_CREATE.WORKSPACE_UPDATE.WORKSPACE_DELETE.Engine
ENGINE_CREATE.ENGINE_DELETE.ENGINE_DELETEwith database target type/context.MODEL_CREATE.VECTOR_CREATE.STORAGE_CREATE.FUNCTION_CREATE.GUARDRAIL_CREATE.ENGINE_UPDATE.Failure Events
AUTHORIZATION_DENIED.Sanitization
Admin Query
AUDIT_QUERY.AUDIT_EXPORT.Tests
Notes
This task should be implemented as a complete audit-trail feature, using OWASP and NIST guidance as references. Existing SEMOSS query/model/guardrail tracking mechanisms are outside the scope unless they are explicitly converted into sanitized audit summary events later.