speckl/examples/AccessControl.speck

157 lines
4.3 KiB
Text

// AccessControl.speck
// Derives/satisfies for regulatory traceability
//
// Provenance: Access control system requiring full regulatory
// compliance traceability. Every access decision must be traceable
// to its source requirements and regulatory clauses.
//
// SpeckBOM: Full BOM with regulatory traceability, audit
// logging requirements, and compliance verification.
//
// Author: Security Engineering Team <security@scoble.me>
// Source: Security Architecture Review, SOC 2 Compliance Audit
speck AccessControl {
// SpeckBOM - declare toolchain and compliance metadata
bom {
compiler: "speckl-compile" version "0.2.0"
solver: "z3" version "4.12.5"
runtime: "wasm-runtime" version "1.0.0"
license: "MIT"
hash: "sha256: AccessControl-base-v1"
}
// Intent provenance - regulatory and security context
provenance {
regulation: "SOC 2 Type II" // Trust Services Criteria
regulation: "ISO 27001:2022" // Information security
regulation: "GDPR Article 32" // Security of processing
design_decision: "ADR-0012 Identity and Access Management"
parent_spec: "SecurityFoundation"
external_doc: "NIST SP 800-63B" at "https://pages.nist.gov/800-63-3/sp800-63b.html"
}
// Traceability to security requirements and regulatory clauses
satisfies ACCESS-REQ-001
satisfies ACCESS-REQ-002 clause "4.1.3"
satisfies ACCESS-REQ-003 clause "5.2.1"
satisfies SOC2-CC-6-1 clause "Logical access security"
satisfies SOC2-CC-7-1 clause "Security monitoring"
satisfies GDPR-ART-32 clause "Security of processing"
// Authorship and origin
author: "Security Engineering" <"security@scoble.me">
source: architecture_review ref "AR-2024-0108"
source: compliance_audit ref "AUDIT-2024-SOC2-001"
source: meeting ref "zoom://2024-01-15/security-architecture"
// Verification boundary - manual review required for security changes
review: manual
// Derives from security foundation, satisfies access control requirements
derives from SecurityFoundation via "access control policy enforcement"
satisfies SECURITY-REQ-001
// Input: access request and context
input: {
userId: String,
resourceId: String,
requestedAction: Action,
userRoles: [String],
userGroups: [String],
timestamp: Nat,
ipAddress: String,
deviceFingerprint: String,
sessionToken: String
}
// Output: access decision and metadata
output: {
allowed: Bool,
reason: String,
policyId: String,
auditTrail: [String],
rateLimitRemaining: Nat,
sessionValid: Bool
}
// Constraints - access control invariants
constraint: userId != ""
constraint: resourceId != ""
constraint: timestamp > 0
constraint: count(userRoles) >= 0
constraint: count(userGroups) >= 0
constraint: sessionToken != ""
// Policy constraints - must have valid policy
constraint: policyId != ""
constraint: implies(allowed, policyId != "")
constraint: implies(not allowed, reason != "")
// Rate limiting constraint
constraint: rateLimitRemaining >= 0
constraint: rateLimitRemaining <= 100
// Session validation constraint
constraint: implies(sessionValid, sessionToken != "")
// Verification: access decisions are correct
verify: always(implies(
allowed,
hasPermission(userId, resourceId, requestedAction, userRoles, userGroups)
))
verify: always(implies(
not allowed,
not hasPermission(userId, resourceId, requestedAction, userRoles, userGroups)
))
verify: always(implies(
rateLimitRemaining == 0,
allowed == false
))
// Verification: audit trail is complete
verify: always(implies(
allowed or not allowed,
count(auditTrail) >= 1
))
// Events for security audit trail
event AccessAttempt {
userId: String
resourceId: String
requestedAction: String
allowed: Bool
timestamp: Nat
}
event AccessDenied {
userId: String
resourceId: String
requestedAction: String
reason: String
timestamp: Nat
}
event PolicyEvaluated {
policyId: String
userId: String
resourceId: String
result: String
timestamp: Nat
}
event RateLimited {
userId: String
requestCount: Nat
limit: Nat
timestamp: Nat
}
event SessionInvalidated {
sessionToken: String
reason: String
timestamp: Nat
}
}