@agent-ix/spec-objects-security 0.4.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/README.md +2 -0
  2. package/manifest.yaml +270 -26
  3. package/package.json +8 -2
  4. package/schemas/Asset.json +78 -0
  5. package/schemas/AttackSurface.json +55 -0
  6. package/schemas/AuditEvent.json +57 -0
  7. package/schemas/AuditFinding.json +67 -0
  8. package/schemas/AuthFlow.json +69 -0
  9. package/schemas/ConfidentialityLevel.json +13 -0
  10. package/schemas/Control.json +83 -0
  11. package/schemas/ControlEffectiveness.json +12 -0
  12. package/schemas/ControlMapping.json +26 -0
  13. package/schemas/CorsPolicy.json +46 -0
  14. package/schemas/CsrfToken.json +46 -0
  15. package/schemas/DataClassification.json +61 -0
  16. package/schemas/DefaultedField.json +14 -0
  17. package/schemas/EffectivenessField.json +15 -0
  18. package/schemas/EncryptionKey.json +78 -0
  19. package/schemas/FindingStatus.json +14 -0
  20. package/schemas/FlowStep.json +24 -0
  21. package/schemas/IdentityField.json +15 -0
  22. package/schemas/Impact.json +14 -0
  23. package/schemas/ImpactField.json +15 -0
  24. package/schemas/JwtClaim.json +49 -0
  25. package/schemas/LevelField.json +15 -0
  26. package/schemas/Likelihood.json +14 -0
  27. package/schemas/LikelihoodField.json +15 -0
  28. package/schemas/MfaFactorKind.json +12 -0
  29. package/schemas/MfaMethod.json +69 -0
  30. package/schemas/OccurrenceField.json +14 -0
  31. package/schemas/OccurrenceTypeRef.json +15 -0
  32. package/schemas/PasswordPolicy.json +40 -0
  33. package/schemas/Permission.json +49 -0
  34. package/schemas/Policy.json +52 -0
  35. package/schemas/Risk.json +79 -0
  36. package/schemas/Role.json +55 -0
  37. package/schemas/Scope.json +49 -0
  38. package/schemas/Secret.json +78 -0
  39. package/schemas/SecretLifecycle.json +14 -0
  40. package/schemas/SessionConfig.json +43 -0
  41. package/schemas/Severity.json +14 -0
  42. package/schemas/SeverityField.json +15 -0
  43. package/schemas/StatusField.json +15 -0
  44. package/schemas/StrideCategory.json +15 -0
  45. package/schemas/StrideCategoryField.json +15 -0
  46. package/schemas/Threat.json +67 -0
  47. package/schemas/TrustBoundary.json +69 -0
  48. package/schemas/TrustLevel.json +12 -0
  49. package/schemas/TrustLevelField.json +15 -0
  50. package/schemas/Vulnerability.json +70 -0
  51. package/schemas/toolchain.json +97 -0
  52. package/skeletons/asset.md +22 -14
  53. package/skeletons/asset.sysml.md +27 -0
  54. package/skeletons/attack_surface.md +21 -18
  55. package/skeletons/audit_event.md +31 -18
  56. package/skeletons/audit_finding.md +22 -18
  57. package/skeletons/auth_flow.md +56 -21
  58. package/skeletons/control.md +45 -16
  59. package/skeletons/cors_policy.md +33 -17
  60. package/skeletons/csrf_token.md +17 -13
  61. package/skeletons/data_classification.md +23 -18
  62. package/skeletons/encryption_key.md +19 -12
  63. package/skeletons/jwt_claim.md +25 -14
  64. package/skeletons/mfa_method.md +17 -11
  65. package/skeletons/password_policy.md +35 -20
  66. package/skeletons/permission.md +18 -12
  67. package/skeletons/policy.md +33 -17
  68. package/skeletons/risk.md +20 -14
  69. package/skeletons/role.md +20 -13
  70. package/skeletons/scope.md +18 -12
  71. package/skeletons/secret.md +23 -16
  72. package/skeletons/secret.sysml.md +29 -0
  73. package/skeletons/session_config.md +35 -18
  74. package/skeletons/threat.md +22 -11
  75. package/skeletons/threat.sysml.md +26 -0
  76. package/skeletons/trust_boundary.md +51 -16
  77. package/skeletons/vulnerability.md +18 -15
@@ -0,0 +1,78 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/Secret.json",
4
+ "type": "object",
5
+ "properties": {
6
+ "fields": {
7
+ "type": "array",
8
+ "items": {
9
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/FieldDecl.json"
10
+ },
11
+ "minItems": 1,
12
+ "contains": {
13
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/IdentityField.json"
14
+ }
15
+ },
16
+ "clauses": {
17
+ "type": "array",
18
+ "items": {
19
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/ClauseRef.json"
20
+ }
21
+ },
22
+ "operations": {
23
+ "type": "array",
24
+ "items": {
25
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/OperationDecl.json"
26
+ }
27
+ },
28
+ "lifecycle": {
29
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/SecretLifecycle.json"
30
+ },
31
+ "material_ref": {
32
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/SemanticId.json"
33
+ },
34
+ "custodian": {
35
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/SemanticId.json"
36
+ },
37
+ "classification": {
38
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/ConfidentialityLevel.json"
39
+ }
40
+ },
41
+ "required": [
42
+ "fields"
43
+ ],
44
+ "unevaluatedProperties": {
45
+ "not": {}
46
+ },
47
+ "description": "A confidential value kept out of code.",
48
+ "allOf": [
49
+ {
50
+ "properties": {
51
+ "fields": {
52
+ "items": {
53
+ "not": {
54
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/DefaultedField.json"
55
+ }
56
+ }
57
+ }
58
+ }
59
+ },
60
+ {
61
+ "properties": {
62
+ "operations": {
63
+ "items": {
64
+ "properties": {
65
+ "params": {
66
+ "items": {
67
+ "not": {
68
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/DefaultedField.json"
69
+ }
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
75
+ }
76
+ }
77
+ ]
78
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/SecretLifecycle.json",
4
+ "type": "string",
5
+ "enum": [
6
+ "proposed",
7
+ "active",
8
+ "rotating",
9
+ "revoked",
10
+ "compromised",
11
+ "unknown"
12
+ ],
13
+ "description": "Where secret material is in its life. `unknown` states that it was not tracked."
14
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/SessionConfig.json",
4
+ "type": "object",
5
+ "properties": {
6
+ "clauses": {
7
+ "type": "array",
8
+ "items": {
9
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/ClauseRef.json"
10
+ },
11
+ "minItems": 1
12
+ },
13
+ "fields": {
14
+ "type": "array",
15
+ "items": {
16
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/FieldDecl.json"
17
+ }
18
+ },
19
+ "binds_flow": {
20
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/SemanticId.json"
21
+ }
22
+ },
23
+ "required": [
24
+ "clauses"
25
+ ],
26
+ "unevaluatedProperties": {
27
+ "not": {}
28
+ },
29
+ "description": "The rules a session obeys. `operations` and `relations` are forbidden by the seal.",
30
+ "allOf": [
31
+ {
32
+ "properties": {
33
+ "fields": {
34
+ "items": {
35
+ "not": {
36
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/DefaultedField.json"
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ ]
43
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/Severity.json",
4
+ "type": "string",
5
+ "enum": [
6
+ "none",
7
+ "low",
8
+ "medium",
9
+ "high",
10
+ "critical",
11
+ "unknown"
12
+ ],
13
+ "description": "How bad a vulnerability is. `unknown` states that it was not assessed."
14
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/SeverityField.json",
4
+ "type": "object",
5
+ "properties": {
6
+ "name": {
7
+ "type": "string",
8
+ "const": "severity"
9
+ }
10
+ },
11
+ "required": [
12
+ "name"
13
+ ],
14
+ "description": "A `FieldDecl` named `severity`."
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/StatusField.json",
4
+ "type": "object",
5
+ "properties": {
6
+ "name": {
7
+ "type": "string",
8
+ "const": "status"
9
+ }
10
+ },
11
+ "required": [
12
+ "name"
13
+ ],
14
+ "description": "A `FieldDecl` named `status`."
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/StrideCategory.json",
4
+ "type": "string",
5
+ "enum": [
6
+ "spoofing",
7
+ "tampering",
8
+ "repudiation",
9
+ "information_disclosure",
10
+ "denial_of_service",
11
+ "elevation_of_privilege",
12
+ "unknown"
13
+ ],
14
+ "description": "The STRIDE class of a threat. `unknown` states that it was not classified."
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/StrideCategoryField.json",
4
+ "type": "object",
5
+ "properties": {
6
+ "name": {
7
+ "type": "string",
8
+ "const": "stride_category"
9
+ }
10
+ },
11
+ "required": [
12
+ "name"
13
+ ],
14
+ "description": "A `FieldDecl` named `stride_category`."
15
+ }
@@ -0,0 +1,67 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/Threat.json",
4
+ "type": "object",
5
+ "properties": {
6
+ "fields": {
7
+ "type": "array",
8
+ "items": {
9
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/FieldDecl.json"
10
+ },
11
+ "minItems": 1,
12
+ "contains": {
13
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/IdentityField.json"
14
+ }
15
+ },
16
+ "clauses": {
17
+ "type": "array",
18
+ "items": {
19
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/ClauseRef.json"
20
+ }
21
+ },
22
+ "relations": {
23
+ "type": "array",
24
+ "items": {
25
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/RelationDecl.json"
26
+ }
27
+ },
28
+ "stride_category": {
29
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/StrideCategory.json"
30
+ },
31
+ "exploits": {
32
+ "type": "array",
33
+ "items": {
34
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/SemanticId.json"
35
+ }
36
+ }
37
+ },
38
+ "required": [
39
+ "fields"
40
+ ],
41
+ "unevaluatedProperties": {
42
+ "not": {}
43
+ },
44
+ "description": "An adversary capability against this system. `operations` is forbidden by the seal.",
45
+ "allOf": [
46
+ {
47
+ "properties": {
48
+ "fields": {
49
+ "contains": {
50
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/StrideCategoryField.json"
51
+ }
52
+ }
53
+ }
54
+ },
55
+ {
56
+ "properties": {
57
+ "fields": {
58
+ "items": {
59
+ "not": {
60
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/DefaultedField.json"
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ ]
67
+ }
@@ -0,0 +1,69 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/TrustBoundary.json",
4
+ "type": "object",
5
+ "properties": {
6
+ "fields": {
7
+ "type": "array",
8
+ "items": {
9
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/FieldDecl.json"
10
+ },
11
+ "minItems": 1,
12
+ "contains": {
13
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/IdentityField.json"
14
+ }
15
+ },
16
+ "clauses": {
17
+ "type": "array",
18
+ "items": {
19
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/ClauseRef.json"
20
+ },
21
+ "minItems": 1
22
+ },
23
+ "relations": {
24
+ "type": "array",
25
+ "items": {
26
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/RelationDecl.json"
27
+ }
28
+ },
29
+ "trust_level": {
30
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/TrustLevel.json"
31
+ },
32
+ "crosses": {
33
+ "type": "array",
34
+ "items": {
35
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/SemanticId.json"
36
+ }
37
+ }
38
+ },
39
+ "required": [
40
+ "fields",
41
+ "clauses"
42
+ ],
43
+ "unevaluatedProperties": {
44
+ "not": {}
45
+ },
46
+ "description": "A zone edge. `clauses` is required: a boundary that admits every crossing is\nnot a boundary. `operations` is forbidden by the seal.",
47
+ "allOf": [
48
+ {
49
+ "properties": {
50
+ "fields": {
51
+ "contains": {
52
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/TrustLevelField.json"
53
+ }
54
+ }
55
+ }
56
+ },
57
+ {
58
+ "properties": {
59
+ "fields": {
60
+ "items": {
61
+ "not": {
62
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/DefaultedField.json"
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ ]
69
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/TrustLevel.json",
4
+ "type": "string",
5
+ "enum": [
6
+ "untrusted",
7
+ "semi_trusted",
8
+ "trusted",
9
+ "unknown"
10
+ ],
11
+ "description": "How far a zone is trusted. `untrusted` is the unassessed member, because the\nleast-granting reading of \"we never decided\" is \"we do not trust it\"."
12
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/TrustLevelField.json",
4
+ "type": "object",
5
+ "properties": {
6
+ "name": {
7
+ "type": "string",
8
+ "const": "trust_level"
9
+ }
10
+ },
11
+ "required": [
12
+ "name"
13
+ ],
14
+ "description": "A `FieldDecl` named `trust_level`."
15
+ }
@@ -0,0 +1,70 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/Vulnerability.json",
4
+ "type": "object",
5
+ "properties": {
6
+ "fields": {
7
+ "type": "array",
8
+ "items": {
9
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/FieldDecl.json"
10
+ },
11
+ "minItems": 1,
12
+ "contains": {
13
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/IdentityField.json"
14
+ }
15
+ },
16
+ "clauses": {
17
+ "type": "array",
18
+ "items": {
19
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/ClauseRef.json"
20
+ }
21
+ },
22
+ "relations": {
23
+ "type": "array",
24
+ "items": {
25
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/RelationDecl.json"
26
+ }
27
+ },
28
+ "severity": {
29
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/Severity.json"
30
+ },
31
+ "cve_id": {
32
+ "type": "string"
33
+ },
34
+ "affects": {
35
+ "type": "array",
36
+ "items": {
37
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/SemanticId.json"
38
+ }
39
+ }
40
+ },
41
+ "required": [
42
+ "fields"
43
+ ],
44
+ "unevaluatedProperties": {
45
+ "not": {}
46
+ },
47
+ "description": "A weakness an implementation carries. `operations` is forbidden by the seal.",
48
+ "allOf": [
49
+ {
50
+ "properties": {
51
+ "fields": {
52
+ "contains": {
53
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/SeverityField.json"
54
+ }
55
+ }
56
+ }
57
+ },
58
+ {
59
+ "properties": {
60
+ "fields": {
61
+ "items": {
62
+ "not": {
63
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/DefaultedField.json"
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ ]
70
+ }
@@ -0,0 +1,97 @@
1
+ {
2
+ "compiler": {
3
+ "name": "@typespec/compiler",
4
+ "version": "1.15.0"
5
+ },
6
+ "emitter": {
7
+ "name": "@typespec/json-schema",
8
+ "version": "1.15.0"
9
+ },
10
+ "semanticCore": {
11
+ "name": "@agent-ix/semantic-core",
12
+ "version": "0.3.0"
13
+ },
14
+ "base": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/",
15
+ "normalization": {
16
+ "name": "absolute-id-and-ref",
17
+ "version": "1.0.0",
18
+ "issue": "https://github.com/agent-ix/spec-objects-security/issues/13",
19
+ "applied": true,
20
+ "rewrittenFiles": [
21
+ "Asset.json",
22
+ "AttackSurface.json",
23
+ "AuditEvent.json",
24
+ "AuditFinding.json",
25
+ "AuthFlow.json",
26
+ "Control.json",
27
+ "CorsPolicy.json",
28
+ "CsrfToken.json",
29
+ "DataClassification.json",
30
+ "EncryptionKey.json",
31
+ "JwtClaim.json",
32
+ "MfaMethod.json",
33
+ "PasswordPolicy.json",
34
+ "Permission.json",
35
+ "Policy.json",
36
+ "Risk.json",
37
+ "Role.json",
38
+ "Scope.json",
39
+ "Secret.json",
40
+ "SessionConfig.json",
41
+ "Threat.json",
42
+ "TrustBoundary.json",
43
+ "Vulnerability.json"
44
+ ],
45
+ "note": "rewrote relative $id/$ref to the module base or semantic-core 0.3.0"
46
+ },
47
+ "files": [
48
+ "Asset.json",
49
+ "AttackSurface.json",
50
+ "AuditEvent.json",
51
+ "AuditFinding.json",
52
+ "AuthFlow.json",
53
+ "ConfidentialityLevel.json",
54
+ "Control.json",
55
+ "ControlEffectiveness.json",
56
+ "ControlMapping.json",
57
+ "CorsPolicy.json",
58
+ "CsrfToken.json",
59
+ "DataClassification.json",
60
+ "DefaultedField.json",
61
+ "EffectivenessField.json",
62
+ "EncryptionKey.json",
63
+ "FindingStatus.json",
64
+ "FlowStep.json",
65
+ "IdentityField.json",
66
+ "Impact.json",
67
+ "ImpactField.json",
68
+ "JwtClaim.json",
69
+ "LevelField.json",
70
+ "Likelihood.json",
71
+ "LikelihoodField.json",
72
+ "MfaFactorKind.json",
73
+ "MfaMethod.json",
74
+ "OccurrenceField.json",
75
+ "OccurrenceTypeRef.json",
76
+ "PasswordPolicy.json",
77
+ "Permission.json",
78
+ "Policy.json",
79
+ "Risk.json",
80
+ "Role.json",
81
+ "Scope.json",
82
+ "Secret.json",
83
+ "SecretLifecycle.json",
84
+ "SessionConfig.json",
85
+ "Severity.json",
86
+ "SeverityField.json",
87
+ "StatusField.json",
88
+ "StrideCategory.json",
89
+ "StrideCategoryField.json",
90
+ "Threat.json",
91
+ "TrustBoundary.json",
92
+ "TrustLevel.json",
93
+ "TrustLevelField.json",
94
+ "Vulnerability.json"
95
+ ],
96
+ "digest": "sha256:cf9cc6011a068155fac6918c69f5f7ea54805650a5812e9e63633d1cdff2c839"
97
+ }
@@ -1,22 +1,30 @@
1
1
  ---
2
2
  id: ASSET-001
3
- title: "Session store"
3
+ title: "TenantDatabase"
4
4
  type: asset
5
+ object: asset
5
6
  ---
6
- <!-- asset authoring skeleton (spec-objects-security). Fill every part with
7
+ <!-- asset authoring skeleton (spec-objects-security). Fill every section with
7
8
  substantive content. Contract (manifest body_extraction asserts):
8
- - Frontmatter MUST carry id, title, type (type: asset).
9
- - A "Description" section MUST describe the asset and why it matters. -->
10
- # [ASSET-001] Session store
11
-
12
- Redis cluster holding all active Atlas web sessions and CSRF token state.
9
+ - Frontmatter MUST carry id, title, type: asset, object: asset.
10
+ - "## Description" (H2, required): what the asset is and why it matters.
11
+ - "## Properties" (H2): one typed row per attribute, header exactly
12
+ `Field | Type | Multiplicity | Constraints`. At least one row carries
13
+ the `identity` constraint (Asset.json refuses a record without one). -->
14
+ # [ASSET-001] TenantDatabase
13
15
 
14
16
  ## Description
15
17
 
16
- The session store is the authority for who is currently authenticated:
17
- compromise yields the ability to mint or hijack any active session across all
18
- tenants, bypassing AUTHFLOW-001 entirely. It runs in the trusted private
19
- subnet behind BOUND-001, accepts only mTLS connections from the auth service,
20
- and persists nothing to disk (RDB/AOF disabled) so session identifiers never
21
- reach backup media. Data it holds is classified Confidential (CLASS-001
22
- handling applies to the embedded user identifiers).
18
+ The per-tenant PostgreSQL database holding customer records, order history and
19
+ audit trails. It is the primary confidentiality and integrity asset of the
20
+ platform: its compromise discloses every tenant's data at once.
21
+
22
+ ## Properties
23
+
24
+ | Field | Type | Multiplicity | Constraints |
25
+ |---|---|---|---|
26
+ | asset_id | UUID | 1..1 | identity |
27
+ | name | String | 1..1 | minLength: 1, maxLength: 128 |
28
+ | classification | DataRestricted | 1..1 | |
29
+ | steward | String | 1..1 | minLength: 1 |
30
+ | replica_count | Integer | 0..1 | min: 0 |
@@ -0,0 +1,27 @@
1
+ ---
2
+ id: ASSET-001
3
+ title: "TenantDatabase"
4
+ type: asset
5
+ object: asset
6
+ ---
7
+ <!-- asset authoring skeleton, alternate Properties form. Declares exactly the
8
+ same fields as asset.md, authored as one ```sysml``` fence instead of the
9
+ typed table (FR-005-AC-2). One artifact carries one form; the alternate is
10
+ a separate file, never a second block in the same artifact. -->
11
+ # [ASSET-001] TenantDatabase
12
+
13
+ ## Description
14
+
15
+ The per-tenant PostgreSQL database holding customer records, order history and
16
+ audit trails. It is the primary confidentiality and integrity asset of the
17
+ platform: its compromise discloses every tenant's data at once.
18
+
19
+ ## Properties
20
+
21
+ ```sysml
22
+ attribute asset_id : UUID[1..1] { identity }
23
+ attribute name : String[1..1] { minLength: 1, maxLength: 128 }
24
+ ref item classification : DataRestricted[1..1]
25
+ attribute steward : String[1..1] { minLength: 1 }
26
+ attribute replica_count : Integer[0..1] { min: 0 }
27
+ ```