Skip to content

Security & compliance

This page is the reference for CORE-M’s account-security, access-control, and compliance controls. For request-level authentication (JWT vs API key, headers, error codes) see API overview; for how tenants are isolated see Auth & multi-tenancy.

MFA is tenant-configurable, using TOTP plus single-use recovery codes. Factors are stored encrypted in the Aerospike sessions namespace, mfa set, keyed {tenant_id}:{user_id}.

ActionBehaviour
Enroll TOTPUser confirms a valid code; the encrypted secret is stored; recovery codes are generated and returned exactly once; audit mfa.enrolled is written
Login (MFA required)Password auth alone does not issue a token; the login response demands an MFA challenge; the access token is issued only after a valid TOTP code
Use a recovery codeLogin succeeds, the code is invalidated, and audit mfa.recovery_code.used is written

Tenants configure password strength, session lifetime, and refresh-token rotation; users can list and revoke their own sessions.

ControlBehaviour
Password policyWeak passwords are rejected with INVALID_ARGUMENT; the response lists the failed rules without echoing the password
Refresh rotationEach refresh issues a new token pair and invalidates the old refresh token
Revoke a sessionThe session’s refresh token is invalidated; its access token fails after the configured revocation-propagation delay; audit session.revoked is written
Revoke all other sessionsAll sessions except the current one are invalidated

Scoped API tokens and service accounts are separate from device-provisioning keys. Tokens live in the Aerospike sessions namespace, api_tokens set, keyed {tenant_id}:{token_id}. The raw token value is returned exactly once; only the hash, prefix, scopes, and timestamps are stored.

A token carries:

AttributeMeaning
subject_typeuser or service_account
scopesThe permission set the token grants (table below)
expires_atExpiry timestamp
ip_allowlistOptional source-CIDR restriction
prefixNon-secret prefix shown in listings and audit
created_at / last_used_atLifecycle timestamps
ScopeGrants
devices:readRead device registry
devices:writeCreate / update / delete devices
telemetry:ingestSubmit telemetry
telemetry:readQuery telemetry and snapshots
rules:writeManage rules
rpc:executeIssue server-to-device RPCs
exports:createCreate export jobs
anchoring:readRead anchor batches and proofs
ScenarioOutcome
Token lacks the scope for a call (e.g. telemetry:read token calls CreateDevice)PERMISSION_DENIED; audit api_token.denied records missing_scope="devices:write"
Rotate a service-account tokenA new token is created; the old one is scheduled to expire after overlap_seconds; both prefixes are visible during the overlap window

Allowlists apply at both the tenant level (UI, API, protocol ingestion) and the individual token level.

ScenarioOutcome
Token request from outside its CIDR allowlistPERMISSION_DENIED; no downstream handler runs
Login from an IP excluded by the tenant UI allowlistRejected before password verification; audit login.denied_ip is written

Every security, admin, data-governance, command-execution, rule-deployment, profile, dashboard, and anchoring-policy action writes an immutable audit event. Events are stored in the Aerospike sessions namespace, audit set, keyed {tenant_id}:{event_id}, and may be copied to long-term storage.

FieldMeaning
event_idUnique event ID
tenant_idOwning tenant
actor_type / actor_idWho acted (user or service account)
actionWhat happened, e.g. device.deleted, retention.policy.updated
target_type / target_idThe affected resource
result / reasonOutcome and, when denied, why
source_ip / user_agentRequest origin
trace_idCorrelates to the distributed trace
created_atEvent timestamp
before_hash / after_hashIntegrity hashes around the change
redacted_details_jsonDetail payload with secrets removed
CapabilityBehaviour
SearchFilter by time range, actor, and action; results are paginated and ordered descending by created_at
RedactionSensitive values are never recorded — a token rotation logs only token_id, prefix, scopes, and expiration, never the raw token
ExportAudit events can be exported with a manifest (see Export jobs)

CORE-M supports data-subject workflows with explicit safeguards for immutable proofs.

WorkflowBehaviour
User data exportBundle contains the user’s profile, sessions, audit events involving them, dashboard preferences, and notification preferences; the download URL has an expires_at
Data deletion (device with final proofs)Operational raw telemetry is deleted or redacted per policy; proof records remain; verification responses indicate the raw data is not retained; audit compliance.delete.completed records the preserved-proof count

Custody controls cover the secrets you configure: SSO client secrets, protocol credentials, connector secrets, and notification-provider secrets.

SecretCustody behaviour
Connector secret (e.g. webhook bearer token)Stored in the configured secret backend; the rule-chain config keeps only a reference; API responses never return the value
Protocol / SSO credentialStored hashed or as a backend reference; raw values are never returned by the API

The platform prefers KMS-backed references over raw key material wherever a secret backend is available.