@documentation-robotics/cli 0.2.0 → 0.3.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.
- package/README.md +36 -2
- package/dist/analysis/relationship-classifier.js +2 -9
- package/dist/analysis/relationship-classifier.js.map +2 -2
- package/dist/analyzers/call-graph-utils.js +2 -2
- package/dist/analyzers/call-graph-utils.js.map +2 -2
- package/dist/analyzers/cards/build.js +171 -0
- package/dist/analyzers/cards/build.js.map +7 -0
- package/dist/analyzers/cards/classify.js +42 -0
- package/dist/analyzers/cards/classify.js.map +7 -0
- package/dist/analyzers/cards/edge-index.js +44 -0
- package/dist/analyzers/cards/edge-index.js.map +7 -0
- package/dist/analyzers/cards/facts.js +46 -0
- package/dist/analyzers/cards/facts.js.map +7 -0
- package/dist/analyzers/cards/graph.js +42 -0
- package/dist/analyzers/cards/graph.js.map +7 -0
- package/dist/analyzers/cards/index.js +8 -0
- package/dist/analyzers/cards/index.js.map +7 -0
- package/dist/analyzers/cards/tier0.js +18 -0
- package/dist/analyzers/cards/tier0.js.map +7 -0
- package/dist/analyzers/cards/types.js +1 -0
- package/dist/analyzers/cards/types.js.map +7 -0
- package/dist/analyzers/cbm-analyzer.js +195 -171
- package/dist/analyzers/cbm-analyzer.js.map +2 -2
- package/dist/analyzers/cbm-responses.js +336 -0
- package/dist/analyzers/cbm-responses.js.map +7 -0
- package/dist/analyzers/edge-relationships.js +45 -0
- package/dist/analyzers/edge-relationships.js.map +7 -0
- package/dist/analyzers/mapping-loader.js +9 -0
- package/dist/analyzers/mapping-loader.js.map +2 -2
- package/dist/analyzers/tier0-rules.js +153 -0
- package/dist/analyzers/tier0-rules.js.map +7 -0
- package/dist/analyzers/types.js.map +1 -1
- package/dist/audit/relationships/ai/prompts.js +10 -10
- package/dist/audit/relationships/ai/prompts.js.map +2 -2
- package/dist/audit/relationships/analysis/layer-templates.js +52 -52
- package/dist/audit/relationships/analysis/layer-templates.js.map +1 -1
- package/dist/cli.js +12 -2
- package/dist/cli.js.map +2 -2
- package/dist/coding-agents/default-permissions.js +31 -1
- package/dist/coding-agents/default-permissions.js.map +2 -2
- package/dist/coding-agents/drbot-mcp.js +167 -0
- package/dist/coding-agents/drbot-mcp.js.map +7 -0
- package/dist/commands/add.js +3 -2
- package/dist/commands/add.js.map +2 -2
- package/dist/commands/analyzer.js +117 -14
- package/dist/commands/analyzer.js.map +2 -2
- package/dist/commands/changeset-verify.js +55 -0
- package/dist/commands/changeset-verify.js.map +7 -0
- package/dist/commands/changeset.js +43 -22
- package/dist/commands/changeset.js.map +2 -2
- package/dist/commands/delete.js +10 -4
- package/dist/commands/delete.js.map +2 -2
- package/dist/commands/farm.js +176 -60
- package/dist/commands/farm.js.map +2 -2
- package/dist/commands/mcp.js +19 -4
- package/dist/commands/mcp.js.map +2 -2
- package/dist/commands/relationship.js +207 -26
- package/dist/commands/relationship.js.map +2 -2
- package/dist/commands/update.js +42 -23
- package/dist/commands/update.js.map +2 -2
- package/dist/commands/upgrade.js +99 -11
- package/dist/commands/upgrade.js.map +3 -3
- package/dist/commands/version.js +1 -1
- package/dist/commands/visualize.js +4 -3
- package/dist/commands/visualize.js.map +2 -2
- package/dist/core/catalog-migration.js +33 -0
- package/dist/core/catalog-migration.js.map +7 -0
- package/dist/core/changeset-analysis.js +421 -0
- package/dist/core/changeset-analysis.js.map +7 -0
- package/dist/core/changeset-base-index.js +153 -0
- package/dist/core/changeset-base-index.js.map +7 -0
- package/dist/core/changeset-brief-delta.js +102 -0
- package/dist/core/changeset-brief-delta.js.map +7 -0
- package/dist/core/changeset-graph.js +281 -0
- package/dist/core/changeset-graph.js.map +7 -0
- package/dist/core/changeset-only-guard.js +32 -0
- package/dist/core/changeset-only-guard.js.map +7 -0
- package/dist/core/changeset-summary.js +68 -0
- package/dist/core/changeset-summary.js.map +7 -0
- package/dist/core/changeset-validator.js +66 -20
- package/dist/core/changeset-validator.js.map +2 -2
- package/dist/core/changeset-verify.js +518 -0
- package/dist/core/changeset-verify.js.map +7 -0
- package/dist/core/changeset.js +56 -9
- package/dist/core/changeset.js.map +2 -2
- package/dist/core/element-type-migration.js +145 -0
- package/dist/core/element-type-migration.js.map +7 -0
- package/dist/core/farm-manifest.js +12 -6
- package/dist/core/farm-manifest.js.map +2 -2
- package/dist/core/farm-sync-engine.js +1 -1
- package/dist/core/farm-sync-engine.js.map +2 -2
- package/dist/core/farm-sync-state.js +10 -2
- package/dist/core/farm-sync-state.js.map +2 -2
- package/dist/core/migration-registry.js +75 -46
- package/dist/core/migration-registry.js.map +2 -2
- package/dist/core/model-upgrade.js +102 -0
- package/dist/core/model-upgrade.js.map +7 -0
- package/dist/core/model.js +82 -30
- package/dist/core/model.js.map +2 -2
- package/dist/core/mutation-handler.js +71 -6
- package/dist/core/mutation-handler.js.map +2 -2
- package/dist/core/relationship-migration-table.js +6639 -0
- package/dist/core/relationship-migration-table.js.map +7 -0
- package/dist/core/relationship-migration.js +272 -0
- package/dist/core/relationship-migration.js.map +7 -0
- package/dist/core/relationship-prune.js +49 -0
- package/dist/core/relationship-prune.js.map +7 -0
- package/dist/core/relationship-staging.js +68 -0
- package/dist/core/relationship-staging.js.map +7 -0
- package/dist/core/relationships.js +26 -4
- package/dist/core/relationships.js.map +2 -2
- package/dist/core/report-data-model.js +7 -13
- package/dist/core/report-data-model.js.map +2 -2
- package/dist/core/staged-changeset-storage.js +64 -17
- package/dist/core/staged-changeset-storage.js.map +2 -2
- package/dist/core/staged-source-reference.js +28 -0
- package/dist/core/staged-source-reference.js.map +7 -0
- package/dist/core/staging-area.js +83 -18
- package/dist/core/staging-area.js.map +2 -2
- package/dist/core/virtual-projection.js +13 -5
- package/dist/core/virtual-projection.js.map +2 -2
- package/dist/export/archimate-exporter.js +1 -0
- package/dist/export/archimate-exporter.js.map +2 -2
- package/dist/generated/compiled-validators.js +2 -2
- package/dist/generated/compiled-validators.js.map +2 -2
- package/dist/generated/layer-registry.js +16 -16
- package/dist/generated/layer-registry.js.map +2 -2
- package/dist/generated/node-types.js +186 -168
- package/dist/generated/node-types.js.map +2 -2
- package/dist/generated/relationship-index.js +2236 -7790
- package/dist/generated/relationship-index.js.map +2 -2
- package/dist/integrations/claude_code/agents/dr-architect.md +16 -3
- package/dist/integrations/claude_code/agents/dr-extractor.md +1 -1
- package/dist/integrations/claude_code/commands/dr-analyzer.md +565 -0
- package/dist/integrations/claude_code/commands/dr-map.md +13 -0
- package/dist/integrations/claude_code/commands/dr-plan.md +40 -0
- package/dist/integrations/claude_code/commands/dr-relate.md +106 -96
- package/dist/integrations/claude_code/commands/dr-verify.md +45 -2
- package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +14 -0
- package/dist/integrations/claude_code/docs/MCP_SERVER.md +26 -2
- package/dist/integrations/claude_code/docs/QUICK_START.md +37 -8
- package/dist/integrations/claude_code/docs/README.md +48 -1
- package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +93 -72
- package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +163 -126
- package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +161 -126
- package/dist/integrations/claude_code/skills/dr_04_security_layer/SKILL.md +153 -133
- package/dist/integrations/claude_code/skills/dr_05_application_layer/SKILL.md +129 -100
- package/dist/integrations/claude_code/skills/dr_06_technology_layer/SKILL.md +111 -94
- package/dist/integrations/claude_code/skills/dr_07_api_layer/SKILL.md +143 -157
- package/dist/integrations/claude_code/skills/dr_08_data_model_layer/SKILL.md +117 -33
- package/dist/integrations/claude_code/skills/dr_09_dataset_layer/SKILL.md +74 -25
- package/dist/integrations/claude_code/skills/dr_10_ux_layer/SKILL.md +88 -12
- package/dist/integrations/claude_code/skills/dr_11_navigation_layer/SKILL.md +83 -24
- package/dist/integrations/claude_code/skills/dr_12_apm_layer/SKILL.md +57 -12
- package/dist/integrations/claude_code/skills/dr_13_testing_layer/SKILL.md +92 -15
- package/dist/integrations/claude_code/skills/dr_change_planning/SKILL.md +119 -0
- package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +3 -0
- package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +1 -1
- package/dist/integrations/github_copilot/agents/dr-architect.md +1 -1
- package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +182 -102
- package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +266 -148
- package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +547 -86
- package/dist/integrations/github_copilot/skills/dr_04_security_layer/SKILL.md +164 -169
- package/dist/integrations/github_copilot/skills/dr_05_application_layer/SKILL.md +420 -150
- package/dist/integrations/github_copilot/skills/dr_06_technology_layer/SKILL.md +331 -138
- package/dist/integrations/github_copilot/skills/dr_07_api_layer/SKILL.md +265 -201
- package/dist/integrations/github_copilot/skills/dr_08_data_model_layer/SKILL.md +181 -58
- package/dist/integrations/github_copilot/skills/dr_09_dataset_layer/SKILL.md +209 -57
- package/dist/integrations/github_copilot/skills/dr_10_ux_layer/SKILL.md +277 -112
- package/dist/integrations/github_copilot/skills/dr_11_navigation_layer/SKILL.md +219 -70
- package/dist/integrations/github_copilot/skills/dr_12_apm_layer/SKILL.md +189 -105
- package/dist/integrations/github_copilot/skills/dr_13_testing_layer/SKILL.md +222 -102
- package/dist/integrations/github_copilot/skills/dr_change_planning/SKILL.md +119 -0
- package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +3 -0
- package/dist/integrations/hash-utils.js.map +2 -2
- package/dist/mcp/api-key-manager.js +14 -1
- package/dist/mcp/api-key-manager.js.map +2 -2
- package/dist/mcp/changeset-only.js +34 -0
- package/dist/mcp/changeset-only.js.map +7 -0
- package/dist/mcp/tool-registry.js +19 -3
- package/dist/mcp/tool-registry.js.map +2 -2
- package/dist/mcp/tools/changeset-analysis-tools.js +78 -0
- package/dist/mcp/tools/changeset-analysis-tools.js.map +7 -0
- package/dist/mcp/tools/changeset-editing.js +184 -0
- package/dist/mcp/tools/changeset-editing.js.map +7 -0
- package/dist/mcp/tools/changeset-lifecycle.js +83 -0
- package/dist/mcp/tools/changeset-lifecycle.js.map +7 -0
- package/dist/mcp/tools/changeset-shared.js +31 -0
- package/dist/mcp/tools/changeset-shared.js.map +7 -0
- package/dist/mcp/tools/changeset-show.js +17 -1
- package/dist/mcp/tools/changeset-show.js.map +2 -2
- package/dist/mcp/tools/changeset-verify.js +43 -0
- package/dist/mcp/tools/changeset-verify.js.map +7 -0
- package/dist/mcp/tools/index.js +19 -1
- package/dist/mcp/tools/index.js.map +2 -2
- package/dist/mcp/tools/model-add.js +6 -5
- package/dist/mcp/tools/model-add.js.map +2 -2
- package/dist/mcp/tools/model-delete.js +2 -2
- package/dist/mcp/tools/model-delete.js.map +2 -2
- package/dist/mcp/tools/model-search.js +14 -0
- package/dist/mcp/tools/model-search.js.map +2 -2
- package/dist/mcp/tools/model-show.js +29 -2
- package/dist/mcp/tools/model-show.js.map +2 -2
- package/dist/mcp/tools/model-trace.js +93 -30
- package/dist/mcp/tools/model-trace.js.map +2 -2
- package/dist/mcp/tools/model-update.js +35 -19
- package/dist/mcp/tools/model-update.js.map +2 -2
- package/dist/mcp/tools/relationship-tools.js +98 -0
- package/dist/mcp/tools/relationship-tools.js.map +7 -0
- package/dist/mcp/tools/shared.js +25 -2
- package/dist/mcp/tools/shared.js.map +2 -2
- package/dist/mcp/tools/spec-type.js +90 -0
- package/dist/mcp/tools/spec-type.js.map +7 -0
- package/dist/schemas/bundled/analyzers/cbm.json +1186 -68
- package/dist/schemas/bundled/analyzers/manifest.json +2 -2
- package/dist/schemas/bundled/api.json +1029 -1658
- package/dist/schemas/bundled/apm.json +499 -734
- package/dist/schemas/bundled/application.json +735 -371
- package/dist/schemas/bundled/base.json +3 -220
- package/dist/schemas/bundled/business.json +452 -366
- package/dist/schemas/bundled/data-model.json +395 -411
- package/dist/schemas/bundled/data-store.json +334 -558
- package/dist/schemas/bundled/manifest.json +18 -18
- package/dist/schemas/bundled/motivation.json +349 -368
- package/dist/schemas/bundled/navigation.json +415 -731
- package/dist/schemas/bundled/product.json +325 -159
- package/dist/schemas/bundled/security.json +864 -1232
- package/dist/schemas/bundled/technology.json +574 -703
- package/dist/schemas/bundled/testing.json +718 -1643
- package/dist/schemas/bundled/ux.json +739 -1352
- package/dist/server/schemas.js +8 -0
- package/dist/server/schemas.js.map +2 -2
- package/dist/server/server.js +218 -34
- package/dist/server/server.js.map +2 -2
- package/dist/server-entry.js +2 -1
- package/dist/server-entry.js.map +2 -2
- package/dist/telemetry/index.js +1 -1
- package/dist/utils/ansi-suppressor.js +6 -8
- package/dist/utils/ansi-suppressor.js.map +2 -2
- package/dist/utils/attribute-patch.js +41 -0
- package/dist/utils/attribute-patch.js.map +7 -0
- package/dist/utils/error-hints.js +29 -0
- package/dist/utils/error-hints.js.map +7 -0
- package/dist/utils/errors.js +9 -3
- package/dist/utils/errors.js.map +2 -2
- package/dist/utils/project-paths.js +26 -1
- package/dist/utils/project-paths.js.map +2 -2
- package/dist/utils/source-reference.js +14 -12
- package/dist/utils/source-reference.js.map +2 -2
- package/dist/utils/spec-version.js +2 -2
- package/dist/utils/spec-version.js.map +1 -1
- package/dist/validators/composed-reference-validator.js +5 -27
- package/dist/validators/composed-reference-validator.js.map +2 -2
- package/dist/validators/reference-validator.js +0 -7
- package/dist/validators/reference-validator.js.map +2 -2
- package/dist/validators/relationship-schema-validator.js +3 -3
- package/dist/validators/relationship-schema-validator.js.map +2 -2
- package/dist/validators/schema-validator.js +27 -9
- package/dist/validators/schema-validator.js.map +2 -2
- package/dist/validators/types.js.map +1 -1
- package/dist/viewer/README.md +6 -6
- package/dist/viewer/assets/main-CxzcuU_o.js +84 -0
- package/dist/viewer/assets/main-j-7ULYpm.css +1 -0
- package/dist/viewer/index.html +2 -2
- package/dist/viewer/manifest.json +10 -10
- package/dist/viewer/version.json +1 -1
- package/package.json +2 -1
- package/dist/viewer/assets/main-B7AOQXXX.js +0 -81
- package/dist/viewer/assets/main-vdrFrG7q.css +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"specVersion": "0.
|
|
2
|
+
"specVersion": "0.11.0",
|
|
3
3
|
"layer": {
|
|
4
4
|
"id": "security",
|
|
5
5
|
"number": 4,
|
|
6
6
|
"name": "Security Layer",
|
|
7
|
-
"description": "
|
|
7
|
+
"description": "Defines how the system identifies, authorizes and protects: authentication configuration, roles, permissions, secure resources and their operations, access conditions and field-level controls, declarative policies and rules, data classification and rate limits, together with goal-oriented security concepts such as actors, objectives, delegations, threats, countermeasures and accountability (NIST SP 800-53 controls with STS-ml and XACML-style policy modelling). Code that checks identity or enforces permissions is evidence for elements here. Modelling rules: the security model composes its authentication configuration, constraints container and policies, and aggregates the shared elements (actors, roles, permissions, secure resources, information entities, delegations, threats, classifications and accountability requirements); a policy composes its rules, and a secure resource composes its operations and field access controls. Actors are assigned to roles, roles aggregate permissions and specialize a parent role, and permissions authorize resource operations; access follows that chain. An authentication configuration authenticates actors, uses its password policy and protects resources. A policy rule uses the conditions it evaluates, protects its target, authorizes permissions, triggers its policy actions and generates evidence; conditions and actions do not constrain or trigger on their own. Policies (security, password, retention and data classification) mandate the countermeasures they call for, and only countermeasures mitigate threats. A threat targets resources, information entities and business processes and services, influences classifications and policies, and references the motivation driver it gives rise to. Audit configurations, policy rules and delegations generate evidence; an audit configuration monitors resources and satisfies accountability requirements, and a retention policy governs the audit trails, evidence and information it keeps. A data classification governs the information entities, secure resources and retention policies it labels; field access controls are constrained by it, and data elements in other layers reference it. Separation of duty, binding of duty and need to know constrain roles, permissions and operations; the constraints container only groups them, and other layers link to the individual rule they follow. Validation rules constrain field values; they do not decide access.",
|
|
8
8
|
"inspired_by": {
|
|
9
9
|
"standard": "NIST SP 800-53",
|
|
10
10
|
"version": "5.1",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"accesscondition": {
|
|
47
47
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
48
48
|
"title": "AccessCondition",
|
|
49
|
-
"description": "
|
|
49
|
+
"description": "A single comparison predicate that tests one named request-context attribute (subject claim, resource property, environment value) against a literal or referenced value using one operator, and yields a denial message when false. It carries no effect of its own; it is evaluated as one term within a PolicyRule, ResourceOperation or InformationRight authorization check. Use Condition instead when the logic is a reusable, free-form or compound expression (time windows, combined attribute logic) rather than one field-operator-value test. Use PolicyRule instead when the unit carries a permit/deny effect or obligations, not just a boolean test. Use ValidationRule instead when the check enforces format, range or integrity of field data rather than deciding whether a principal may access something. Use InformationRight instead when the element grants named operations on an information entity to a specific actor, even if it embeds a constraint.",
|
|
50
50
|
"allOf": [
|
|
51
51
|
{
|
|
52
52
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -66,7 +66,8 @@
|
|
|
66
66
|
"type": "object",
|
|
67
67
|
"properties": {
|
|
68
68
|
"field": {
|
|
69
|
-
"type": "string"
|
|
69
|
+
"type": "string",
|
|
70
|
+
"description": "Dot-path name of the request-context attribute being tested (e.g. 'subject.role', 'resource.ownerId', 'env.ipAddress'), as it is resolved at evaluation time."
|
|
70
71
|
},
|
|
71
72
|
"operator": {
|
|
72
73
|
"type": "string",
|
|
@@ -83,25 +84,40 @@
|
|
|
83
84
|
"description": "Comparison operator applied to the field value, per XACML 3.0 match function semantics."
|
|
84
85
|
},
|
|
85
86
|
"value": {
|
|
86
|
-
"type": "string"
|
|
87
|
+
"type": "string",
|
|
88
|
+
"description": "Comparison operand as a string: a literal, a comma-separated list for 'in', a regex for 'matches', or a context reference such as '${subject.id}'. Leave empty only for operator 'exists'."
|
|
87
89
|
},
|
|
88
90
|
"message": {
|
|
89
|
-
"type": "string"
|
|
91
|
+
"type": "string",
|
|
92
|
+
"description": "Human-readable denial reason returned or logged when the predicate evaluates to false, e.g. 'Caller must belong to the resource tenant'."
|
|
90
93
|
},
|
|
91
94
|
"source": {
|
|
92
|
-
"type": "string"
|
|
95
|
+
"type": "string",
|
|
96
|
+
"description": "Where the field value is read from in the request context, such as 'token', 'header', 'path', 'query', 'body', 'session' or 'environment'. Set it so evaluators know which input to resolve."
|
|
93
97
|
}
|
|
94
98
|
},
|
|
95
99
|
"required": ["field", "operator", "value", "message", "source"],
|
|
96
100
|
"additionalProperties": false
|
|
97
101
|
}
|
|
98
102
|
},
|
|
103
|
+
"x-dr-standard": "NIST SP 800-53 AC-3 (Access Enforcement); XACML 3.0 Match element / NIST SP 800-162 ABAC attribute predicate",
|
|
104
|
+
"x-dr-evidence": [
|
|
105
|
+
"A guard clause in a handler or middleware that compares one request attribute to a value and throws or returns 403 with a message, e.g. if (req.user.tenantId !== resource.tenantId) throw new ForbiddenError('Tenant mismatch')",
|
|
106
|
+
"A declarative policy or config entry holding a field/operator/value triple, e.g. { attribute: 'token.scope', op: 'contains', value: 'orders:write' } in a Casbin, OPA input or custom rules file",
|
|
107
|
+
"A route or method annotation that asserts a single claim or attribute, e.g. @PreAuthorize(\"hasAuthority('SCOPE_read')\") or requireClaim('email_verified', true)"
|
|
108
|
+
],
|
|
109
|
+
"x-dr-distinguish": {
|
|
110
|
+
"security.condition": "the logic is a reusable, free-form or compound expression (time windows, combined attribute logic) rather than one field-operator-value test",
|
|
111
|
+
"security.policyrule": "the unit carries a permit/deny effect or obligations, not just a boolean test",
|
|
112
|
+
"security.validationrule": "the check enforces format, range or integrity of field data rather than deciding whether a principal may access something",
|
|
113
|
+
"security.informationright": "the element grants named operations on an information entity to a specific actor, even if it embeds a constraint"
|
|
114
|
+
},
|
|
99
115
|
"$id": "urn:dr:spec:node:security.accesscondition"
|
|
100
116
|
},
|
|
101
117
|
"accountabilityrequirement": {
|
|
102
118
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
103
119
|
"title": "AccountabilityRequirement",
|
|
104
|
-
"description": "
|
|
120
|
+
"description": "A security obligation stating that the performance of one named action on one named resource must be provably attributable to the actor who performed it. It records whether non-repudiation is mandatory, the purpose that justifies the obligation, and whether the resulting proof may be disputed. Use AuditConfig instead when the element specifies which events are logged, at what verbosity, and with which fields sanitized, rather than the obligation to prove that a particular action happened. Use Evidence instead when the element is the concrete proof artifact itself (a signature, hash, timestamp or audit-trail entry), not the requirement that such proof exist. Use NeedToKnow instead when the declared purpose is a precondition an actor must state before being granted access, rather than a justification attached to proving an action after it occurs. Use RetentionPolicy instead when the concern is how long the proof or logs are kept and how they are disposed of.",
|
|
105
121
|
"allOf": [
|
|
106
122
|
{
|
|
107
123
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -121,19 +137,24 @@
|
|
|
121
137
|
"type": "object",
|
|
122
138
|
"properties": {
|
|
123
139
|
"action": {
|
|
124
|
-
"type": "string"
|
|
140
|
+
"type": "string",
|
|
141
|
+
"description": "The operation whose occurrence must be provable, named as a verb or operation identifier (e.g. 'approve-payment', 'delete'), ideally matching a ResourceOperation's operation value."
|
|
125
142
|
},
|
|
126
143
|
"resource": {
|
|
127
|
-
"type": "string"
|
|
144
|
+
"type": "string",
|
|
145
|
+
"description": "Identifier of the secured resource or information entity on which the action is performed, matching a SecureResource resource name or InformationEntity name."
|
|
128
146
|
},
|
|
129
147
|
"nonRepudiation": {
|
|
130
|
-
"type": "boolean"
|
|
148
|
+
"type": "boolean",
|
|
149
|
+
"description": "True when the actor must be unable to deny having performed the action, requiring strong or cryptographic evidence such as a digital signature. False when attributable logging alone suffices."
|
|
131
150
|
},
|
|
132
151
|
"purposeDeclaration": {
|
|
133
|
-
"type": "string"
|
|
152
|
+
"type": "string",
|
|
153
|
+
"description": "A free-text statement of the business, legal or regulatory reason the action must be provable (e.g. 'SOX approval trail', 'GDPR consent record'). Set it from the governing requirement."
|
|
134
154
|
},
|
|
135
155
|
"challengeable": {
|
|
136
|
-
"type": "boolean"
|
|
156
|
+
"type": "boolean",
|
|
157
|
+
"description": "True when the acting party or a third party may formally dispute the recorded proof through a defined process. False when the evidence is treated as final once recorded."
|
|
137
158
|
}
|
|
138
159
|
},
|
|
139
160
|
"required": [
|
|
@@ -146,12 +167,24 @@
|
|
|
146
167
|
"additionalProperties": false
|
|
147
168
|
}
|
|
148
169
|
},
|
|
170
|
+
"x-dr-standard": "NIST SP 800-53 AU-10 Non-repudiation",
|
|
171
|
+
"x-dr-evidence": [
|
|
172
|
+
"A sensitive operation, such as payment approval, contract acceptance or record deletion, that signs a payload with the acting user's key or a server HSM and persists the signer ID, signature and timestamp alongside the record.",
|
|
173
|
+
"An append-only or write-once audit table, ledger, or hash-chained log that the code requires for a specific action-resource pair, often with a mandatory 'reason' or 'justification' field captured from the user.",
|
|
174
|
+
"Compliance or control-mapping documentation (SSP, control matrix, ADR) that cites AU-10 or 'non-repudiation' for a named action, or a dispute/chargeback workflow that retrieves the stored proof of that action."
|
|
175
|
+
],
|
|
176
|
+
"x-dr-distinguish": {
|
|
177
|
+
"security.auditconfig": "the element specifies which events are logged, at what verbosity, and with which fields sanitized, rather than the obligation to prove that a particular action happened.",
|
|
178
|
+
"security.evidence": "the element is the concrete proof artifact itself (a signature, hash, timestamp or audit-trail entry), not the requirement that such proof exist.",
|
|
179
|
+
"security.needtoknow": "the declared purpose is a precondition an actor must state before being granted access, rather than a justification attached to proving an action after it occurs.",
|
|
180
|
+
"security.retentionpolicy": "the concern is how long the proof or logs are kept and how they are disposed of."
|
|
181
|
+
},
|
|
149
182
|
"$id": "urn:dr:spec:node:security.accountabilityrequirement"
|
|
150
183
|
},
|
|
151
184
|
"actor": {
|
|
152
185
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
153
186
|
"title": "Actor",
|
|
154
|
-
"description": "A named principal
|
|
187
|
+
"description": "A named principal (a human user population, service account, automated system, or external party) that is the subject of authentication and authorization decisions, typed by category and optionally assigned a trust level. It represents who acts, as distinct from the permission bundle it holds or the authority it receives temporarily. Use Role instead when the element is a named bundle of permissions that many principals can be assigned, such as 'admin' or 'editor', rather than the principal itself. Use Delegation instead when the element records a transfer of authority from one principal to another, with a scope or expiry, rather than the principal that delegates or receives it. Use AuthenticationConfig instead when the element describes how principals prove identity, such as the provider, MFA or session timeout, rather than who is being identified. Use Threat instead when the element models an adversary or attack scenario with a likelihood and impact, rather than a legitimate principal that the system recognises and authorizes.",
|
|
155
188
|
"allOf": [
|
|
156
189
|
{
|
|
157
190
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -176,7 +209,8 @@
|
|
|
176
209
|
"description": "Category of actor, per NIST AC-2 (Account Management) subject classification."
|
|
177
210
|
},
|
|
178
211
|
"description": {
|
|
179
|
-
"type": "string"
|
|
212
|
+
"type": "string",
|
|
213
|
+
"description": "Free-text summary of who or what this actor represents, for example 'nightly billing batch job' or 'external payment partner'. Set it whenever the actor's name alone does not make its identity source or purpose clear."
|
|
180
214
|
},
|
|
181
215
|
"trustLevel": {
|
|
182
216
|
"type": "string",
|
|
@@ -196,12 +230,24 @@
|
|
|
196
230
|
"additionalProperties": false
|
|
197
231
|
}
|
|
198
232
|
},
|
|
233
|
+
"x-dr-standard": "NIST SP 800-53 AC-2 (Account Management); NIST SP 800-207 subject/principal",
|
|
234
|
+
"x-dr-evidence": [
|
|
235
|
+
"A principal or user-context class (e.g. UserPrincipal, ServiceIdentity) populated from a verified token and passed to authorization checks.",
|
|
236
|
+
"Declared service accounts or machine identities in configuration, such as a Kubernetes ServiceAccount, cloud IAM users or roles for workloads, or OAuth client_credentials client registrations.",
|
|
237
|
+
"Branching in authorization code on the principal's kind or trust level, such as `if principal.type == 'service'` or checks on an `is_internal` or `partner` flag."
|
|
238
|
+
],
|
|
239
|
+
"x-dr-distinguish": {
|
|
240
|
+
"security.role": "the element is a named bundle of permissions that many principals can be assigned, such as 'admin' or 'editor', rather than the principal itself.",
|
|
241
|
+
"security.delegation": "the element records a transfer of authority from one principal to another, with a scope or expiry, rather than the principal that delegates or receives it.",
|
|
242
|
+
"security.authenticationconfig": "the element describes how principals prove identity, such as the provider, MFA or session timeout, rather than who is being identified.",
|
|
243
|
+
"security.threat": "the element models an adversary or attack scenario with a likelihood and impact, rather than a legitimate principal that the system recognises and authorizes."
|
|
244
|
+
},
|
|
199
245
|
"$id": "urn:dr:spec:node:security.actor"
|
|
200
246
|
},
|
|
201
247
|
"auditconfig": {
|
|
202
248
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
203
249
|
"title": "AuditConfig",
|
|
204
|
-
"description": "
|
|
250
|
+
"description": "A logging configuration that determines which security-relevant events on protected resources or operations are written to an audit trail, at what verbosity, and which request elements (payload, headers) are captured or sanitized before recording. It covers audit record generation and content only. How long records are kept and how they are disposed of belong to RetentionPolicy. Use RetentionPolicy instead when the code or config specifies how long audit or access records are kept, where they are archived, or how they are securely deleted, rather than what is captured. Use AccountabilityRequirement instead when the artifact states an obligation that a party must be able to prove an action occurred (non-repudiation, challengeability), independent of the logging mechanism. Use Evidence instead when the symbol is a produced artifact, such as a log entry, signature, hash or timestamp, rather than the configuration that causes such artifacts to be generated. Use PolicyAction instead when logging is a one-off enforcement response (type 'log' or 'alert') fired by a specific policy rule match, rather than a standing capture configuration for a resource or operation.",
|
|
205
251
|
"allOf": [
|
|
206
252
|
{
|
|
207
253
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -221,7 +267,8 @@
|
|
|
221
267
|
"type": "object",
|
|
222
268
|
"properties": {
|
|
223
269
|
"enabled": {
|
|
224
|
-
"type": "boolean"
|
|
270
|
+
"type": "boolean",
|
|
271
|
+
"description": "Whether audit capture is active for the governed resources or operations; set false to model a defined but switched-off audit configuration (defaults to true when omitted)."
|
|
225
272
|
},
|
|
226
273
|
"level": {
|
|
227
274
|
"type": "string",
|
|
@@ -229,13 +276,16 @@
|
|
|
229
276
|
"description": "Verbosity of audit event capture, from no logging to full payload-level tracing, per NIST SP 800-53 AU-2 Event Logging."
|
|
230
277
|
},
|
|
231
278
|
"includePayload": {
|
|
232
|
-
"type": "boolean"
|
|
279
|
+
"type": "boolean",
|
|
280
|
+
"description": "Whether request and response bodies are recorded in audit entries; set true only when forensic needs justify capturing body content, after applying sanitizeFields."
|
|
233
281
|
},
|
|
234
282
|
"includeHeaders": {
|
|
235
|
-
"type": "boolean"
|
|
283
|
+
"type": "boolean",
|
|
284
|
+
"description": "Whether HTTP or message headers are recorded in audit entries; set true when headers such as client IP, user agent or correlation IDs are needed, with credentials redacted via sanitizeFields."
|
|
236
285
|
},
|
|
237
286
|
"sanitizeFields": {
|
|
238
|
-
"type": "string"
|
|
287
|
+
"type": "string",
|
|
288
|
+
"description": "Comma-separated list of field names or JSON paths (e.g. 'password,authorization,card.number') whose values are redacted or masked before an audit entry is written; use an empty string when nothing is sanitized."
|
|
239
289
|
},
|
|
240
290
|
"source": {
|
|
241
291
|
"type": "object",
|
|
@@ -246,12 +296,24 @@
|
|
|
246
296
|
"additionalProperties": false
|
|
247
297
|
}
|
|
248
298
|
},
|
|
299
|
+
"x-dr-standard": "NIST SP 800-53 AU-2 Event Logging, AU-3 Content of Audit Records, AU-12 Audit Record Generation",
|
|
300
|
+
"x-dr-evidence": [
|
|
301
|
+
"Audit middleware, interceptor or filter registered on a router or service, configured with options such as level, includeBody/includeHeaders and a redact or mask field list.",
|
|
302
|
+
"Decorators or annotations such as @Audited, @Auditable or auditlog.register(Model) attached to handlers or entities, optionally with parameters controlling captured detail.",
|
|
303
|
+
"A configuration block named audit/auditLog (YAML, JSON, env vars) with keys like enabled, level, logRequestBody and sensitiveFields, distinct from general application logging settings."
|
|
304
|
+
],
|
|
305
|
+
"x-dr-distinguish": {
|
|
306
|
+
"security.retentionpolicy": "the code or config specifies how long audit or access records are kept, where they are archived, or how they are securely deleted, rather than what is captured.",
|
|
307
|
+
"security.accountabilityrequirement": "the artifact states an obligation that a party must be able to prove an action occurred (non-repudiation, challengeability), independent of the logging mechanism.",
|
|
308
|
+
"security.evidence": "the symbol is a produced artifact, such as a log entry, signature, hash or timestamp, rather than the configuration that causes such artifacts to be generated.",
|
|
309
|
+
"security.policyaction": "logging is a one-off enforcement response (type 'log' or 'alert') fired by a specific policy rule match, rather than a standing capture configuration for a resource or operation."
|
|
310
|
+
},
|
|
249
311
|
"$id": "urn:dr:spec:node:security.auditconfig"
|
|
250
312
|
},
|
|
251
313
|
"authenticationconfig": {
|
|
252
314
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
253
315
|
"title": "AuthenticationConfig",
|
|
254
|
-
"description": "
|
|
316
|
+
"description": "A configuration element that fixes, for one application or service, the mechanism by which principals prove their identity: the authentication protocol or identity provider, whether a second factor is required, how long an authenticated session remains valid, and which credential policy applies. It describes identity verification only, not what an authenticated principal may do afterwards. Use PasswordPolicy instead when the element only specifies credential complexity, rotation, reuse or lockout rules rather than the provider, MFA and session settings of the login mechanism. Use Actor instead when the element is the principal being authenticated (user, service account, external system) rather than the mechanism that verifies it. Use SecurityPolicy instead when the element is a prioritized set of rules deciding access to targeted resources after identity is established, rather than how identity is established. Use Permission instead when the code checks whether an already-identified principal may perform an action on a resource (authorization) rather than verifying who the principal is.",
|
|
255
317
|
"allOf": [
|
|
256
318
|
{
|
|
257
319
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -288,13 +350,16 @@
|
|
|
288
350
|
"description": "Identity Assurance Level, per NIST SP 800-63A: IAL1 (self-asserted), IAL2 (remote identity proofing), IAL3 (in-person proofing)."
|
|
289
351
|
},
|
|
290
352
|
"sessionTimeout": {
|
|
291
|
-
"type": "integer"
|
|
353
|
+
"type": "integer",
|
|
354
|
+
"description": "Maximum lifetime of an authenticated session in seconds before the principal must re-authenticate (IA-11). Set it from the configured session max-age or access-token expiry."
|
|
292
355
|
},
|
|
293
356
|
"mfaRequired": {
|
|
294
|
-
"type": "boolean"
|
|
357
|
+
"type": "boolean",
|
|
358
|
+
"description": "True when principals must present a second authentication factor (TOTP, WebAuthn, SMS, push) in addition to the primary credential (IA-2(1)/(2)). Set it false or omit it when MFA is optional or absent."
|
|
295
359
|
},
|
|
296
360
|
"passwordPolicy": {
|
|
297
|
-
"type": "string"
|
|
361
|
+
"type": "string",
|
|
362
|
+
"description": "Identifier of the security.passwordpolicy node governing credentials for this configuration. Set it only when the provider uses locally managed passwords, typically provider 'local' or 'ldap'."
|
|
298
363
|
},
|
|
299
364
|
"source": {
|
|
300
365
|
"type": "object",
|
|
@@ -305,12 +370,24 @@
|
|
|
305
370
|
"additionalProperties": false
|
|
306
371
|
}
|
|
307
372
|
},
|
|
373
|
+
"x-dr-standard": "NIST SP 800-53 IA-2 (Identification and Authentication), IA-5 (Authenticator Management), IA-11 (Re-authentication)",
|
|
374
|
+
"x-dr-evidence": [
|
|
375
|
+
"Authentication middleware or framework setup, e.g. passport.use(new OIDCStrategy(...)), Spring Security oauth2Login()/saml2Login(), or NextAuth providers array, with issuer, client ID and callback URLs.",
|
|
376
|
+
"Configuration files or environment variables declaring identity-provider settings such as OIDC_ISSUER_URL, SAML metadata URL, LDAP bind DN, or JWT issuer/audience and signing keys.",
|
|
377
|
+
"Session or token lifetime settings alongside MFA enforcement, e.g. SESSION_MAX_AGE, JWT expiresIn, refresh-token TTL, or an 'mfa: required' / TOTP or WebAuthn enrollment flag in auth config."
|
|
378
|
+
],
|
|
379
|
+
"x-dr-distinguish": {
|
|
380
|
+
"security.passwordpolicy": "the element only specifies credential complexity, rotation, reuse or lockout rules rather than the provider, MFA and session settings of the login mechanism.",
|
|
381
|
+
"security.actor": "the element is the principal being authenticated (user, service account, external system) rather than the mechanism that verifies it.",
|
|
382
|
+
"security.securitypolicy": "the element is a prioritized set of rules deciding access to targeted resources after identity is established, rather than how identity is established.",
|
|
383
|
+
"security.permission": "the code checks whether an already-identified principal may perform an action on a resource (authorization) rather than verifying who the principal is."
|
|
384
|
+
},
|
|
308
385
|
"$id": "urn:dr:spec:node:security.authenticationconfig"
|
|
309
386
|
},
|
|
310
387
|
"bindingofduty": {
|
|
311
388
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
312
389
|
"title": "BindingOfDuty",
|
|
313
|
-
"description": "
|
|
390
|
+
"description": "A procedural access constraint requiring that the actor who performs one step of a multi-step task or workflow also performs its designated follow-on steps, so that any attempt by a different actor to continue or complete that task instance is rejected. Use SeparationOfDuty instead when the rule requires that two steps be performed by different actors or roles, rather than by the same actor. Use AccessCondition instead when the check is a standalone predicate on a single request (e.g. resource.ownerId eq currentUser) with no link to a task instance the actor started. Use NeedToKnow instead when access is restricted according to the actor's declared purpose rather than its participation in an earlier workflow step. Use PolicyRule instead when the logic is a general condition-plus-effect rule in a policy rather than a task-continuity obligation tied to workflow steps.",
|
|
314
391
|
"allOf": [
|
|
315
392
|
{
|
|
316
393
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -330,10 +407,12 @@
|
|
|
330
407
|
"type": "object",
|
|
331
408
|
"properties": {
|
|
332
409
|
"description": {
|
|
333
|
-
"type": "string"
|
|
410
|
+
"type": "string",
|
|
411
|
+
"description": "Free-text explanation of which task steps are bound together and why the same actor must perform them; set it whenever the bound steps are not obvious from the element name."
|
|
334
412
|
},
|
|
335
413
|
"message": {
|
|
336
|
-
"type": "string"
|
|
414
|
+
"type": "string",
|
|
415
|
+
"description": "The human-readable error or log message emitted when a different actor attempts to continue or complete the bound task, taken verbatim from the code where one exists."
|
|
337
416
|
},
|
|
338
417
|
"scope": {
|
|
339
418
|
"type": "string",
|
|
@@ -344,12 +423,24 @@
|
|
|
344
423
|
"additionalProperties": false
|
|
345
424
|
}
|
|
346
425
|
},
|
|
426
|
+
"x-dr-standard": "STS-ml Binding of Duties (BoD) organizational constraint; complements NIST SP 800-53 AC-5 Separation of Duties",
|
|
427
|
+
"x-dr-evidence": [
|
|
428
|
+
"a workflow or state-machine transition guard that compares the stored initiator, claimant or assignee of a task instance (e.g. startedBy, claimedBy) with the current user id and throws or returns 403 when they differ",
|
|
429
|
+
"BPMN/Camunda or similar workflow configuration that assigns a later user task to the process initiator (e.g. assignee=\"${initiator}\") or locks a claimed task to a single user until completion",
|
|
430
|
+
"a dedicated exception or error message such as 'Only the user who started this request may submit it' or a class named like TaskOwnershipViolation or SameUserRequired raised in multi-step flows"
|
|
431
|
+
],
|
|
432
|
+
"x-dr-distinguish": {
|
|
433
|
+
"security.separationofduty": "the rule requires that two steps be performed by different actors or roles, rather than by the same actor.",
|
|
434
|
+
"security.accesscondition": "the check is a standalone predicate on a single request (e.g. resource.ownerId eq currentUser) with no link to a task instance the actor started.",
|
|
435
|
+
"security.needtoknow": "access is restricted according to the actor's declared purpose rather than its participation in an earlier workflow step.",
|
|
436
|
+
"security.policyrule": "the logic is a general condition-plus-effect rule in a policy rather than a task-continuity obligation tied to workflow steps."
|
|
437
|
+
},
|
|
347
438
|
"$id": "urn:dr:spec:node:security.bindingofduty"
|
|
348
439
|
},
|
|
349
440
|
"condition": {
|
|
350
441
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
351
442
|
"title": "Condition",
|
|
352
|
-
"description": "A reusable
|
|
443
|
+
"description": "A named, reusable boolean expression over request context (time, location, subject attributes, environment or resource state) that is defined once and referenced by one or more PolicyRules or SecurityPolicies to decide whether they apply. It may be a free-form expression or a composition of AccessCondition predicates. Use AccessCondition instead when the predicate is a single concrete field + operator + value comparison written inline in one rule's condition chain rather than a named expression reused across rules. Use PolicyRule instead when the element carries an effect (permit/deny) and enforcement outcome, not just the applicability test. Use InformationRight instead when the constraint expression is bound to a specific actor and the operations they may perform on an InformationEntity. Use PolicyAction instead when the element describes what happens after a match (deny, alert, mask, redirect) rather than the test that produces the match.",
|
|
353
444
|
"allOf": [
|
|
354
445
|
{
|
|
355
446
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -369,10 +460,12 @@
|
|
|
369
460
|
"type": "object",
|
|
370
461
|
"properties": {
|
|
371
462
|
"expression": {
|
|
372
|
-
"type": "string"
|
|
463
|
+
"type": "string",
|
|
464
|
+
"description": "The boolean expression text in its source language (e.g. SpEL, CEL, Rego, IAM condition JSON, or pseudocode such as 'request.time between 08:00 and 18:00'). Always set this; copy it verbatim from code where possible."
|
|
373
465
|
},
|
|
374
466
|
"description": {
|
|
375
|
-
"type": "string"
|
|
467
|
+
"type": "string",
|
|
468
|
+
"description": "A plain-language sentence stating what the condition tests and why policies reference it. Set it when the expression is not self-explanatory to a reviewer."
|
|
376
469
|
},
|
|
377
470
|
"operator": {
|
|
378
471
|
"type": "string",
|
|
@@ -393,12 +486,24 @@
|
|
|
393
486
|
"additionalProperties": false
|
|
394
487
|
}
|
|
395
488
|
},
|
|
489
|
+
"x-dr-standard": "XACML 3.0 §5.26 Condition element; NIST SP 800-162 ABAC environment conditions (supports NIST SP 800-53 AC-3)",
|
|
490
|
+
"x-dr-evidence": [
|
|
491
|
+
"A named predicate function or helper rule (e.g. isBusinessHours(ctx), fromTrustedNetwork(req), rego `allow_if_mfa` helper) referenced by several authorization rules",
|
|
492
|
+
"A Condition block in a policy document (AWS IAM `Condition`, Azure ABAC condition, Cedar `when` clause) defined once and reused by multiple statements",
|
|
493
|
+
"A Spring Security SpEL expression or CEL/OPA expression string stored in config and referenced by name from @PreAuthorize annotations or policy rule entries"
|
|
494
|
+
],
|
|
495
|
+
"x-dr-distinguish": {
|
|
496
|
+
"security.accesscondition": "the predicate is a single concrete field + operator + value comparison written inline in one rule's condition chain rather than a named expression reused across rules.",
|
|
497
|
+
"security.policyrule": "the element carries an effect (permit/deny) and enforcement outcome, not just the applicability test.",
|
|
498
|
+
"security.informationright": "the constraint expression is bound to a specific actor and the operations they may perform on an InformationEntity.",
|
|
499
|
+
"security.policyaction": "the element describes what happens after a match (deny, alert, mask, redirect) rather than the test that produces the match."
|
|
500
|
+
},
|
|
396
501
|
"$id": "urn:dr:spec:node:security.condition"
|
|
397
502
|
},
|
|
398
503
|
"countermeasure": {
|
|
399
504
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
400
505
|
"title": "Countermeasure",
|
|
401
|
-
"description": "A security control or mitigation
|
|
506
|
+
"description": "A security control or mitigation mechanism, recorded against one or more identified Threats, that reduces their likelihood or impact and is characterised by control class, implementation status and assessed effectiveness. It is the threat-mitigation view of a control; the concrete configuration that realises it (password rules, auth settings, rate limits) is modelled by other types that realize or mandate it. Use SecurityPolicy instead when the element is a named, prioritised set of evaluation rules that produces access-control decisions for a target, rather than a mitigation linked to a threat. Use PolicyAction instead when the element is the runtime response (deny, alert, mask, quarantine) executed when a specific policy rule fires, not the standing control that the response helps realise. Use PasswordPolicy instead when the element is the concrete credential complexity, rotation and lockout parameters; model the anti-brute-force mitigation those parameters deliver as a Countermeasure. Use Threat instead when the element describes what could go wrong (attacker, vulnerability, likelihood, impact) rather than the measure taken against it.",
|
|
402
507
|
"allOf": [
|
|
403
508
|
{
|
|
404
509
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -423,7 +528,8 @@
|
|
|
423
528
|
"description": "NIST SP 800-53 control family classification: technical (hardware/software mechanisms), operational (people and procedures), management (governance), or physical (facility/environmental)."
|
|
424
529
|
},
|
|
425
530
|
"description": {
|
|
426
|
-
"type": "string"
|
|
531
|
+
"type": "string",
|
|
532
|
+
"description": "Free-text explanation of what the control does, which mechanism or procedure realises it, and which threat behaviour it counters; set whenever the name alone does not identify the mechanism."
|
|
427
533
|
},
|
|
428
534
|
"effectiveness": {
|
|
429
535
|
"type": "string",
|
|
@@ -431,7 +537,8 @@
|
|
|
431
537
|
"description": "Assessed effectiveness of the countermeasure in reducing threat risk, per NIST SP 800-30 risk treatment evaluation."
|
|
432
538
|
},
|
|
433
539
|
"implemented": {
|
|
434
|
-
"type": "boolean"
|
|
540
|
+
"type": "boolean",
|
|
541
|
+
"description": "True when the control is deployed and active in the system under model, false when it is planned, proposed or only documented; set from evidence such as deployed config or code, not from intent."
|
|
435
542
|
},
|
|
436
543
|
"source": {
|
|
437
544
|
"type": "object",
|
|
@@ -442,12 +549,24 @@
|
|
|
442
549
|
"additionalProperties": false
|
|
443
550
|
}
|
|
444
551
|
},
|
|
552
|
+
"x-dr-standard": "NIST SP 800-53 Rev. 5 security and privacy controls (as risk responses per NIST SP 800-30 Rev. 1 / SP 800-39)",
|
|
553
|
+
"x-dr-evidence": [
|
|
554
|
+
"a threat-model artifact (STRIDE/LINDDUN table, OWASP Threat Dragon or MS TMT file) whose 'mitigation' or 'countermeasure' entries name a control against a listed threat",
|
|
555
|
+
"security middleware or filters registered globally (e.g. helmet, CSRF token filter, input sanitiser, WAF rule set) with comments or config referencing a CWE, OWASP Top 10 item or NIST control ID",
|
|
556
|
+
"a control-implementation record such as an OSCAL component-definition, system security plan or compliance matrix mapping control IDs (e.g. SC-8, SI-10) to an implementation status"
|
|
557
|
+
],
|
|
558
|
+
"x-dr-distinguish": {
|
|
559
|
+
"security.securitypolicy": "the element is a named, prioritised set of evaluation rules that produces access-control decisions for a target, rather than a mitigation linked to a threat",
|
|
560
|
+
"security.policyaction": "the element is the runtime response (deny, alert, mask, quarantine) executed when a specific policy rule fires, not the standing control that the response helps realise",
|
|
561
|
+
"security.passwordpolicy": "the element is the concrete credential complexity, rotation and lockout parameters; model the anti-brute-force mitigation those parameters deliver as a Countermeasure",
|
|
562
|
+
"security.threat": "the element describes what could go wrong (attacker, vulnerability, likelihood, impact) rather than the measure taken against it"
|
|
563
|
+
},
|
|
445
564
|
"$id": "urn:dr:spec:node:security.countermeasure"
|
|
446
565
|
},
|
|
447
566
|
"dataclassification": {
|
|
448
567
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
449
568
|
"title": "DataClassification",
|
|
450
|
-
"description": "
|
|
569
|
+
"description": "A labelled data-sensitivity tier that assigns a classification level to data and states the minimum protection obligations, such as encryption, that any data carrying that label must meet. It is the label and its handling rules, not the data asset, field or store being labelled. Use InformationEntity instead when the element is the named information asset (e.g. customer PII, payment records) that receives a classification, rather than the classification tier and its handling rules. Use FieldAccessControl instead when the element specifies how one particular field is masked, redacted or tokenized for unauthorized principals, rather than a sensitivity tier applied across many fields. Use RetentionPolicy instead when the element defines how long data is kept and how it is disposed of, even if that period is selected by classification level. Use SecurityPolicy instead when the element is a prioritized set of evaluation rules producing access decisions, rather than a sensitivity label those rules may reference.",
|
|
451
570
|
"allOf": [
|
|
452
571
|
{
|
|
453
572
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -467,7 +586,8 @@
|
|
|
467
586
|
"type": "object",
|
|
468
587
|
"properties": {
|
|
469
588
|
"version": {
|
|
470
|
-
"type": "string"
|
|
589
|
+
"type": "string",
|
|
590
|
+
"description": "Version identifier of this classification definition, as semver or an ISO 8601 date; set it when the tier's handling rules are revised so that labelled data can be traced to the rules in force at the time."
|
|
471
591
|
},
|
|
472
592
|
"encryptionRequirement": {
|
|
473
593
|
"type": "string",
|
|
@@ -495,12 +615,24 @@
|
|
|
495
615
|
"additionalProperties": false
|
|
496
616
|
}
|
|
497
617
|
},
|
|
618
|
+
"x-dr-standard": "NIST SP 800-53 RA-2 Security Categorization (FIPS 199 impact levels), with SC-8/SC-28 protection obligations",
|
|
619
|
+
"x-dr-evidence": [
|
|
620
|
+
"an enum or constant set of sensitivity labels (e.g. PUBLIC, INTERNAL, CONFIDENTIAL, RESTRICTED) referenced by annotations, schema tags or column metadata such as @Sensitive(level=...) or x-data-classification",
|
|
621
|
+
"a configuration map or policy file keyed by classification label that sets handling requirements, e.g. 'restricted: encrypt at-rest with KMS key, TLS required, no export'",
|
|
622
|
+
"a data-handling or data-classification policy document or data-catalog taxonomy that defines each sensitivity tier and its required controls"
|
|
623
|
+
],
|
|
624
|
+
"x-dr-distinguish": {
|
|
625
|
+
"security.informationentity": "the element is the named information asset (e.g. customer PII, payment records) that receives a classification, rather than the classification tier and its handling rules.",
|
|
626
|
+
"security.fieldaccesscontrol": "the element specifies how one particular field is masked, redacted or tokenized for unauthorized principals, rather than a sensitivity tier applied across many fields.",
|
|
627
|
+
"security.retentionpolicy": "the element defines how long data is kept and how it is disposed of, even if that period is selected by classification level.",
|
|
628
|
+
"security.securitypolicy": "the element is a prioritized set of evaluation rules producing access decisions, rather than a sensitivity label those rules may reference."
|
|
629
|
+
},
|
|
498
630
|
"$id": "urn:dr:spec:node:security.dataclassification"
|
|
499
631
|
},
|
|
500
632
|
"delegation": {
|
|
501
633
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
502
634
|
"title": "Delegation",
|
|
503
|
-
"description": "
|
|
635
|
+
"description": "An authority grant record in which one named actor (the delegator) transfers some or all of its own permissions or role to another actor (the delegatee), qualified by a delegation type and optionally an expiry. It differs from a role assignment or a standing permission in that the authority is derived from, and revocable by, the delegating actor rather than granted directly by administration. Use Role instead when the authority is a standing, administratively assigned collection of permissions rather than one actor passing its own authority to another. Use Permission instead when you are modelling the atomic action-on-resource grant itself, not the act of handing it from one actor to another. Use InformationRight instead when the grant is an ABAC rule giving an actor operations on an InformationEntity under a constraint expression, with no delegating party. Use Actor instead when the symbol represents the principal (user, service account) itself rather than the transfer of authority between principals.",
|
|
504
636
|
"allOf": [
|
|
505
637
|
{
|
|
506
638
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -520,10 +652,12 @@
|
|
|
520
652
|
"type": "object",
|
|
521
653
|
"properties": {
|
|
522
654
|
"delegator": {
|
|
523
|
-
"type": "string"
|
|
655
|
+
"type": "string",
|
|
656
|
+
"description": "Identifier of the security.actor granting its authority; set to the actor whose permissions or role are being transferred, and that actor must hold that authority itself."
|
|
524
657
|
},
|
|
525
658
|
"delegatee": {
|
|
526
|
-
"type": "string"
|
|
659
|
+
"type": "string",
|
|
660
|
+
"description": "Identifier of the security.actor receiving the delegated authority; set to the principal who will act on the delegator's behalf."
|
|
527
661
|
},
|
|
528
662
|
"delegationType": {
|
|
529
663
|
"type": "string",
|
|
@@ -541,19 +675,32 @@
|
|
|
541
675
|
"description": "ISO 8601 datetime after which this delegation automatically expires. Required for delegationType 'temporary' and recommended for 'conditional' to enforce time-bounded privilege grants per AC-6."
|
|
542
676
|
},
|
|
543
677
|
"description": {
|
|
544
|
-
"type": "string"
|
|
678
|
+
"type": "string",
|
|
679
|
+
"description": "Free-text explanation of what authority is delegated, for what purpose, and any scope limits not captured by delegationType or validUntil."
|
|
545
680
|
}
|
|
546
681
|
},
|
|
547
682
|
"required": ["delegator", "delegatee", "delegationType"],
|
|
548
683
|
"additionalProperties": false
|
|
549
684
|
}
|
|
550
685
|
},
|
|
686
|
+
"x-dr-standard": "NIST SP 800-53 AC-6 (Least Privilege); NIST SP 800-162 delegation of attributes; OAuth 2.0 Token Exchange (RFC 8693) act/may_act delegation",
|
|
687
|
+
"x-dr-evidence": [
|
|
688
|
+
"A persisted entity or table such as Delegation, ProxyAssignment or ActingAs with columns like delegator_id, delegatee_id, scope and expires_at",
|
|
689
|
+
"An OAuth 2.0 token-exchange or impersonation flow (e.g. RFC 8693 'act' claim, 'on_behalf_of' or 'impersonate' endpoint) that issues a token for one principal acting for another",
|
|
690
|
+
"Authorization middleware that, when checking permissions, merges in roles from active, unexpired delegation records granted to the current user and logs the delegation in the audit trail"
|
|
691
|
+
],
|
|
692
|
+
"x-dr-distinguish": {
|
|
693
|
+
"security.role": "the authority is a standing, administratively assigned collection of permissions rather than one actor passing its own authority to another.",
|
|
694
|
+
"security.permission": "you are modelling the atomic action-on-resource grant itself, not the act of handing it from one actor to another.",
|
|
695
|
+
"security.informationright": "the grant is an ABAC rule giving an actor operations on an InformationEntity under a constraint expression, with no delegating party.",
|
|
696
|
+
"security.actor": "the symbol represents the principal (user, service account) itself rather than the transfer of authority between principals."
|
|
697
|
+
},
|
|
551
698
|
"$id": "urn:dr:spec:node:security.delegation"
|
|
552
699
|
},
|
|
553
700
|
"evidence": {
|
|
554
701
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
555
702
|
"title": "Evidence",
|
|
556
|
-
"description": "
|
|
703
|
+
"description": "A kind of proof artifact — log record, digital signature, trusted timestamp, hash, certificate or audit trail — produced or retained by the system so that a specific action or event can later be verified as having occurred and attributed to an actor. It is the artifact itself as a modelled category, not the obligation to produce it or the logging configuration that emits it. Use AuditConfig instead when the code configures which events are logged, verbosity, payload inclusion or field sanitisation rather than defining a specific proof artifact and its origin. Use AccountabilityRequirement instead when the element states who must prove an action took place and whether that proof is challengeable, rather than the artifact that constitutes the proof. Use RetentionPolicy instead when the concern is how long evidence or logs are kept, where they are archived and how they are destroyed. Use Countermeasure instead when the element is a control such as signing middleware or a tamper-detection mechanism that mitigates a threat, rather than the record it produces.",
|
|
557
704
|
"allOf": [
|
|
558
705
|
{
|
|
559
706
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -598,12 +745,24 @@
|
|
|
598
745
|
"additionalProperties": false
|
|
599
746
|
}
|
|
600
747
|
},
|
|
748
|
+
"x-dr-standard": "NIST SP 800-53 AU-10 Non-repudiation (with AU-3 Content of Audit Records)",
|
|
749
|
+
"x-dr-evidence": [
|
|
750
|
+
"code that computes and persists a digital signature or HMAC over a transaction or request payload alongside the record (e.g. a signature column, JWS detached signature, or signed receipt object)",
|
|
751
|
+
"an append-only or hash-chained audit trail table, WORM bucket or ledger write (e.g. an audit_events table with previous_hash, AWS QLDB, S3 Object Lock) recording actor, action and timestamp",
|
|
752
|
+
"calls to an RFC 3161 timestamping authority or certificate-based signing service (e.g. TSA client, KMS Sign API, X.509 cert attached to a document approval)"
|
|
753
|
+
],
|
|
754
|
+
"x-dr-distinguish": {
|
|
755
|
+
"security.auditconfig": "the code configures which events are logged, verbosity, payload inclusion or field sanitisation rather than defining a specific proof artifact and its origin",
|
|
756
|
+
"security.accountabilityrequirement": "the element states who must prove an action took place and whether that proof is challengeable, rather than the artifact that constitutes the proof",
|
|
757
|
+
"security.retentionpolicy": "the concern is how long evidence or logs are kept, where they are archived and how they are destroyed",
|
|
758
|
+
"security.countermeasure": "the element is a control such as signing middleware or a tamper-detection mechanism that mitigates a threat, rather than the record it produces"
|
|
759
|
+
},
|
|
601
760
|
"$id": "urn:dr:spec:node:security.evidence"
|
|
602
761
|
},
|
|
603
762
|
"fieldaccesscontrol": {
|
|
604
763
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
605
764
|
"title": "FieldAccessControl",
|
|
606
|
-
"description": "
|
|
765
|
+
"description": "A field-level protection rule bound to one named field (property, column or attribute) of a SecureResource. It states how that field's value is masked, redacted, hashed, tokenized or truncated when the field is exposed to a principal that lacks the permission to see it in clear. Use ValidationRule instead when the constraint governs which values a field may accept or contain (pattern, range, length), not how its value is hidden from unauthorized readers. Use SecureResource instead when the control applies to the whole resource, endpoint or table and its operations, not to an individual field within it. Use DataClassification instead when the element assigns a sensitivity tier or encryption obligation to data, rather than naming the masking technique for one specific field. Use PolicyAction instead when masking is the generic enforcement response fired by a PolicyRule match, not a standing rule attached to a named field.",
|
|
607
766
|
"allOf": [
|
|
608
767
|
{
|
|
609
768
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -623,7 +782,8 @@
|
|
|
623
782
|
"type": "object",
|
|
624
783
|
"properties": {
|
|
625
784
|
"field": {
|
|
626
|
-
"type": "string"
|
|
785
|
+
"type": "string",
|
|
786
|
+
"description": "Name or dotted path of the protected field within the parent SecureResource (e.g. 'customer.ssn' or 'card_number'); always set it, matching the field name as it appears in the resource's schema or payload."
|
|
627
787
|
},
|
|
628
788
|
"maskingStrategy": {
|
|
629
789
|
"type": "string",
|
|
@@ -638,19 +798,32 @@
|
|
|
638
798
|
"description": "Technique used to protect sensitive field values when exposed to unauthorized principals, per NIST SP 800-53 SC-28 data-at-rest protection controls."
|
|
639
799
|
},
|
|
640
800
|
"description": {
|
|
641
|
-
"type": "string"
|
|
801
|
+
"type": "string",
|
|
802
|
+
"description": "Free-text explanation of why the field is protected and who may see it unmasked; set it when the masking rationale or exemption is not obvious from the field name and strategy."
|
|
642
803
|
}
|
|
643
804
|
},
|
|
644
805
|
"required": ["field"],
|
|
645
806
|
"additionalProperties": false
|
|
646
807
|
}
|
|
647
808
|
},
|
|
809
|
+
"x-dr-standard": "NIST SP 800-53 AC-3 Access Enforcement (field-level), with SC-28 Protection of Information at Rest",
|
|
810
|
+
"x-dr-evidence": [
|
|
811
|
+
"A DTO or serializer field carrying a masking or redaction annotation or type, e.g. @Sensitive, @JsonSerialize(using = MaskingSerializer.class), Pydantic SecretStr, or a custom redact() field transformer.",
|
|
812
|
+
"Response-shaping code that replaces or drops a specific field after a permission check, e.g. `if not user.has_perm('view_ssn'): data['ssn'] = mask(data['ssn'])`.",
|
|
813
|
+
"Declarative column- or field-level masking configuration: a GraphQL @auth or @mask directive on a field, Hasura column permissions, SQL Server `MASKED WITH (FUNCTION = ...)`, or a Snowflake/Postgres masking policy on a column."
|
|
814
|
+
],
|
|
815
|
+
"x-dr-distinguish": {
|
|
816
|
+
"security.validationrule": "the constraint governs which values a field may accept or contain (pattern, range, length), not how its value is hidden from unauthorized readers.",
|
|
817
|
+
"security.secureresource": "the control applies to the whole resource, endpoint or table and its operations, not to an individual field within it.",
|
|
818
|
+
"security.dataclassification": "the element assigns a sensitivity tier or encryption obligation to data, rather than naming the masking technique for one specific field.",
|
|
819
|
+
"security.policyaction": "masking is the generic enforcement response fired by a PolicyRule match, not a standing rule attached to a named field."
|
|
820
|
+
},
|
|
648
821
|
"$id": "urn:dr:spec:node:security.fieldaccesscontrol"
|
|
649
822
|
},
|
|
650
823
|
"informationentity": {
|
|
651
824
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
652
825
|
"title": "InformationEntity",
|
|
653
|
-
"description": "
|
|
826
|
+
"description": "A named logical category of information (e.g. customer PII, payment card data, medical records) defined independently of where or how it is stored, which carries a sensitivity classification and is the object to which InformationRights grant actors access. It names *what* the data is, not the endpoint, table or field that holds it. Use SecureResource instead when the protected thing is a concrete technical artefact (an API endpoint, database table, file store, service or UI) with operations performed on it, rather than a storage-independent category of data. Use DataClassification instead when you are modelling the classification scheme itself (levels, encryption obligations) rather than a specific data category that is assigned one of those levels. Use FieldAccessControl instead when the control applies to one named field and its masking or redaction strategy, rather than to a whole logical grouping of data that may span many fields and stores.",
|
|
654
827
|
"allOf": [
|
|
655
828
|
{
|
|
656
829
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -670,7 +843,8 @@
|
|
|
670
843
|
"type": "object",
|
|
671
844
|
"properties": {
|
|
672
845
|
"description": {
|
|
673
|
-
"type": "string"
|
|
846
|
+
"type": "string",
|
|
847
|
+
"description": "Free-text explanation of what data this information asset comprises (example fields, data subjects, and systems where it appears); set it whenever the entity name alone does not make the boundary of the asset clear."
|
|
674
848
|
},
|
|
675
849
|
"classification": {
|
|
676
850
|
"type": "string",
|
|
@@ -685,12 +859,23 @@
|
|
|
685
859
|
"additionalProperties": false
|
|
686
860
|
}
|
|
687
861
|
},
|
|
862
|
+
"x-dr-standard": "STS-ml Information entity; NIST SP 800-53 Rev. 5 RA-2 (Security Categorization) and AC-3 (Access Enforcement)",
|
|
863
|
+
"x-dr-evidence": [
|
|
864
|
+
"A data inventory, record-of-processing (ROPA) or data-catalog document listing named data categories such as 'Customer PII' or 'Cardholder Data', each with a sensitivity level.",
|
|
865
|
+
"An enum or constant set of data categories (e.g. DataCategory.PII, DataCategory.PHI, DataCategory.PCI) referenced by authorization checks or masking logic across several classes.",
|
|
866
|
+
"Marker annotations or catalog tags (e.g. @PersonalData(category=\"contact\"), BigQuery policy tags, AWS Macie or Purview classifications) applied consistently to fields in multiple models or tables to group them into one asset."
|
|
867
|
+
],
|
|
868
|
+
"x-dr-distinguish": {
|
|
869
|
+
"security.secureresource": "the protected thing is a concrete technical artefact (an API endpoint, database table, file store, service or UI) with operations performed on it, rather than a storage-independent category of data.",
|
|
870
|
+
"security.dataclassification": "you are modelling the classification scheme itself (levels, encryption obligations) rather than a specific data category that is assigned one of those levels.",
|
|
871
|
+
"security.fieldaccesscontrol": "the control applies to one named field and its masking or redaction strategy, rather than to a whole logical grouping of data that may span many fields and stores."
|
|
872
|
+
},
|
|
688
873
|
"$id": "urn:dr:spec:node:security.informationentity"
|
|
689
874
|
},
|
|
690
875
|
"informationright": {
|
|
691
876
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
692
877
|
"title": "InformationRight",
|
|
693
|
-
"description": "
|
|
878
|
+
"description": "An access grant that authorizes one specific actor to perform a listed set of operations on a single InformationEntity. The grant applies only while an attribute-based constraint expression evaluates to true at decision time. It differs from a role-assigned Permission because it names the grantee directly and carries its own qualifying condition. Use Permission instead when the grant is a reusable resource+action entitlement assigned to Roles rather than to a named actor, and has no per-grant constraint expression. Use Delegation instead when authority is transferred from one actor (delegator) to another (delegatee), possibly time-bounded, rather than granted directly on an information asset. Use NeedToKnow instead when access is gated by the actor declaring a purpose or justification rather than by an attribute-based boolean constraint. Use AccessCondition instead when the element is only the field/operator/value predicate itself, not the grant binding an actor and operations to an information asset.",
|
|
694
879
|
"allOf": [
|
|
695
880
|
{
|
|
696
881
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -737,12 +922,24 @@
|
|
|
737
922
|
"additionalProperties": false
|
|
738
923
|
}
|
|
739
924
|
},
|
|
925
|
+
"x-dr-standard": "NIST SP 800-53 Rev.5 AC-3(13) Attribute-Based Access Control; NIST SP 800-162 ABAC policy; STS-ml authorisation",
|
|
926
|
+
"x-dr-evidence": [
|
|
927
|
+
"An ABAC policy line naming a concrete subject, data asset, actions and condition, e.g. Casbin `p, billing-svc, customer_pii, read, r.sub.region == r.obj.region`",
|
|
928
|
+
"A cloud IAM or KMS policy statement whose Principal is a specific user or service, whose Resource is a named data store or dataset, and which has an Action list and a Condition block",
|
|
929
|
+
"An OPA/Rego or Cedar `permit` rule keyed on a specific principal id and data category, with a `when`/`if` clause comparing subject attributes to resource attributes"
|
|
930
|
+
],
|
|
931
|
+
"x-dr-distinguish": {
|
|
932
|
+
"security.permission": "the grant is a reusable resource+action entitlement assigned to Roles rather than to a named actor, and has no per-grant constraint expression",
|
|
933
|
+
"security.delegation": "authority is transferred from one actor (delegator) to another (delegatee), possibly time-bounded, rather than granted directly on an information asset",
|
|
934
|
+
"security.needtoknow": "access is gated by the actor declaring a purpose or justification rather than by an attribute-based boolean constraint",
|
|
935
|
+
"security.accesscondition": "the element is only the field/operator/value predicate itself, not the grant binding an actor and operations to an information asset"
|
|
936
|
+
},
|
|
740
937
|
"$id": "urn:dr:spec:node:security.informationright"
|
|
741
938
|
},
|
|
742
939
|
"needtoknow": {
|
|
743
940
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
744
941
|
"title": "NeedToKnow",
|
|
745
|
-
"description": "
|
|
942
|
+
"description": "A procedural access constraint that limits access to a named resource to actors whose declared business or operational purpose matches a stated objective, optionally requiring the actor to submit an explicit justification before access is granted. It gates access by purpose, not by identity, role or attribute match alone. Use InformationRight instead when the rule grants specific operations on an information entity to a named actor under a constraint expression, with no purpose declaration involved. Use AccountabilityRequirement instead when the purpose declaration is recorded as evidence that an action occurred, and is not checked as a gate before access. Use AccessCondition instead when the check is a generic field/operator/value predicate on request context inside a PolicyRule chain, rather than a purpose-of-use restriction. Use Permission instead when the element is an atomic action grant on a resource assigned to roles, with no justification or purpose requirement.",
|
|
746
943
|
"allOf": [
|
|
747
944
|
{
|
|
748
945
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -762,17 +959,20 @@
|
|
|
762
959
|
"type": "object",
|
|
763
960
|
"properties": {
|
|
764
961
|
"resource": {
|
|
765
|
-
"type": "string"
|
|
962
|
+
"type": "string",
|
|
963
|
+
"description": "Identifier of the protected resource or information entity (e.g. 'customer.pii' or '/api/patients/{id}') to which the need-to-know restriction applies; always set it to the same name used by the corresponding SecureResource or InformationEntity."
|
|
766
964
|
},
|
|
767
965
|
"objective": {
|
|
768
966
|
"type": "string",
|
|
769
|
-
"description": "A free-text statement of the business or operational purpose that justifies access. This is a purpose declaration string, not a reference to
|
|
967
|
+
"description": "A free-text statement of the business or operational purpose that justifies access. This is a purpose declaration string, not a reference to another node."
|
|
770
968
|
},
|
|
771
969
|
"message": {
|
|
772
|
-
"type": "string"
|
|
970
|
+
"type": "string",
|
|
971
|
+
"description": "Human-readable denial text returned or logged when an actor's stated purpose does not satisfy the objective or when a required justification is missing."
|
|
773
972
|
},
|
|
774
973
|
"justificationRequired": {
|
|
775
|
-
"type": "boolean"
|
|
974
|
+
"type": "boolean",
|
|
975
|
+
"description": "When true, the actor must supply an explicit purpose or justification before each access is evaluated; set it to false when the purpose is inferred from context such as role or assignment."
|
|
776
976
|
}
|
|
777
977
|
},
|
|
778
978
|
"required": [
|
|
@@ -784,12 +984,24 @@
|
|
|
784
984
|
"additionalProperties": false
|
|
785
985
|
}
|
|
786
986
|
},
|
|
987
|
+
"x-dr-standard": "NIST SP 800-53 AC-6 (Least Privilege, need-to-know) with AC-3 Access Enforcement; purpose specification per PT-3",
|
|
988
|
+
"x-dr-evidence": [
|
|
989
|
+
"Middleware or an interceptor that rejects requests to a sensitive endpoint when a purpose or reason field (e.g. X-Access-Reason, purposeOfUse) is missing or not in an allowed set.",
|
|
990
|
+
"A UI dialog or 'break-glass' prompt that forces the user to enter or select a reason before showing a protected record such as a patient chart or customer PII.",
|
|
991
|
+
"A configuration map from resources to permitted purpose codes (e.g. HIPAA TREAT/PAYMENT/OPS), together with a denial message shown when the stated purpose does not match."
|
|
992
|
+
],
|
|
993
|
+
"x-dr-distinguish": {
|
|
994
|
+
"security.informationright": "the rule grants specific operations on an information entity to a named actor under a constraint expression, with no purpose declaration involved.",
|
|
995
|
+
"security.accountabilityrequirement": "the purpose declaration is recorded as evidence that an action occurred, and is not checked as a gate before access.",
|
|
996
|
+
"security.accesscondition": "the check is a generic field/operator/value predicate on request context inside a PolicyRule chain, rather than a purpose-of-use restriction.",
|
|
997
|
+
"security.permission": "the element is an atomic action grant on a resource assigned to roles, with no justification or purpose requirement."
|
|
998
|
+
},
|
|
787
999
|
"$id": "urn:dr:spec:node:security.needtoknow"
|
|
788
1000
|
},
|
|
789
1001
|
"passwordpolicy": {
|
|
790
1002
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
791
1003
|
"title": "PasswordPolicy",
|
|
792
|
-
"description": "
|
|
1004
|
+
"description": "A credential rule set that fixes the length bounds, required character classes, reuse history, expiry interval and failed-attempt lockout for memorized secrets (passwords or passphrases) accepted by an authenticator. It covers only the rules a password must satisfy and how repeated failures are handled, not how the principal is authenticated overall. Use AuthenticationConfig instead when the symbol configures the identity provider, MFA, session timeout or verification level, of which password rules are at most one referenced part. Use ValidationRule instead when a regex, length or range check validates an ordinary data field rather than the composition of a login credential. Use Countermeasure instead when the code implements a general brute-force or credential-stuffing mitigation (IP throttling, CAPTCHA, breached-password screening) not expressed as password composition or account lockout parameters.",
|
|
793
1005
|
"allOf": [
|
|
794
1006
|
{
|
|
795
1007
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -809,46 +1021,67 @@
|
|
|
809
1021
|
"type": "object",
|
|
810
1022
|
"properties": {
|
|
811
1023
|
"minLength": {
|
|
812
|
-
"type": "integer"
|
|
1024
|
+
"type": "integer",
|
|
1025
|
+
"description": "Minimum number of characters a password must contain; set whenever a lower length bound is enforced (NIST SP 800-63B suggests at least 8, commonly 12+)."
|
|
813
1026
|
},
|
|
814
1027
|
"maxLength": {
|
|
815
|
-
"type": "integer"
|
|
1028
|
+
"type": "integer",
|
|
1029
|
+
"description": "Maximum number of characters accepted for a password; set only when the system caps length, and leave unset if no cap exists."
|
|
816
1030
|
},
|
|
817
1031
|
"requireUppercase": {
|
|
818
|
-
"type": "boolean"
|
|
1032
|
+
"type": "boolean",
|
|
1033
|
+
"description": "True when a password must contain at least one uppercase letter (A-Z); omit or set false when no such rule is enforced."
|
|
819
1034
|
},
|
|
820
1035
|
"requireLowercase": {
|
|
821
|
-
"type": "boolean"
|
|
1036
|
+
"type": "boolean",
|
|
1037
|
+
"description": "True when a password must contain at least one lowercase letter (a-z); omit or set false when no such rule is enforced."
|
|
822
1038
|
},
|
|
823
1039
|
"requireNumbers": {
|
|
824
|
-
"type": "boolean"
|
|
1040
|
+
"type": "boolean",
|
|
1041
|
+
"description": "True when a password must contain at least one decimal digit (0-9); omit or set false when no such rule is enforced."
|
|
825
1042
|
},
|
|
826
1043
|
"requireSpecialChars": {
|
|
827
|
-
"type": "boolean"
|
|
1044
|
+
"type": "boolean",
|
|
1045
|
+
"description": "True when a password must contain at least one non-alphanumeric symbol; omit or set false when no such rule is enforced."
|
|
828
1046
|
},
|
|
829
1047
|
"preventReuse": {
|
|
830
|
-
"type": "integer"
|
|
1048
|
+
"type": "integer",
|
|
1049
|
+
"description": "Number of previous passwords per account that a new password may not match; 0 or unset means no history check."
|
|
831
1050
|
},
|
|
832
1051
|
"expiryDays": {
|
|
833
|
-
"type": "integer"
|
|
1052
|
+
"type": "integer",
|
|
1053
|
+
"description": "Number of days after which a password must be changed; use 0 when passwords never expire by age."
|
|
834
1054
|
},
|
|
835
1055
|
"lockoutAttempts": {
|
|
836
|
-
"type": "integer"
|
|
1056
|
+
"type": "integer",
|
|
1057
|
+
"description": "Number of consecutive failed authentication attempts that triggers account lockout; leave unset when no lockout is enforced."
|
|
837
1058
|
},
|
|
838
1059
|
"lockoutDuration": {
|
|
839
|
-
"type": "integer"
|
|
1060
|
+
"type": "integer",
|
|
1061
|
+
"description": "Length of time, in minutes, that an account stays locked after reaching lockoutAttempts; use 0 when unlock requires administrator action."
|
|
840
1062
|
}
|
|
841
1063
|
},
|
|
842
1064
|
"required": ["expiryDays"],
|
|
843
1065
|
"additionalProperties": false
|
|
844
1066
|
}
|
|
845
1067
|
},
|
|
1068
|
+
"x-dr-standard": "NIST SP 800-53 IA-5(1) Password-Based Authentication (with AC-7 Unsuccessful Logon Attempts for lockout)",
|
|
1069
|
+
"x-dr-evidence": [
|
|
1070
|
+
"Framework password option blocks such as Django AUTH_PASSWORD_VALIDATORS (MinimumLengthValidator), ASP.NET Identity PasswordOptions/LockoutOptions, or Spring Security password constraint beans.",
|
|
1071
|
+
"Identity-provider or infrastructure declarations such as a Keycloak realm passwordPolicy string ('length(12) and upperCase(1) and passwordHistory(5)'), an AWS Cognito PasswordPolicy block, or a Terraform aws_iam_account_password_policy resource.",
|
|
1072
|
+
"A password-change or registration routine that tests character-class regexes, compares the new hash against stored previous hashes, and returns messages like 'Password must contain a special character', or a failed-login counter that sets a locked-until timestamp."
|
|
1073
|
+
],
|
|
1074
|
+
"x-dr-distinguish": {
|
|
1075
|
+
"security.authenticationconfig": "the symbol configures the identity provider, MFA, session timeout or verification level, of which password rules are at most one referenced part.",
|
|
1076
|
+
"security.validationrule": "a regex, length or range check validates an ordinary data field rather than the composition of a login credential.",
|
|
1077
|
+
"security.countermeasure": "the code implements a general brute-force or credential-stuffing mitigation (IP throttling, CAPTCHA, breached-password screening) not expressed as password composition or account lockout parameters."
|
|
1078
|
+
},
|
|
846
1079
|
"$id": "urn:dr:spec:node:security.passwordpolicy"
|
|
847
1080
|
},
|
|
848
1081
|
"permission": {
|
|
849
1082
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
850
1083
|
"title": "Permission",
|
|
851
|
-
"description": "An atomic grant
|
|
1084
|
+
"description": "An atomic authorization grant that pairs one action with one named resource at a stated access scope, independent of any particular principal, and is assigned to Roles and checked at enforcement points such as routes, API operations and UI components. It names what may be done. Who holds it, and under what runtime conditions, is captured elsewhere. Use ResourceOperation instead when the symbol declares which operations a SecureResource supports, along with that operation's conditions, rate limits and audit bindings, rather than a grantable entitlement that is assigned to roles. Use Role instead when the symbol is a named bundle of permissions with a privilege level or inheritance, such as 'admin' or 'editor', rather than a single action-on-resource grant. Use InformationRight instead when the grant is bound to a specific actor on an InformationEntity and is qualified by a constraint expression (ABAC), rather than being an actor-independent entitlement handed out via roles. Use PolicyRule instead when the symbol evaluates a condition and yields a permit or deny effect at decision time, rather than naming a static entitlement that the check looks up.",
|
|
852
1085
|
"allOf": [
|
|
853
1086
|
{
|
|
854
1087
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -868,7 +1101,8 @@
|
|
|
868
1101
|
"type": "object",
|
|
869
1102
|
"properties": {
|
|
870
1103
|
"description": {
|
|
871
|
-
"type": "string"
|
|
1104
|
+
"type": "string",
|
|
1105
|
+
"description": "Human-readable sentence explaining what the grant allows and why it exists; set it whenever the permission identifier alone is not self-explanatory to auditors."
|
|
872
1106
|
},
|
|
873
1107
|
"scope": {
|
|
874
1108
|
"type": "string",
|
|
@@ -882,7 +1116,8 @@
|
|
|
882
1116
|
"description": "Access level granted by this permission, ranging from read-only to full administrative control."
|
|
883
1117
|
},
|
|
884
1118
|
"resource": {
|
|
885
|
-
"type": "string"
|
|
1119
|
+
"type": "string",
|
|
1120
|
+
"description": "Identifier of the protected resource the action applies to, ideally the 'resource' name of a security.secureresource (e.g. 'orders' or 'billing-api'), or a wildcard pattern such as 'orders/*' when the grant spans a resource family."
|
|
886
1121
|
},
|
|
887
1122
|
"action": {
|
|
888
1123
|
"type": "string",
|
|
@@ -894,12 +1129,24 @@
|
|
|
894
1129
|
"additionalProperties": false
|
|
895
1130
|
}
|
|
896
1131
|
},
|
|
1132
|
+
"x-dr-standard": "NIST SP 800-53 AC-3 (Access Enforcement); AC-6 (Least Privilege)",
|
|
1133
|
+
"x-dr-evidence": [
|
|
1134
|
+
"Permission identifier constants or enum members such as 'orders:read' or 'INVOICE_DELETE', defined in a central permissions file or seeded into a permissions table by migrations or fixtures.",
|
|
1135
|
+
"Enforcement annotations or guards that take a permission name, such as @PreAuthorize(\"hasAuthority('report.export')\"), @RequiresPermission, a requirePermission('user.update') middleware, or a CASL can('update','Article') rule.",
|
|
1136
|
+
"OAuth scope or role-to-permission mapping entries, for example OpenAPI securitySchemes scopes or a YAML/JSON policy file listing the permissions granted to each role."
|
|
1137
|
+
],
|
|
1138
|
+
"x-dr-distinguish": {
|
|
1139
|
+
"security.resourceoperation": "the symbol declares which operations a SecureResource supports, along with that operation's conditions, rate limits and audit bindings, rather than a grantable entitlement that is assigned to roles.",
|
|
1140
|
+
"security.role": "the symbol is a named bundle of permissions with a privilege level or inheritance, such as 'admin' or 'editor', rather than a single action-on-resource grant.",
|
|
1141
|
+
"security.informationright": "the grant is bound to a specific actor on an InformationEntity and is qualified by a constraint expression (ABAC), rather than being an actor-independent entitlement handed out via roles.",
|
|
1142
|
+
"security.policyrule": "the symbol evaluates a condition and yields a permit or deny effect at decision time, rather than naming a static entitlement that the check looks up."
|
|
1143
|
+
},
|
|
897
1144
|
"$id": "urn:dr:spec:node:security.permission"
|
|
898
1145
|
},
|
|
899
1146
|
"policyaction": {
|
|
900
1147
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
901
1148
|
"title": "PolicyAction",
|
|
902
|
-
"description": "
|
|
1149
|
+
"description": "A response step that the enforcement point carries out when a PolicyRule or Condition matches, such as blocking, redirecting, challenging, masking, quarantining, or notifying. It is parameterised by a type and its configuration, and corresponds to an obligation or advice attached to a policy decision rather than to the decision itself. Use PolicyRule instead when the element is the condition-plus-effect unit that yields the permit/deny decision, not the side-effect or response carried out after the decision. Use Countermeasure instead when the element is a standing control or mitigation assessed against a threat, with effectiveness and implementation status, rather than a per-match runtime response. Use AuditConfig instead when the element configures which events are logged and at what verbosity system-wide, rather than a single 'log' or 'alert' step fired by a rule match. Use FieldAccessControl instead when masking or redaction is declared statically for a named data field, independent of any policy rule firing.",
|
|
903
1150
|
"allOf": [
|
|
904
1151
|
{
|
|
905
1152
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -948,12 +1195,24 @@
|
|
|
948
1195
|
"additionalProperties": false
|
|
949
1196
|
}
|
|
950
1197
|
},
|
|
1198
|
+
"x-dr-standard": "XACML 3.0 §5.39–5.40 ObligationExpression/AdviceExpression (enforcement per NIST SP 800-53 AC-3)",
|
|
1199
|
+
"x-dr-evidence": [
|
|
1200
|
+
"A WAF or gateway rule config whose action field is set to a verb such as block, captcha, challenge, redirect, or count (e.g. AWS WAF Action, Cloudflare firewall action, Envoy RBAC action).",
|
|
1201
|
+
"A policy-decision handler that switches on the decision or obligation ID and dispatches to a 403 response, a step-up MFA challenge, a redirect, or a notification sender.",
|
|
1202
|
+
"An OPA/Rego or Cedar policy output that returns obligations or advice objects alongside allow/deny (e.g. {\"action\":\"notify\",\"recipient\":...}), consumed by enforcement middleware."
|
|
1203
|
+
],
|
|
1204
|
+
"x-dr-distinguish": {
|
|
1205
|
+
"security.policyrule": "the element is the condition-plus-effect unit that yields the permit/deny decision, not the side-effect or response carried out after the decision.",
|
|
1206
|
+
"security.countermeasure": "the element is a standing control or mitigation assessed against a threat, with effectiveness and implementation status, rather than a per-match runtime response.",
|
|
1207
|
+
"security.auditconfig": "the element configures which events are logged and at what verbosity system-wide, rather than a single 'log' or 'alert' step fired by a rule match.",
|
|
1208
|
+
"security.fieldaccesscontrol": "masking or redaction is declared statically for a named data field, independent of any policy rule firing."
|
|
1209
|
+
},
|
|
951
1210
|
"$id": "urn:dr:spec:node:security.policyaction"
|
|
952
1211
|
},
|
|
953
1212
|
"policyrule": {
|
|
954
1213
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
955
1214
|
"title": "PolicyRule",
|
|
956
|
-
"description": "
|
|
1215
|
+
"description": "A single evaluation unit inside a security policy that pairs one condition predicate over the request context with a decision effect (permit or deny, or indeterminate / not-applicable where the source engine records those outcomes). It may also trigger obligation actions when the condition matches. It is the smallest construct that both tests a condition and yields an access decision. Use SecurityPolicy instead when the element is the named, prioritized container with a target that groups and orders several rules, rather than one condition-plus-effect pair. Use AccessCondition instead when the element is only a field/operator/value predicate that yields true or false and carries no permit/deny effect of its own. Use PolicyAction instead when the element is the response executed after a rule matches (log, alert, redirect, rate-limit, mask), not the decision itself. Use Permission instead when the element is a static grant of an action on a resource assigned to a role, with no runtime condition evaluated to produce a decision.",
|
|
957
1216
|
"allOf": [
|
|
958
1217
|
{
|
|
959
1218
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -973,7 +1232,8 @@
|
|
|
973
1232
|
"type": "object",
|
|
974
1233
|
"properties": {
|
|
975
1234
|
"condition": {
|
|
976
|
-
"type": "string"
|
|
1235
|
+
"type": "string",
|
|
1236
|
+
"description": "The predicate expression that must evaluate true for the rule to fire, recorded verbatim in the source policy language or as a normalized boolean expression (e.g. \"user.department == resource.owner && time < 18:00\"). Always set it; when the rule is composed from AccessCondition nodes, summarize their conjunction here."
|
|
977
1237
|
},
|
|
978
1238
|
"effect": {
|
|
979
1239
|
"type": "string",
|
|
@@ -981,7 +1241,8 @@
|
|
|
981
1241
|
"description": "Policy decision outcome, per XACML 3.0 Rule element effect values."
|
|
982
1242
|
},
|
|
983
1243
|
"message": {
|
|
984
|
-
"type": "string"
|
|
1244
|
+
"type": "string",
|
|
1245
|
+
"description": "A human-readable explanation returned to the caller or written to logs when the rule fires, typically the denial reason (e.g. \"Only owners may delete reports\"). Set it when the code or policy emits a specific message for this rule."
|
|
985
1246
|
},
|
|
986
1247
|
"source": {
|
|
987
1248
|
"type": "object",
|
|
@@ -992,12 +1253,24 @@
|
|
|
992
1253
|
"additionalProperties": false
|
|
993
1254
|
}
|
|
994
1255
|
},
|
|
1256
|
+
"x-dr-standard": "OASIS XACML 3.0 Rule element (Target/Condition/Effect/Obligations); NIST SP 800-53 AC-3 Access Enforcement",
|
|
1257
|
+
"x-dr-evidence": [
|
|
1258
|
+
"A statement in a policy language file with an explicit effect and condition, such as an AWS IAM Statement with \"Effect\": \"Deny\" and a Condition block, a Cedar `permit(...) when { ... };` clause, or an OPA Rego `deny[msg] { ... }` rule.",
|
|
1259
|
+
"An entry in a rules array of a policy config or Casbin policy file whose fields include a match expression and an effect value (e.g. `p, alice, /reports, GET, allow`, or `{condition: ..., effect: 'deny'}`).",
|
|
1260
|
+
"A branch in a policy-evaluator or authorization middleware that tests a predicate on user, resource or request attributes and returns an ALLOW or DENY decision, often with a denial reason string."
|
|
1261
|
+
],
|
|
1262
|
+
"x-dr-distinguish": {
|
|
1263
|
+
"security.securitypolicy": "the element is the named, prioritized container with a target that groups and orders several rules, rather than one condition-plus-effect pair",
|
|
1264
|
+
"security.accesscondition": "the element is only a field/operator/value predicate that yields true or false and carries no permit/deny effect of its own",
|
|
1265
|
+
"security.policyaction": "the element is the response executed after a rule matches (log, alert, redirect, rate-limit, mask), not the decision itself",
|
|
1266
|
+
"security.permission": "the element is a static grant of an action on a resource assigned to a role, with no runtime condition evaluated to produce a decision"
|
|
1267
|
+
},
|
|
995
1268
|
"$id": "urn:dr:spec:node:security.policyrule"
|
|
996
1269
|
},
|
|
997
1270
|
"resourceoperation": {
|
|
998
1271
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
999
1272
|
"title": "ResourceOperation",
|
|
1000
|
-
"description": "
|
|
1273
|
+
"description": "An action declared on a single SecureResource (create, read, approve, export, etc.) that the authorization layer can permit or refuse. It carries the access conditions, rate limits and audit settings that apply whenever an actor invokes that action on that resource, and so forms the verb in a subject-verb-object access decision. Use Permission instead when the element is the grant authorizing a role or actor to perform an action, i.e. who may do it, rather than the action as exposed and guarded on the resource. Use SecureResource instead when the element is the protected API, table, file or service itself rather than one of the actions that can be performed on it. Use PolicyAction instead when the element is the enforcement response a policy rule produces (deny, log, redirect, mask), not the operation an actor requests. Use AccessCondition instead when the element is the field-operator-value predicate that must hold before the operation is allowed, rather than the operation it gates.",
|
|
1001
1274
|
"allOf": [
|
|
1002
1275
|
{
|
|
1003
1276
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -1033,7 +1306,8 @@
|
|
|
1033
1306
|
"description": "Permitted operation type on the secured resource."
|
|
1034
1307
|
},
|
|
1035
1308
|
"description": {
|
|
1036
|
-
"type": "string"
|
|
1309
|
+
"type": "string",
|
|
1310
|
+
"description": "Free-text explanation of what invoking this operation does to the resource and any business significance (e.g. 'Approves a pending invoice for payment'); set it when the operation verb alone does not make the effect or the sensitivity clear."
|
|
1037
1311
|
},
|
|
1038
1312
|
"conditions": {
|
|
1039
1313
|
"type": "array",
|
|
@@ -1052,12 +1326,24 @@
|
|
|
1052
1326
|
"additionalProperties": false
|
|
1053
1327
|
}
|
|
1054
1328
|
},
|
|
1329
|
+
"x-dr-standard": "NIST SP 800-53 AC-3 (Access Enforcement); XACML 3.0 Action attribute category",
|
|
1330
|
+
"x-dr-evidence": [
|
|
1331
|
+
"An authorization check naming both a resource type and an action verb, e.g. @PreAuthorize(\"hasPermission(#id, 'Invoice', 'approve')\") or authorize(user, 'export', report).",
|
|
1332
|
+
"A per-resource list of actions in an authorization schema or policy file, e.g. an Oso/Cedar/OpenFGA resource block with actions = [\"read\", \"update\", \"share\"].",
|
|
1333
|
+
"A controller handler for one verb on one resource wrapped with its own guard, rate-limit and audit-log middleware, e.g. router.post('/orders/:id/approve', requireRole, rateLimit, auditLog, handler)."
|
|
1334
|
+
],
|
|
1335
|
+
"x-dr-distinguish": {
|
|
1336
|
+
"security.permission": "the element is the grant authorizing a role or actor to perform an action, i.e. who may do it, rather than the action as exposed and guarded on the resource.",
|
|
1337
|
+
"security.secureresource": "the element is the protected API, table, file or service itself rather than one of the actions that can be performed on it.",
|
|
1338
|
+
"security.policyaction": "the element is the enforcement response a policy rule produces (deny, log, redirect, mask), not the operation an actor requests.",
|
|
1339
|
+
"security.accesscondition": "the element is the field-operator-value predicate that must hold before the operation is allowed, rather than the operation it gates."
|
|
1340
|
+
},
|
|
1055
1341
|
"$id": "urn:dr:spec:node:security.resourceoperation"
|
|
1056
1342
|
},
|
|
1057
1343
|
"retentionpolicy": {
|
|
1058
1344
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
1059
1345
|
"title": "RetentionPolicy",
|
|
1060
|
-
"description": "
|
|
1346
|
+
"description": "A data-lifecycle rule for one category of security-relevant data (audit logs, access records, evidence, cryptographic keys) that sets the minimum time the data must be kept, where it is kept, and how it is disposed of once that period ends. Use AuditConfig instead when the element decides which security events are captured, at what verbosity, and which fields are sanitized, rather than how long captured records are kept or how they are destroyed. Use Evidence instead when the element is the retained artifact itself (a log stream, signature, hash or audit trail), not the rule that governs how long it is kept. Use DataClassification instead when the element assigns a sensitivity tier or encryption obligation to data, rather than a retention duration and disposal method. Use AccountabilityRequirement instead when the element states who must prove that an action occurred and whether that proof can be challenged, independent of how long the proof is stored.",
|
|
1061
1347
|
"allOf": [
|
|
1062
1348
|
{
|
|
1063
1349
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -1077,7 +1363,8 @@
|
|
|
1077
1363
|
"type": "object",
|
|
1078
1364
|
"properties": {
|
|
1079
1365
|
"period": {
|
|
1080
|
-
"type": "string"
|
|
1366
|
+
"type": "string",
|
|
1367
|
+
"description": "Minimum duration for which the governed data must be retained before disposal, expressed as an ISO 8601 duration (e.g. 'P90D', 'P7Y'); always set it, using the longest applicable regulatory or contractual requirement."
|
|
1081
1368
|
},
|
|
1082
1369
|
"destination": {
|
|
1083
1370
|
"type": "string",
|
|
@@ -1103,19 +1390,32 @@
|
|
|
1103
1390
|
"description": "Secure disposal technique applied when data reaches end of retention period, per NIST SP 800-88 Guidelines for Media Sanitization."
|
|
1104
1391
|
},
|
|
1105
1392
|
"description": {
|
|
1106
|
-
"type": "string"
|
|
1393
|
+
"type": "string",
|
|
1394
|
+
"description": "Free-text summary of which security data this policy covers and the regulation or internal mandate that justifies the period (e.g. 'SOX audit trail, 7 years'); set it whenever the period or scope is not self-evident."
|
|
1107
1395
|
}
|
|
1108
1396
|
},
|
|
1109
1397
|
"required": ["period"],
|
|
1110
1398
|
"additionalProperties": false
|
|
1111
1399
|
}
|
|
1112
1400
|
},
|
|
1401
|
+
"x-dr-standard": "NIST SP 800-53 AU-11 Audit Record Retention (with SI-12 Information Management and Retention)",
|
|
1402
|
+
"x-dr-evidence": [
|
|
1403
|
+
"Log-store retention settings scoped to audit or security streams, such as CloudWatch retentionInDays on an audit log group, an Elasticsearch/OpenSearch ILM policy with a delete phase, or Loki retention_period.",
|
|
1404
|
+
"An S3, GCS or Azure Blob lifecycle rule on an audit or evidence bucket with expiration or transition-to-archive days, or an object-lock/WORM retention configuration.",
|
|
1405
|
+
"A scheduled job or cron task that purges, crypto-shreds or archives audit, access-log or key records older than a configured age, often citing a compliance period such as '7 years' or 'P90D'."
|
|
1406
|
+
],
|
|
1407
|
+
"x-dr-distinguish": {
|
|
1408
|
+
"security.auditconfig": "the element decides which security events are captured, at what verbosity, and which fields are sanitized, rather than how long captured records are kept or how they are destroyed.",
|
|
1409
|
+
"security.evidence": "the element is the retained artifact itself (a log stream, signature, hash or audit trail), not the rule that governs how long it is kept.",
|
|
1410
|
+
"security.dataclassification": "the element assigns a sensitivity tier or encryption obligation to data, rather than a retention duration and disposal method.",
|
|
1411
|
+
"security.accountabilityrequirement": "the element states who must prove that an action occurred and whether that proof can be challenged, independent of how long the proof is stored."
|
|
1412
|
+
},
|
|
1113
1413
|
"$id": "urn:dr:spec:node:security.retentionpolicy"
|
|
1114
1414
|
},
|
|
1115
1415
|
"role": {
|
|
1116
1416
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
1117
1417
|
"title": "Role",
|
|
1118
|
-
"description": "A named
|
|
1418
|
+
"description": "A named, assignable grouping of Permissions that actors receive by being assigned to it, rather than by individual grants. It optionally inherits all permissions of a single parent role and carries a privilege tier. Use Actor instead when the element is the principal itself (a user, service account or external system) that holds roles, not the grouping it is assigned to. Use Permission instead when the element is a single action-on-resource grant (e.g. 'orders:delete') rather than a named bundle of such grants. Use Delegation instead when authority is transferred from one specific actor to another, usually time-bounded or revocable, rather than held through standing role membership. Use InformationRight instead when access is granted directly to a named actor on an InformationEntity under a constraint expression, with no intermediate role.",
|
|
1119
1419
|
"allOf": [
|
|
1120
1420
|
{
|
|
1121
1421
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -1135,13 +1435,16 @@
|
|
|
1135
1435
|
"type": "object",
|
|
1136
1436
|
"properties": {
|
|
1137
1437
|
"displayName": {
|
|
1138
|
-
"type": "string"
|
|
1438
|
+
"type": "string",
|
|
1439
|
+
"description": "Human-readable label for the role as shown in admin UIs or documentation (e.g. 'Billing Administrator'). Set it whenever the machine name differs from what users see."
|
|
1139
1440
|
},
|
|
1140
1441
|
"description": {
|
|
1141
|
-
"type": "string"
|
|
1442
|
+
"type": "string",
|
|
1443
|
+
"description": "Free-text statement of the role's intended responsibilities and the kind of actor expected to hold it. Set it when the purpose is not obvious from the name."
|
|
1142
1444
|
},
|
|
1143
1445
|
"level": {
|
|
1144
|
-
"type": "integer"
|
|
1446
|
+
"type": "integer",
|
|
1447
|
+
"description": "Integer privilege tier used for least-privilege comparison, where higher values denote broader privilege by convention. Set it consistently across all roles in the same SecurityModel."
|
|
1145
1448
|
},
|
|
1146
1449
|
"inheritsFrom": {
|
|
1147
1450
|
"type": "string",
|
|
@@ -1152,12 +1455,24 @@
|
|
|
1152
1455
|
"additionalProperties": false
|
|
1153
1456
|
}
|
|
1154
1457
|
},
|
|
1458
|
+
"x-dr-standard": "NIST SP 800-53 AC-3(7) Role-Based Access Control (with AC-2 and AC-6)",
|
|
1459
|
+
"x-dr-evidence": [
|
|
1460
|
+
"An enum, constant set or database 'roles' table of role names (e.g. ADMIN, EDITOR, VIEWER) referenced by user-to-role assignment code.",
|
|
1461
|
+
"Authorization guards keyed on a role name, such as @RolesAllowed(\"admin\"), @PreAuthorize(\"hasRole('ADMIN')\"), requireRole('editor') middleware, or a route/navigation guard checking user.roles.",
|
|
1462
|
+
"A configuration or manifest mapping a role name to a permission list and optional parent, e.g. roles.yaml with 'permissions:' and 'inherits:' keys, Keycloak realm/composite roles, or Kubernetes Role/ClusterRole objects."
|
|
1463
|
+
],
|
|
1464
|
+
"x-dr-distinguish": {
|
|
1465
|
+
"security.actor": "the element is the principal itself (a user, service account or external system) that holds roles, not the grouping it is assigned to.",
|
|
1466
|
+
"security.permission": "the element is a single action-on-resource grant (e.g. 'orders:delete') rather than a named bundle of such grants.",
|
|
1467
|
+
"security.delegation": "authority is transferred from one specific actor to another, usually time-bounded or revocable, rather than held through standing role membership.",
|
|
1468
|
+
"security.informationright": "access is granted directly to a named actor on an InformationEntity under a constraint expression, with no intermediate role."
|
|
1469
|
+
},
|
|
1155
1470
|
"$id": "urn:dr:spec:node:security.role"
|
|
1156
1471
|
},
|
|
1157
1472
|
"secureresource": {
|
|
1158
1473
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
1159
1474
|
"title": "SecureResource",
|
|
1160
|
-
"description": "
|
|
1475
|
+
"description": "A protected object in an access control model — an API, database, file, service, UI area or stream — named as the target of authorization decisions and owning the set of ResourceOperations permitted on it and any FieldAccessControls over its fields. It is the 'object' of a subject-action-object triple, not the grant, rule or operation applied to it. Use InformationEntity instead when the thing protected is a logical information asset (e.g. customer PII) governed by InformationRight grants and classification, independent of the system resource that stores or exposes it. Use ResourceOperation instead when the element is a specific verb (read, approve, export) permitted on the resource rather than the resource itself. Use Permission instead when the element is a grant of an action on a resource assigned to a role, rather than the resource being protected. Use FieldAccessControl instead when the restriction applies to a single field's masking or redaction inside a resource rather than to the resource as a whole.",
|
|
1161
1476
|
"allOf": [
|
|
1162
1477
|
{
|
|
1163
1478
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -1177,7 +1492,8 @@
|
|
|
1177
1492
|
"type": "object",
|
|
1178
1493
|
"properties": {
|
|
1179
1494
|
"resource": {
|
|
1180
|
-
"type": "string"
|
|
1495
|
+
"type": "string",
|
|
1496
|
+
"description": "Canonical identifier of the protected object as used in authorization checks — e.g. an API path pattern ('/api/orders/*'), table name, bucket URI or permission-string resource key; set it to the exact value enforcement code matches against."
|
|
1181
1497
|
},
|
|
1182
1498
|
"type": {
|
|
1183
1499
|
"type": "string",
|
|
@@ -1185,19 +1501,32 @@
|
|
|
1185
1501
|
"description": "Category of protected resource, used to apply appropriate access control and audit policies per NIST SP 800-53 AC-3."
|
|
1186
1502
|
},
|
|
1187
1503
|
"description": {
|
|
1188
|
-
"type": "string"
|
|
1504
|
+
"type": "string",
|
|
1505
|
+
"description": "Free-text explanation of what the resource contains or exposes and why it requires protection; set it when the identifier alone does not convey sensitivity or scope."
|
|
1189
1506
|
}
|
|
1190
1507
|
},
|
|
1191
1508
|
"required": ["resource", "type"],
|
|
1192
1509
|
"additionalProperties": false
|
|
1193
1510
|
}
|
|
1194
1511
|
},
|
|
1512
|
+
"x-dr-standard": "NIST SP 800-53 AC-3 (Access Enforcement) — protected object; XACML 3.0 Resource attribute category",
|
|
1513
|
+
"x-dr-evidence": [
|
|
1514
|
+
"A route group, controller or API path prefix wrapped by an authorization guard or middleware (e.g. @PreAuthorize, router.use(requireAuth), [Authorize]) that names the protected resource",
|
|
1515
|
+
"A resource identifier string used as the object argument in permission checks (e.g. can(user, 'update', 'invoice'), enforcer.enforce(sub, 'orders', act)) or as a resource entry in a Casbin/OPA/IAM policy file",
|
|
1516
|
+
"A database table, bucket or topic declared in an IAM/RLS/ACL configuration (e.g. Postgres row-level security policy, S3 bucket policy, Kafka ACL) restricting which principals may operate on it"
|
|
1517
|
+
],
|
|
1518
|
+
"x-dr-distinguish": {
|
|
1519
|
+
"security.informationentity": "the thing protected is a logical information asset (e.g. customer PII) governed by InformationRight grants and classification, independent of the system resource that stores or exposes it",
|
|
1520
|
+
"security.resourceoperation": "the element is a specific verb (read, approve, export) permitted on the resource rather than the resource itself",
|
|
1521
|
+
"security.permission": "the element is a grant of an action on a resource assigned to a role, rather than the resource being protected",
|
|
1522
|
+
"security.fieldaccesscontrol": "the restriction applies to a single field's masking or redaction inside a resource rather than to the resource as a whole"
|
|
1523
|
+
},
|
|
1195
1524
|
"$id": "urn:dr:spec:node:security.secureresource"
|
|
1196
1525
|
},
|
|
1197
1526
|
"securityconstraints": {
|
|
1198
1527
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
1199
1528
|
"title": "SecurityConstraints",
|
|
1200
|
-
"description": "An
|
|
1529
|
+
"description": "An application-scoped container that groups the procedural, workflow-level access constraints (SeparationOfDuty, BindingOfDuty and NeedToKnow rules) applied within a SecurityModel. It holds no predicate or decision logic of its own; its content is the set of duty and purpose constraints it aggregates. Use SeparationOfDuty instead when modelling one specific rule that two tasks or roles must be held by different actors, rather than the collection of all such rules for the application. Use SecurityPolicy instead when the artifact is a prioritized set of evaluable rules with permit/deny effects targeting endpoints, data or roles, rather than a grouping of duty and need-to-know constraints. Use SecurityModel instead when the element is the root security specification for the application, composing authentication, roles, threats, classification and policies, not only the procedural constraints. Use NeedToKnow instead when modelling a single purpose-justification requirement for one resource rather than the grouping container.",
|
|
1201
1530
|
"allOf": [
|
|
1202
1531
|
{
|
|
1203
1532
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -1217,18 +1546,31 @@
|
|
|
1217
1546
|
"type": "object",
|
|
1218
1547
|
"properties": {
|
|
1219
1548
|
"version": {
|
|
1220
|
-
"type": "string"
|
|
1549
|
+
"type": "string",
|
|
1550
|
+
"description": "Version identifier of this constraint set (e.g. semantic version '1.2.0' or a dated revision), set when the grouped duty and need-to-know rules are versioned independently of the enclosing SecurityModel."
|
|
1221
1551
|
}
|
|
1222
1552
|
},
|
|
1223
1553
|
"additionalProperties": false
|
|
1224
1554
|
}
|
|
1225
1555
|
},
|
|
1556
|
+
"x-dr-standard": "NIST SP 800-53 AC-5 (Separation of Duties), with AC-6 need-to-know restrictions",
|
|
1557
|
+
"x-dr-evidence": [
|
|
1558
|
+
"a dedicated configuration block or file (e.g. 'constraints:' or 'duty-rules.yaml') listing separation-of-duty pairs, binding-of-duty tasks and need-to-know resources together",
|
|
1559
|
+
"a registry or module (e.g. WorkflowConstraintRegistry, DutyConstraintService) that loads and applies several SoD/BoD/purpose checks to workflow transitions such as request/approve",
|
|
1560
|
+
"a documentation section titled e.g. 'Procedural Access Constraints' or 'Segregation of Duties Matrix' enumerating mutually exclusive roles and task-continuity rules for one application"
|
|
1561
|
+
],
|
|
1562
|
+
"x-dr-distinguish": {
|
|
1563
|
+
"security.separationofduty": "modelling one specific rule that two tasks or roles must be held by different actors, rather than the collection of all such rules for the application",
|
|
1564
|
+
"security.securitypolicy": "the artifact is a prioritized set of evaluable rules with permit/deny effects targeting endpoints, data or roles, rather than a grouping of duty and need-to-know constraints",
|
|
1565
|
+
"security.securitymodel": "the element is the root security specification for the application, composing authentication, roles, threats, classification and policies, not only the procedural constraints",
|
|
1566
|
+
"security.needtoknow": "modelling a single purpose-justification requirement for one resource rather than the grouping container"
|
|
1567
|
+
},
|
|
1226
1568
|
"$id": "urn:dr:spec:node:security.securityconstraints"
|
|
1227
1569
|
},
|
|
1228
1570
|
"securitymodel": {
|
|
1229
1571
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
1230
1572
|
"title": "SecurityModel",
|
|
1231
|
-
"description": "
|
|
1573
|
+
"description": "A root container element that groups every security element (actors, authentication configuration, roles, permissions, secure resources, policies, constraints, threats, data classification and accountability requirements) defined for exactly one application or bounded context. There is one instance per application; it names that application and its access control paradigm. Use SecurityConstraints instead when the container groups only procedural constraints (SeparationOfDuty, BindingOfDuty, NeedToKnow) and not the whole security posture of the application. Use SecurityPolicy instead when the element is a single prioritized set of evaluation rules targeting particular resources or operations, not the umbrella specification for the application. Use AuthenticationConfig instead when the code or config only sets up identity verification (provider, MFA, session timeout) and does not also cover authorization, threats or policies.",
|
|
1232
1574
|
"allOf": [
|
|
1233
1575
|
{
|
|
1234
1576
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -1248,7 +1590,8 @@
|
|
|
1248
1590
|
"type": "object",
|
|
1249
1591
|
"properties": {
|
|
1250
1592
|
"version": {
|
|
1251
|
-
"type": "string"
|
|
1593
|
+
"type": "string",
|
|
1594
|
+
"description": "Version identifier of this security specification, as a semantic version or date string such as '2.1.0' or '2024-06'. Increment it when the composed roles, policies, constraints or threat model change, so that audits can reference a specific posture."
|
|
1252
1595
|
},
|
|
1253
1596
|
"application": {
|
|
1254
1597
|
"type": "string",
|
|
@@ -1264,12 +1607,23 @@
|
|
|
1264
1607
|
"additionalProperties": false
|
|
1265
1608
|
}
|
|
1266
1609
|
},
|
|
1610
|
+
"x-dr-standard": "NIST SP 800-53 PL-2 (System Security and Privacy Plans)",
|
|
1611
|
+
"x-dr-evidence": [
|
|
1612
|
+
"A top-level security configuration entry point for one application (e.g. a Spring class annotated @EnableWebSecurity, a NestJS SecurityModule, or a root security.yaml/policy bundle) that wires together the authentication provider, role/permission definitions and access policies.",
|
|
1613
|
+
"A central registry module that exports the application's role, permission and resource-action maps together with the authorization strategy in use (e.g. a Casbin model file declaring RBAC/ABAC, or an OPA bundle manifest scoped to one service).",
|
|
1614
|
+
"A per-application security architecture or threat-model document (system security plan, STRIDE worksheet, security.md) that lists actors, protected resources, threats, data classifications and controls under a single version number."
|
|
1615
|
+
],
|
|
1616
|
+
"x-dr-distinguish": {
|
|
1617
|
+
"security.securityconstraints": "the container groups only procedural constraints (SeparationOfDuty, BindingOfDuty, NeedToKnow) and not the whole security posture of the application.",
|
|
1618
|
+
"security.securitypolicy": "the element is a single prioritized set of evaluation rules targeting particular resources or operations, not the umbrella specification for the application.",
|
|
1619
|
+
"security.authenticationconfig": "the code or config only sets up identity verification (provider, MFA, session timeout) and does not also cover authorization, threats or policies."
|
|
1620
|
+
},
|
|
1267
1621
|
"$id": "urn:dr:spec:node:security.securitymodel"
|
|
1268
1622
|
},
|
|
1269
1623
|
"securitypolicy": {
|
|
1270
1624
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
1271
1625
|
"title": "SecurityPolicy",
|
|
1272
|
-
"description": "A named, prioritized
|
|
1626
|
+
"description": "A named, prioritized container of ordered PolicyRules that together produce an access-control decision for one category of target (endpoint, service, data, user, role or resource). When several policies match, they are evaluated by priority. It corresponds to an XACML Policy, not to a single rule, condition or enforcement action. Use PolicyRule instead when the element is a single condition-plus-effect (permit/deny) evaluation unit rather than a named, prioritized grouping of such units. Use PolicyAction instead when the element is the enforcement response (deny, log, rate-limit, mask, etc.) executed when a rule matches, not the policy that contains the rules. Use SecurityConstraints instead when the element groups procedural SeparationOfDuty, BindingOfDuty or NeedToKnow constraints rather than ordered access-decision rules. Use SecurityModel instead when the element is the application-wide root aggregating authentication, roles, threats and all policies, rather than one targeted policy.",
|
|
1273
1627
|
"allOf": [
|
|
1274
1628
|
{
|
|
1275
1629
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -1289,13 +1643,16 @@
|
|
|
1289
1643
|
"type": "object",
|
|
1290
1644
|
"properties": {
|
|
1291
1645
|
"description": {
|
|
1292
|
-
"type": "string"
|
|
1646
|
+
"type": "string",
|
|
1647
|
+
"description": "Free-text summary of the policy's intent and the access decisions it governs; set it whenever the policy name alone does not convey its purpose."
|
|
1293
1648
|
},
|
|
1294
1649
|
"enabled": {
|
|
1295
|
-
"type": "boolean"
|
|
1650
|
+
"type": "boolean",
|
|
1651
|
+
"description": "Boolean indicating whether the policy is currently active in evaluation; set it to false for policies that are defined but switched off, and omit it or set it to true otherwise."
|
|
1296
1652
|
},
|
|
1297
1653
|
"priority": {
|
|
1298
|
-
"type": "integer"
|
|
1654
|
+
"type": "integer",
|
|
1655
|
+
"description": "Integer evaluation rank used to order policies against the same target, with higher values evaluated first and taking precedence when multiple policies match; always set it, using distinct values where order matters."
|
|
1299
1656
|
},
|
|
1300
1657
|
"target": {
|
|
1301
1658
|
"type": "string",
|
|
@@ -1323,12 +1680,24 @@
|
|
|
1323
1680
|
"additionalProperties": false
|
|
1324
1681
|
}
|
|
1325
1682
|
},
|
|
1683
|
+
"x-dr-standard": "NIST SP 800-53 AC-1 (Policy and Procedures); XACML 3.0 Policy element",
|
|
1684
|
+
"x-dr-evidence": [
|
|
1685
|
+
"A named policy file or block (OPA/Rego package, Cedar policy set, XACML <Policy>, Casbin policy, AWS IAM policy document) containing multiple allow/deny rules",
|
|
1686
|
+
"A policy registry or middleware that loads named policies with an explicit priority, order or weight and evaluates them in sequence against a request",
|
|
1687
|
+
"A configuration entry that pairs a list of rules with a target selector (route pattern, service name, data type) and carries an enabled or disabled flag"
|
|
1688
|
+
],
|
|
1689
|
+
"x-dr-distinguish": {
|
|
1690
|
+
"security.policyrule": "the element is a single condition-plus-effect (permit/deny) evaluation unit rather than a named, prioritized grouping of such units",
|
|
1691
|
+
"security.policyaction": "the element is the enforcement response (deny, log, rate-limit, mask, etc.) executed when a rule matches, not the policy that contains the rules",
|
|
1692
|
+
"security.securityconstraints": "the element groups procedural SeparationOfDuty, BindingOfDuty or NeedToKnow constraints rather than ordered access-decision rules",
|
|
1693
|
+
"security.securitymodel": "the element is the application-wide root aggregating authentication, roles, threats and all policies, rather than one targeted policy"
|
|
1694
|
+
},
|
|
1326
1695
|
"$id": "urn:dr:spec:node:security.securitypolicy"
|
|
1327
1696
|
},
|
|
1328
1697
|
"separationofduty": {
|
|
1329
1698
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
1330
1699
|
"title": "SeparationOfDuty",
|
|
1331
|
-
"description": "
|
|
1700
|
+
"description": "A procedural access-control constraint requiring that two or more conflicting tasks or roles in a workflow (e.g., request and approve, initiate and authorize) are held or performed by different actors. It may be static, where the roles are mutually exclusive in assignment, or dynamic, where the same subject is barred from executing a later step on an item it acted on earlier. Use BindingOfDuty instead when the rule requires the same actor who started a task to also complete it, rather than forbidding the same actor from performing both steps. Use PolicyRule instead when the logic is a generic condition-plus-effect evaluation (permit/deny) not specifically about preventing one subject from holding or exercising conflicting duties. Use Role instead when the thing being modelled is the named permission bundle itself rather than the exclusion constraint between bundles. Use NeedToKnow instead when access is restricted by the actor's declared purpose rather than by conflict with another task or role the actor holds.",
|
|
1332
1701
|
"allOf": [
|
|
1333
1702
|
{
|
|
1334
1703
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -1348,10 +1717,12 @@
|
|
|
1348
1717
|
"type": "object",
|
|
1349
1718
|
"properties": {
|
|
1350
1719
|
"description": {
|
|
1351
|
-
"type": "string"
|
|
1720
|
+
"type": "string",
|
|
1721
|
+
"description": "Free-text explanation of which tasks or roles are separated and the risk being controlled (e.g., 'Invoice creators may not approve invoices they created'); set whenever the rule's intent is not obvious from its name."
|
|
1352
1722
|
},
|
|
1353
1723
|
"message": {
|
|
1354
|
-
"type": "string"
|
|
1724
|
+
"type": "string",
|
|
1725
|
+
"description": "Human-readable violation text returned to the user or written to logs when the constraint blocks an assignment or action (e.g., 'You cannot approve a request you submitted')."
|
|
1355
1726
|
},
|
|
1356
1727
|
"mutuallyExclusive": {
|
|
1357
1728
|
"type": "boolean",
|
|
@@ -1362,12 +1733,24 @@
|
|
|
1362
1733
|
"additionalProperties": false
|
|
1363
1734
|
}
|
|
1364
1735
|
},
|
|
1736
|
+
"x-dr-standard": "NIST SP 800-53 AC-5 Separation of Duties",
|
|
1737
|
+
"x-dr-evidence": [
|
|
1738
|
+
"An approval handler that rejects the request when approver.id equals the request's createdBy/submittedBy field, often with an error like 'cannot approve your own request'.",
|
|
1739
|
+
"A role-assignment validator or config list of mutually exclusive role pairs (e.g., 'conflictingRoles: [payment_creator, payment_approver]') checked when granting roles.",
|
|
1740
|
+
"A maker-checker or four-eyes workflow configuration requiring a distinct second user to authorize a step, such as a minimum-distinct-approvers setting or a branch-protection rule that disallows self-approval."
|
|
1741
|
+
],
|
|
1742
|
+
"x-dr-distinguish": {
|
|
1743
|
+
"security.bindingofduty": "the rule requires the same actor who started a task to also complete it, rather than forbidding the same actor from performing both steps.",
|
|
1744
|
+
"security.policyrule": "the logic is a generic condition-plus-effect evaluation (permit/deny) not specifically about preventing one subject from holding or exercising conflicting duties.",
|
|
1745
|
+
"security.role": "the thing being modelled is the named permission bundle itself rather than the exclusion constraint between bundles.",
|
|
1746
|
+
"security.needtoknow": "access is restricted by the actor's declared purpose rather than by conflict with another task or role the actor holds."
|
|
1747
|
+
},
|
|
1365
1748
|
"$id": "urn:dr:spec:node:security.separationofduty"
|
|
1366
1749
|
},
|
|
1367
1750
|
"threat": {
|
|
1368
1751
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
1369
1752
|
"title": "Threat",
|
|
1370
|
-
"description": "
|
|
1753
|
+
"description": "A threat-model entry naming a potential adverse event or attack technique (e.g., credential stuffing, SQL injection, privilege escalation) against an identified asset, rated by likelihood and impact. It records what could go wrong and how badly. It does not record the control that prevents it or the principal who carries it out. Use Countermeasure instead when the item is the control, check or mitigation technique that reduces a threat's likelihood or impact, such as input sanitisation, CSRF tokens or a WAF rule, rather than the attack itself. Use Actor instead when the item is the principal or adversary (human, service, external entity) whose identity and trust level are modelled, rather than the adverse event that principal might cause. Use PolicyRule instead when the item is an evaluable condition-plus-effect rule that permits or denies requests, even if it was written in response to a threat. Use ValidationRule instead when the item is a concrete pattern, range or length constraint on a field that blocks malicious input, rather than the injection or tampering risk it guards against.",
|
|
1371
1754
|
"allOf": [
|
|
1372
1755
|
{
|
|
1373
1756
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -1387,10 +1770,12 @@
|
|
|
1387
1770
|
"type": "object",
|
|
1388
1771
|
"properties": {
|
|
1389
1772
|
"description": {
|
|
1390
|
-
"type": "string"
|
|
1773
|
+
"type": "string",
|
|
1774
|
+
"description": "Free-text narrative of the threat scenario: attack vector, preconditions and the adverse outcome, optionally citing CWE/CAPEC/STRIDE identifiers; set whenever the name alone does not make the attack clear."
|
|
1391
1775
|
},
|
|
1392
1776
|
"threatens": {
|
|
1393
|
-
"type": "string"
|
|
1777
|
+
"type": "string",
|
|
1778
|
+
"description": "Identifier or name of the primary asset the threat endangers, such as a SecureResource, InformationEntity, business service or process; set to the most critical target when several apply."
|
|
1394
1779
|
},
|
|
1395
1780
|
"likelihood": {
|
|
1396
1781
|
"type": "string",
|
|
@@ -1416,12 +1801,24 @@
|
|
|
1416
1801
|
"additionalProperties": false
|
|
1417
1802
|
}
|
|
1418
1803
|
},
|
|
1804
|
+
"x-dr-standard": "NIST SP 800-53 RA-3 Risk Assessment (threat events per NIST SP 800-30 Rev.1 Appendix E)",
|
|
1805
|
+
"x-dr-evidence": [
|
|
1806
|
+
"A threat-model artefact checked into the repository that lists threat entries with likelihood/impact or risk ratings, such as an OWASP Threat Dragon JSON file, a Microsoft Threat Modeling Tool .tm7 file, or a threat-model.md with a STRIDE table.",
|
|
1807
|
+
"Code comments, ADRs or security docs that cite CWE, CAPEC or OWASP Top 10 identifiers (e.g., '// guards against CWE-89 SQL injection') adjacent to the code they protect.",
|
|
1808
|
+
"Security test cases or abuse-case specs named after attack scenarios (e.g., test_rejects_sql_injection, it('blocks replayed JWT')) that assert a specific attack fails."
|
|
1809
|
+
],
|
|
1810
|
+
"x-dr-distinguish": {
|
|
1811
|
+
"security.countermeasure": "the item is the control, check or mitigation technique that reduces a threat's likelihood or impact, such as input sanitisation, CSRF tokens or a WAF rule, rather than the attack itself.",
|
|
1812
|
+
"security.actor": "the item is the principal or adversary (human, service, external entity) whose identity and trust level are modelled, rather than the adverse event that principal might cause.",
|
|
1813
|
+
"security.policyrule": "the item is an evaluable condition-plus-effect rule that permits or denies requests, even if it was written in response to a threat.",
|
|
1814
|
+
"security.validationrule": "the item is a concrete pattern, range or length constraint on a field that blocks malicious input, rather than the injection or tampering risk it guards against."
|
|
1815
|
+
},
|
|
1419
1816
|
"$id": "urn:dr:spec:node:security.threat"
|
|
1420
1817
|
},
|
|
1421
1818
|
"validationrule": {
|
|
1422
1819
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
1423
1820
|
"title": "ValidationRule",
|
|
1424
|
-
"description": "
|
|
1821
|
+
"description": "A single input-validation constraint (regex pattern, numeric range, length limit, allowed-value list or custom check) that the value of a protected field or request attribute must satisfy, with a violation message and severity. It accepts or rejects the value itself and does not decide who may access it. Use AccessCondition instead when the predicate tests a request-context attribute (user, role, time, IP) to decide whether the request is authorized, rather than checking that a supplied value is well-formed. Use FieldAccessControl instead when the concern is how a field's value is masked, redacted or hidden from unauthorized principals, rather than which values are acceptable. Use PolicyRule instead when the unit produces a permit/deny decision with optional obligations, rather than a pass/fail check with a violation message. Use PasswordPolicy instead when the constraints are the complete credential complexity, rotation and lockout regime, rather than one individual check that such a policy might use.",
|
|
1425
1822
|
"allOf": [
|
|
1426
1823
|
{
|
|
1427
1824
|
"$ref": "urn:dr:spec:base:spec-node"
|
|
@@ -1467,21 +1864,22 @@
|
|
|
1467
1864
|
"additionalProperties": false
|
|
1468
1865
|
}
|
|
1469
1866
|
},
|
|
1867
|
+
"x-dr-standard": "NIST SP 800-53 SI-10 Information Input Validation",
|
|
1868
|
+
"x-dr-evidence": [
|
|
1869
|
+
"Bean Validation, Pydantic, Joi or Zod constraints such as @Pattern, @Size, constr(regex=...) or .max() declared on security-sensitive DTO fields like email, account number, token or redirect URL.",
|
|
1870
|
+
"Input-sanitization middleware or allowlist regexes that reject a request with HTTP 400/422 and a specific error message when a parameter fails the check.",
|
|
1871
|
+
"A validator function or schema entry named for the check (e.g. validateIban, SAFE_FILENAME_RE) referenced from an access-control or field-protection layer, with configurable severity or logging on failure."
|
|
1872
|
+
],
|
|
1873
|
+
"x-dr-distinguish": {
|
|
1874
|
+
"security.accesscondition": "the predicate tests a request-context attribute (user, role, time, IP) to decide whether the request is authorized, rather than checking that a supplied value is well-formed.",
|
|
1875
|
+
"security.fieldaccesscontrol": "the concern is how a field's value is masked, redacted or hidden from unauthorized principals, rather than which values are acceptable.",
|
|
1876
|
+
"security.policyrule": "the unit produces a permit/deny decision with optional obligations, rather than a pass/fail check with a violation message.",
|
|
1877
|
+
"security.passwordpolicy": "the constraints are the complete credential complexity, rotation and lockout regime, rather than one individual check that such a policy might use."
|
|
1878
|
+
},
|
|
1470
1879
|
"$id": "urn:dr:spec:node:security.validationrule"
|
|
1471
1880
|
}
|
|
1472
1881
|
},
|
|
1473
1882
|
"relationshipSchemas": {
|
|
1474
|
-
"security.accesscondition.composes.security.policyrule": {
|
|
1475
|
-
"id": "security.accesscondition.composes.security.policyrule",
|
|
1476
|
-
"source_spec_node_id": "security.accesscondition",
|
|
1477
|
-
"source_layer": "security",
|
|
1478
|
-
"destination_spec_node_id": "security.policyrule",
|
|
1479
|
-
"destination_layer": "security",
|
|
1480
|
-
"predicate": "composes",
|
|
1481
|
-
"cardinality": "many-to-many",
|
|
1482
|
-
"strength": "medium",
|
|
1483
|
-
"required": false
|
|
1484
|
-
},
|
|
1485
1883
|
"security.accesscondition.constrains.security.permission": {
|
|
1486
1884
|
"id": "security.accesscondition.constrains.security.permission",
|
|
1487
1885
|
"source_spec_node_id": "security.accesscondition",
|
|
@@ -1491,18 +1889,8 @@
|
|
|
1491
1889
|
"predicate": "constrains",
|
|
1492
1890
|
"cardinality": "many-to-many",
|
|
1493
1891
|
"strength": "medium",
|
|
1494
|
-
"required": false
|
|
1495
|
-
|
|
1496
|
-
"security.accesscondition.governs.security.fieldaccesscontrol": {
|
|
1497
|
-
"id": "security.accesscondition.governs.security.fieldaccesscontrol",
|
|
1498
|
-
"source_spec_node_id": "security.accesscondition",
|
|
1499
|
-
"source_layer": "security",
|
|
1500
|
-
"destination_spec_node_id": "security.fieldaccesscontrol",
|
|
1501
|
-
"destination_layer": "security",
|
|
1502
|
-
"predicate": "governs",
|
|
1503
|
-
"cardinality": "many-to-many",
|
|
1504
|
-
"strength": "medium",
|
|
1505
|
-
"required": false
|
|
1892
|
+
"required": false,
|
|
1893
|
+
"description": "The permission applies only while the condition holds, such as 'only during business hours'."
|
|
1506
1894
|
},
|
|
1507
1895
|
"security.accesscondition.references.security.secureresource": {
|
|
1508
1896
|
"id": "security.accesscondition.references.security.secureresource",
|
|
@@ -1513,40 +1901,20 @@
|
|
|
1513
1901
|
"predicate": "references",
|
|
1514
1902
|
"cardinality": "many-to-many",
|
|
1515
1903
|
"strength": "medium",
|
|
1516
|
-
"required": false
|
|
1517
|
-
|
|
1518
|
-
"security.accesscondition.uses.security.validationrule": {
|
|
1519
|
-
"id": "security.accesscondition.uses.security.validationrule",
|
|
1520
|
-
"source_spec_node_id": "security.accesscondition",
|
|
1521
|
-
"source_layer": "security",
|
|
1522
|
-
"destination_spec_node_id": "security.validationrule",
|
|
1523
|
-
"destination_layer": "security",
|
|
1524
|
-
"predicate": "uses",
|
|
1525
|
-
"cardinality": "many-to-many",
|
|
1526
|
-
"strength": "medium",
|
|
1527
|
-
"required": false
|
|
1904
|
+
"required": false,
|
|
1905
|
+
"description": "The condition tests a property of the resource, such as its owner or status."
|
|
1528
1906
|
},
|
|
1529
|
-
"security.accountabilityrequirement.
|
|
1530
|
-
"id": "security.accountabilityrequirement.
|
|
1907
|
+
"security.accountabilityrequirement.references.security.actor": {
|
|
1908
|
+
"id": "security.accountabilityrequirement.references.security.actor",
|
|
1531
1909
|
"source_spec_node_id": "security.accountabilityrequirement",
|
|
1532
1910
|
"source_layer": "security",
|
|
1533
1911
|
"destination_spec_node_id": "security.actor",
|
|
1534
1912
|
"destination_layer": "security",
|
|
1535
|
-
"predicate": "
|
|
1536
|
-
"cardinality": "many-to-many",
|
|
1537
|
-
"strength": "medium",
|
|
1538
|
-
"required": false
|
|
1539
|
-
},
|
|
1540
|
-
"security.accountabilityrequirement.requires.security.auditconfig": {
|
|
1541
|
-
"id": "security.accountabilityrequirement.requires.security.auditconfig",
|
|
1542
|
-
"source_spec_node_id": "security.accountabilityrequirement",
|
|
1543
|
-
"source_layer": "security",
|
|
1544
|
-
"destination_spec_node_id": "security.auditconfig",
|
|
1545
|
-
"destination_layer": "security",
|
|
1546
|
-
"predicate": "requires",
|
|
1913
|
+
"predicate": "references",
|
|
1547
1914
|
"cardinality": "many-to-many",
|
|
1548
1915
|
"strength": "medium",
|
|
1549
|
-
"required": false
|
|
1916
|
+
"required": false,
|
|
1917
|
+
"description": "The obligation applies to the actor, whose actions must be provably attributable."
|
|
1550
1918
|
},
|
|
1551
1919
|
"security.accountabilityrequirement.requires.security.evidence": {
|
|
1552
1920
|
"id": "security.accountabilityrequirement.requires.security.evidence",
|
|
@@ -1557,18 +1925,8 @@
|
|
|
1557
1925
|
"predicate": "requires",
|
|
1558
1926
|
"cardinality": "many-to-many",
|
|
1559
1927
|
"strength": "medium",
|
|
1560
|
-
"required": false
|
|
1561
|
-
|
|
1562
|
-
"security.accountabilityrequirement.requires.security.retentionpolicy": {
|
|
1563
|
-
"id": "security.accountabilityrequirement.requires.security.retentionpolicy",
|
|
1564
|
-
"source_spec_node_id": "security.accountabilityrequirement",
|
|
1565
|
-
"source_layer": "security",
|
|
1566
|
-
"destination_spec_node_id": "security.retentionpolicy",
|
|
1567
|
-
"destination_layer": "security",
|
|
1568
|
-
"predicate": "requires",
|
|
1569
|
-
"cardinality": "many-to-many",
|
|
1570
|
-
"strength": "medium",
|
|
1571
|
-
"required": false
|
|
1928
|
+
"required": false,
|
|
1929
|
+
"description": "The obligation needs this kind of evidence, such as a signed audit record."
|
|
1572
1930
|
},
|
|
1573
1931
|
"security.accountabilityrequirement.satisfies.motivation.requirement": {
|
|
1574
1932
|
"id": "security.accountabilityrequirement.satisfies.motivation.requirement",
|
|
@@ -1579,18 +1937,8 @@
|
|
|
1579
1937
|
"predicate": "satisfies",
|
|
1580
1938
|
"cardinality": "many-to-many",
|
|
1581
1939
|
"strength": "medium",
|
|
1582
|
-
"required": false
|
|
1583
|
-
|
|
1584
|
-
"security.actor.accesses.security.secureresource": {
|
|
1585
|
-
"id": "security.actor.accesses.security.secureresource",
|
|
1586
|
-
"source_spec_node_id": "security.actor",
|
|
1587
|
-
"source_layer": "security",
|
|
1588
|
-
"destination_spec_node_id": "security.secureresource",
|
|
1589
|
-
"destination_layer": "security",
|
|
1590
|
-
"predicate": "accesses",
|
|
1591
|
-
"cardinality": "many-to-many",
|
|
1592
|
-
"strength": "medium",
|
|
1593
|
-
"required": false
|
|
1940
|
+
"required": false,
|
|
1941
|
+
"description": "The accountability obligation meets the requirement, such as non-repudiation of payments."
|
|
1594
1942
|
},
|
|
1595
1943
|
"security.actor.assigned-to.security.role": {
|
|
1596
1944
|
"id": "security.actor.assigned-to.security.role",
|
|
@@ -1601,359 +1949,164 @@
|
|
|
1601
1949
|
"predicate": "assigned-to",
|
|
1602
1950
|
"cardinality": "many-to-many",
|
|
1603
1951
|
"strength": "medium",
|
|
1604
|
-
"required": false
|
|
1952
|
+
"required": false,
|
|
1953
|
+
"description": "The actor receives the role's permissions by being assigned to it."
|
|
1605
1954
|
},
|
|
1606
|
-
"security.
|
|
1607
|
-
"id": "security.
|
|
1608
|
-
"source_spec_node_id": "security.
|
|
1955
|
+
"security.auditconfig.generates.security.evidence": {
|
|
1956
|
+
"id": "security.auditconfig.generates.security.evidence",
|
|
1957
|
+
"source_spec_node_id": "security.auditconfig",
|
|
1609
1958
|
"source_layer": "security",
|
|
1610
|
-
"destination_spec_node_id": "security.
|
|
1959
|
+
"destination_spec_node_id": "security.evidence",
|
|
1611
1960
|
"destination_layer": "security",
|
|
1612
|
-
"predicate": "
|
|
1961
|
+
"predicate": "generates",
|
|
1613
1962
|
"cardinality": "many-to-many",
|
|
1614
1963
|
"strength": "medium",
|
|
1615
|
-
"required": false
|
|
1964
|
+
"required": false,
|
|
1965
|
+
"description": "The audit configuration writes this kind of evidence, such as an audit trail entry."
|
|
1616
1966
|
},
|
|
1617
|
-
"security.
|
|
1618
|
-
"id": "security.
|
|
1619
|
-
"source_spec_node_id": "security.
|
|
1967
|
+
"security.auditconfig.monitors.security.secureresource": {
|
|
1968
|
+
"id": "security.auditconfig.monitors.security.secureresource",
|
|
1969
|
+
"source_spec_node_id": "security.auditconfig",
|
|
1620
1970
|
"source_layer": "security",
|
|
1621
|
-
"destination_spec_node_id": "security.
|
|
1971
|
+
"destination_spec_node_id": "security.secureresource",
|
|
1622
1972
|
"destination_layer": "security",
|
|
1623
|
-
"predicate": "
|
|
1973
|
+
"predicate": "monitors",
|
|
1624
1974
|
"cardinality": "many-to-many",
|
|
1625
1975
|
"strength": "medium",
|
|
1626
|
-
"required": false
|
|
1976
|
+
"required": false,
|
|
1977
|
+
"description": "The audit configuration records security-relevant events on the resource."
|
|
1627
1978
|
},
|
|
1628
|
-
"security.
|
|
1629
|
-
"id": "security.
|
|
1630
|
-
"source_spec_node_id": "security.
|
|
1979
|
+
"security.auditconfig.satisfies.security.accountabilityrequirement": {
|
|
1980
|
+
"id": "security.auditconfig.satisfies.security.accountabilityrequirement",
|
|
1981
|
+
"source_spec_node_id": "security.auditconfig",
|
|
1631
1982
|
"source_layer": "security",
|
|
1632
|
-
"destination_spec_node_id": "security.
|
|
1983
|
+
"destination_spec_node_id": "security.accountabilityrequirement",
|
|
1633
1984
|
"destination_layer": "security",
|
|
1634
|
-
"predicate": "
|
|
1985
|
+
"predicate": "satisfies",
|
|
1635
1986
|
"cardinality": "many-to-many",
|
|
1636
1987
|
"strength": "medium",
|
|
1637
|
-
"required": false
|
|
1988
|
+
"required": false,
|
|
1989
|
+
"description": "The audit configuration meets the accountability requirement by recording the actions it names."
|
|
1638
1990
|
},
|
|
1639
|
-
"security.
|
|
1640
|
-
"id": "security.
|
|
1641
|
-
"source_spec_node_id": "security.
|
|
1991
|
+
"security.authenticationconfig.authenticates.security.actor": {
|
|
1992
|
+
"id": "security.authenticationconfig.authenticates.security.actor",
|
|
1993
|
+
"source_spec_node_id": "security.authenticationconfig",
|
|
1642
1994
|
"source_layer": "security",
|
|
1643
|
-
"destination_spec_node_id": "security.
|
|
1995
|
+
"destination_spec_node_id": "security.actor",
|
|
1644
1996
|
"destination_layer": "security",
|
|
1645
|
-
"predicate": "
|
|
1997
|
+
"predicate": "authenticates",
|
|
1646
1998
|
"cardinality": "many-to-many",
|
|
1647
1999
|
"strength": "medium",
|
|
1648
|
-
"required": false
|
|
2000
|
+
"required": false,
|
|
2001
|
+
"description": "The configuration is how the actor proves its identity."
|
|
1649
2002
|
},
|
|
1650
|
-
"security.
|
|
1651
|
-
"id": "security.
|
|
1652
|
-
"source_spec_node_id": "security.
|
|
2003
|
+
"security.authenticationconfig.constrained-by.security.securitypolicy": {
|
|
2004
|
+
"id": "security.authenticationconfig.constrained-by.security.securitypolicy",
|
|
2005
|
+
"source_spec_node_id": "security.authenticationconfig",
|
|
1653
2006
|
"source_layer": "security",
|
|
1654
|
-
"destination_spec_node_id": "security.
|
|
2007
|
+
"destination_spec_node_id": "security.securitypolicy",
|
|
1655
2008
|
"destination_layer": "security",
|
|
1656
|
-
"predicate": "
|
|
2009
|
+
"predicate": "constrained-by",
|
|
1657
2010
|
"cardinality": "many-to-many",
|
|
1658
2011
|
"strength": "medium",
|
|
1659
|
-
"required": false
|
|
2012
|
+
"required": false,
|
|
2013
|
+
"description": "The policy limits how authentication may work, such as requiring a second factor."
|
|
1660
2014
|
},
|
|
1661
|
-
"security.
|
|
1662
|
-
"id": "security.
|
|
1663
|
-
"source_spec_node_id": "security.
|
|
2015
|
+
"security.authenticationconfig.protects.security.secureresource": {
|
|
2016
|
+
"id": "security.authenticationconfig.protects.security.secureresource",
|
|
2017
|
+
"source_spec_node_id": "security.authenticationconfig",
|
|
1664
2018
|
"source_layer": "security",
|
|
1665
|
-
"destination_spec_node_id": "security.
|
|
2019
|
+
"destination_spec_node_id": "security.secureresource",
|
|
1666
2020
|
"destination_layer": "security",
|
|
1667
|
-
"predicate": "
|
|
2021
|
+
"predicate": "protects",
|
|
1668
2022
|
"cardinality": "many-to-many",
|
|
1669
2023
|
"strength": "medium",
|
|
1670
|
-
"required": false
|
|
2024
|
+
"required": false,
|
|
2025
|
+
"description": "Access to the resource requires authenticating through the configuration."
|
|
1671
2026
|
},
|
|
1672
|
-
"security.
|
|
1673
|
-
"id": "security.
|
|
1674
|
-
"source_spec_node_id": "security.
|
|
2027
|
+
"security.authenticationconfig.uses.security.passwordpolicy": {
|
|
2028
|
+
"id": "security.authenticationconfig.uses.security.passwordpolicy",
|
|
2029
|
+
"source_spec_node_id": "security.authenticationconfig",
|
|
1675
2030
|
"source_layer": "security",
|
|
1676
|
-
"destination_spec_node_id": "security.
|
|
2031
|
+
"destination_spec_node_id": "security.passwordpolicy",
|
|
1677
2032
|
"destination_layer": "security",
|
|
1678
|
-
"predicate": "
|
|
2033
|
+
"predicate": "uses",
|
|
1679
2034
|
"cardinality": "many-to-many",
|
|
1680
2035
|
"strength": "medium",
|
|
1681
|
-
"required": false
|
|
2036
|
+
"required": false,
|
|
2037
|
+
"description": "The configuration applies the password policy to the memorized secrets it accepts."
|
|
1682
2038
|
},
|
|
1683
|
-
"security.
|
|
1684
|
-
"id": "security.
|
|
1685
|
-
"source_spec_node_id": "security.
|
|
2039
|
+
"security.bindingofduty.constrains.security.role": {
|
|
2040
|
+
"id": "security.bindingofduty.constrains.security.role",
|
|
2041
|
+
"source_spec_node_id": "security.bindingofduty",
|
|
1686
2042
|
"source_layer": "security",
|
|
1687
|
-
"destination_spec_node_id": "security.
|
|
2043
|
+
"destination_spec_node_id": "security.role",
|
|
1688
2044
|
"destination_layer": "security",
|
|
1689
|
-
"predicate": "
|
|
2045
|
+
"predicate": "constrains",
|
|
1690
2046
|
"cardinality": "many-to-many",
|
|
1691
2047
|
"strength": "medium",
|
|
1692
|
-
"required": false
|
|
2048
|
+
"required": false,
|
|
2049
|
+
"description": "Holders of the role must perform the bound steps themselves."
|
|
1693
2050
|
},
|
|
1694
|
-
"security.
|
|
1695
|
-
"id": "security.
|
|
1696
|
-
"source_spec_node_id": "security.
|
|
2051
|
+
"security.bindingofduty.governs.security.resourceoperation": {
|
|
2052
|
+
"id": "security.bindingofduty.governs.security.resourceoperation",
|
|
2053
|
+
"source_spec_node_id": "security.bindingofduty",
|
|
1697
2054
|
"source_layer": "security",
|
|
1698
|
-
"destination_spec_node_id": "security.
|
|
2055
|
+
"destination_spec_node_id": "security.resourceoperation",
|
|
1699
2056
|
"destination_layer": "security",
|
|
1700
2057
|
"predicate": "governs",
|
|
1701
2058
|
"cardinality": "many-to-many",
|
|
1702
2059
|
"strength": "medium",
|
|
1703
|
-
"required": false
|
|
2060
|
+
"required": false,
|
|
2061
|
+
"description": "The operation is one of the steps that must be performed by the same actor."
|
|
1704
2062
|
},
|
|
1705
|
-
"security.
|
|
1706
|
-
"id": "security.
|
|
1707
|
-
"source_spec_node_id": "security.
|
|
2063
|
+
"security.bindingofduty.references.security.evidence": {
|
|
2064
|
+
"id": "security.bindingofduty.references.security.evidence",
|
|
2065
|
+
"source_spec_node_id": "security.bindingofduty",
|
|
1708
2066
|
"source_layer": "security",
|
|
1709
|
-
"destination_spec_node_id": "security.
|
|
2067
|
+
"destination_spec_node_id": "security.evidence",
|
|
1710
2068
|
"destination_layer": "security",
|
|
1711
|
-
"predicate": "
|
|
2069
|
+
"predicate": "references",
|
|
1712
2070
|
"cardinality": "many-to-many",
|
|
1713
2071
|
"strength": "medium",
|
|
1714
|
-
"required": false
|
|
2072
|
+
"required": false,
|
|
2073
|
+
"description": "The evidence shows who performed each bound step."
|
|
1715
2074
|
},
|
|
1716
|
-
"security.
|
|
1717
|
-
"id": "security.
|
|
1718
|
-
"source_spec_node_id": "security.
|
|
2075
|
+
"security.bindingofduty.supports.security.accountabilityrequirement": {
|
|
2076
|
+
"id": "security.bindingofduty.supports.security.accountabilityrequirement",
|
|
2077
|
+
"source_spec_node_id": "security.bindingofduty",
|
|
1719
2078
|
"source_layer": "security",
|
|
1720
|
-
"destination_spec_node_id": "security.
|
|
2079
|
+
"destination_spec_node_id": "security.accountabilityrequirement",
|
|
1721
2080
|
"destination_layer": "security",
|
|
1722
|
-
"predicate": "
|
|
2081
|
+
"predicate": "supports",
|
|
1723
2082
|
"cardinality": "many-to-many",
|
|
1724
2083
|
"strength": "medium",
|
|
1725
|
-
"required": false
|
|
2084
|
+
"required": false,
|
|
2085
|
+
"description": "Binding the steps to one actor helps attribute the work, as the obligation requires."
|
|
1726
2086
|
},
|
|
1727
|
-
"security.
|
|
1728
|
-
"id": "security.
|
|
1729
|
-
"source_spec_node_id": "security.
|
|
2087
|
+
"security.condition.aggregates.security.accesscondition": {
|
|
2088
|
+
"id": "security.condition.aggregates.security.accesscondition",
|
|
2089
|
+
"source_spec_node_id": "security.condition",
|
|
1730
2090
|
"source_layer": "security",
|
|
1731
|
-
"destination_spec_node_id": "security.
|
|
2091
|
+
"destination_spec_node_id": "security.accesscondition",
|
|
1732
2092
|
"destination_layer": "security",
|
|
1733
|
-
"predicate": "
|
|
2093
|
+
"predicate": "aggregates",
|
|
1734
2094
|
"cardinality": "many-to-many",
|
|
1735
2095
|
"strength": "medium",
|
|
1736
|
-
"required": false
|
|
2096
|
+
"required": false,
|
|
2097
|
+
"description": "The condition combines the access condition with others into one reusable expression."
|
|
1737
2098
|
},
|
|
1738
|
-
"security.
|
|
1739
|
-
"id": "security.
|
|
1740
|
-
"source_spec_node_id": "security.
|
|
2099
|
+
"security.countermeasure.mitigates.security.threat": {
|
|
2100
|
+
"id": "security.countermeasure.mitigates.security.threat",
|
|
2101
|
+
"source_spec_node_id": "security.countermeasure",
|
|
1741
2102
|
"source_layer": "security",
|
|
1742
|
-
"destination_spec_node_id": "security.
|
|
2103
|
+
"destination_spec_node_id": "security.threat",
|
|
1743
2104
|
"destination_layer": "security",
|
|
1744
|
-
"predicate": "
|
|
2105
|
+
"predicate": "mitigates",
|
|
1745
2106
|
"cardinality": "many-to-many",
|
|
1746
2107
|
"strength": "medium",
|
|
1747
|
-
"required": false
|
|
1748
|
-
|
|
1749
|
-
"security.authenticationconfig.authenticates.security.actor": {
|
|
1750
|
-
"id": "security.authenticationconfig.authenticates.security.actor",
|
|
1751
|
-
"source_spec_node_id": "security.authenticationconfig",
|
|
1752
|
-
"source_layer": "security",
|
|
1753
|
-
"destination_spec_node_id": "security.actor",
|
|
1754
|
-
"destination_layer": "security",
|
|
1755
|
-
"predicate": "authenticates",
|
|
1756
|
-
"cardinality": "many-to-many",
|
|
1757
|
-
"strength": "medium",
|
|
1758
|
-
"required": false
|
|
1759
|
-
},
|
|
1760
|
-
"security.authenticationconfig.constrained-by.security.securitypolicy": {
|
|
1761
|
-
"id": "security.authenticationconfig.constrained-by.security.securitypolicy",
|
|
1762
|
-
"source_spec_node_id": "security.authenticationconfig",
|
|
1763
|
-
"source_layer": "security",
|
|
1764
|
-
"destination_spec_node_id": "security.securitypolicy",
|
|
1765
|
-
"destination_layer": "security",
|
|
1766
|
-
"predicate": "constrained-by",
|
|
1767
|
-
"cardinality": "many-to-many",
|
|
1768
|
-
"strength": "medium",
|
|
1769
|
-
"required": false
|
|
1770
|
-
},
|
|
1771
|
-
"security.authenticationconfig.depends-on.security.auditconfig": {
|
|
1772
|
-
"id": "security.authenticationconfig.depends-on.security.auditconfig",
|
|
1773
|
-
"source_spec_node_id": "security.authenticationconfig",
|
|
1774
|
-
"source_layer": "security",
|
|
1775
|
-
"destination_spec_node_id": "security.auditconfig",
|
|
1776
|
-
"destination_layer": "security",
|
|
1777
|
-
"predicate": "depends-on",
|
|
1778
|
-
"cardinality": "many-to-many",
|
|
1779
|
-
"strength": "medium",
|
|
1780
|
-
"required": false
|
|
1781
|
-
},
|
|
1782
|
-
"security.authenticationconfig.protects.security.secureresource": {
|
|
1783
|
-
"id": "security.authenticationconfig.protects.security.secureresource",
|
|
1784
|
-
"source_spec_node_id": "security.authenticationconfig",
|
|
1785
|
-
"source_layer": "security",
|
|
1786
|
-
"destination_spec_node_id": "security.secureresource",
|
|
1787
|
-
"destination_layer": "security",
|
|
1788
|
-
"predicate": "protects",
|
|
1789
|
-
"cardinality": "many-to-many",
|
|
1790
|
-
"strength": "medium",
|
|
1791
|
-
"required": false
|
|
1792
|
-
},
|
|
1793
|
-
"security.authenticationconfig.references.security.passwordpolicy": {
|
|
1794
|
-
"id": "security.authenticationconfig.references.security.passwordpolicy",
|
|
1795
|
-
"source_spec_node_id": "security.authenticationconfig",
|
|
1796
|
-
"source_layer": "security",
|
|
1797
|
-
"destination_spec_node_id": "security.passwordpolicy",
|
|
1798
|
-
"destination_layer": "security",
|
|
1799
|
-
"predicate": "references",
|
|
1800
|
-
"cardinality": "many-to-many",
|
|
1801
|
-
"strength": "medium",
|
|
1802
|
-
"required": false
|
|
1803
|
-
},
|
|
1804
|
-
"security.authenticationconfig.uses.security.passwordpolicy": {
|
|
1805
|
-
"id": "security.authenticationconfig.uses.security.passwordpolicy",
|
|
1806
|
-
"source_spec_node_id": "security.authenticationconfig",
|
|
1807
|
-
"source_layer": "security",
|
|
1808
|
-
"destination_spec_node_id": "security.passwordpolicy",
|
|
1809
|
-
"destination_layer": "security",
|
|
1810
|
-
"predicate": "uses",
|
|
1811
|
-
"cardinality": "many-to-many",
|
|
1812
|
-
"strength": "medium",
|
|
1813
|
-
"required": false
|
|
1814
|
-
},
|
|
1815
|
-
"security.bindingofduty.associated-with.security.separationofduty": {
|
|
1816
|
-
"id": "security.bindingofduty.associated-with.security.separationofduty",
|
|
1817
|
-
"source_spec_node_id": "security.bindingofduty",
|
|
1818
|
-
"source_layer": "security",
|
|
1819
|
-
"destination_spec_node_id": "security.separationofduty",
|
|
1820
|
-
"destination_layer": "security",
|
|
1821
|
-
"predicate": "associated-with",
|
|
1822
|
-
"cardinality": "many-to-many",
|
|
1823
|
-
"strength": "medium",
|
|
1824
|
-
"required": false
|
|
1825
|
-
},
|
|
1826
|
-
"security.bindingofduty.constrains.security.role": {
|
|
1827
|
-
"id": "security.bindingofduty.constrains.security.role",
|
|
1828
|
-
"source_spec_node_id": "security.bindingofduty",
|
|
1829
|
-
"source_layer": "security",
|
|
1830
|
-
"destination_spec_node_id": "security.role",
|
|
1831
|
-
"destination_layer": "security",
|
|
1832
|
-
"predicate": "constrains",
|
|
1833
|
-
"cardinality": "many-to-many",
|
|
1834
|
-
"strength": "medium",
|
|
1835
|
-
"required": false
|
|
1836
|
-
},
|
|
1837
|
-
"security.bindingofduty.governs.security.resourceoperation": {
|
|
1838
|
-
"id": "security.bindingofduty.governs.security.resourceoperation",
|
|
1839
|
-
"source_spec_node_id": "security.bindingofduty",
|
|
1840
|
-
"source_layer": "security",
|
|
1841
|
-
"destination_spec_node_id": "security.resourceoperation",
|
|
1842
|
-
"destination_layer": "security",
|
|
1843
|
-
"predicate": "governs",
|
|
1844
|
-
"cardinality": "many-to-many",
|
|
1845
|
-
"strength": "medium",
|
|
1846
|
-
"required": false
|
|
1847
|
-
},
|
|
1848
|
-
"security.bindingofduty.requires.security.evidence": {
|
|
1849
|
-
"id": "security.bindingofduty.requires.security.evidence",
|
|
1850
|
-
"source_spec_node_id": "security.bindingofduty",
|
|
1851
|
-
"source_layer": "security",
|
|
1852
|
-
"destination_spec_node_id": "security.evidence",
|
|
1853
|
-
"destination_layer": "security",
|
|
1854
|
-
"predicate": "requires",
|
|
1855
|
-
"cardinality": "many-to-many",
|
|
1856
|
-
"strength": "medium",
|
|
1857
|
-
"required": false
|
|
1858
|
-
},
|
|
1859
|
-
"security.bindingofduty.supports.security.accountabilityrequirement": {
|
|
1860
|
-
"id": "security.bindingofduty.supports.security.accountabilityrequirement",
|
|
1861
|
-
"source_spec_node_id": "security.bindingofduty",
|
|
1862
|
-
"source_layer": "security",
|
|
1863
|
-
"destination_spec_node_id": "security.accountabilityrequirement",
|
|
1864
|
-
"destination_layer": "security",
|
|
1865
|
-
"predicate": "supports",
|
|
1866
|
-
"cardinality": "many-to-many",
|
|
1867
|
-
"strength": "medium",
|
|
1868
|
-
"required": false
|
|
1869
|
-
},
|
|
1870
|
-
"security.condition.composes.security.accesscondition": {
|
|
1871
|
-
"id": "security.condition.composes.security.accesscondition",
|
|
1872
|
-
"source_spec_node_id": "security.condition",
|
|
1873
|
-
"source_layer": "security",
|
|
1874
|
-
"destination_spec_node_id": "security.accesscondition",
|
|
1875
|
-
"destination_layer": "security",
|
|
1876
|
-
"predicate": "composes",
|
|
1877
|
-
"cardinality": "many-to-many",
|
|
1878
|
-
"strength": "medium",
|
|
1879
|
-
"required": false
|
|
1880
|
-
},
|
|
1881
|
-
"security.condition.constrains.security.policyrule": {
|
|
1882
|
-
"id": "security.condition.constrains.security.policyrule",
|
|
1883
|
-
"source_spec_node_id": "security.condition",
|
|
1884
|
-
"source_layer": "security",
|
|
1885
|
-
"destination_spec_node_id": "security.policyrule",
|
|
1886
|
-
"destination_layer": "security",
|
|
1887
|
-
"predicate": "constrains",
|
|
1888
|
-
"cardinality": "many-to-many",
|
|
1889
|
-
"strength": "medium",
|
|
1890
|
-
"required": false
|
|
1891
|
-
},
|
|
1892
|
-
"security.condition.constrains.security.securitypolicy": {
|
|
1893
|
-
"id": "security.condition.constrains.security.securitypolicy",
|
|
1894
|
-
"source_spec_node_id": "security.condition",
|
|
1895
|
-
"source_layer": "security",
|
|
1896
|
-
"destination_spec_node_id": "security.securitypolicy",
|
|
1897
|
-
"destination_layer": "security",
|
|
1898
|
-
"predicate": "constrains",
|
|
1899
|
-
"cardinality": "many-to-many",
|
|
1900
|
-
"strength": "medium",
|
|
1901
|
-
"required": false
|
|
1902
|
-
},
|
|
1903
|
-
"security.condition.triggers.security.policyaction": {
|
|
1904
|
-
"id": "security.condition.triggers.security.policyaction",
|
|
1905
|
-
"source_spec_node_id": "security.condition",
|
|
1906
|
-
"source_layer": "security",
|
|
1907
|
-
"destination_spec_node_id": "security.policyaction",
|
|
1908
|
-
"destination_layer": "security",
|
|
1909
|
-
"predicate": "triggers",
|
|
1910
|
-
"cardinality": "many-to-many",
|
|
1911
|
-
"strength": "medium",
|
|
1912
|
-
"required": false
|
|
1913
|
-
},
|
|
1914
|
-
"security.countermeasure.fulfills.security.securityconstraints": {
|
|
1915
|
-
"id": "security.countermeasure.fulfills.security.securityconstraints",
|
|
1916
|
-
"source_spec_node_id": "security.countermeasure",
|
|
1917
|
-
"source_layer": "security",
|
|
1918
|
-
"destination_spec_node_id": "security.securityconstraints",
|
|
1919
|
-
"destination_layer": "security",
|
|
1920
|
-
"predicate": "fulfills",
|
|
1921
|
-
"cardinality": "many-to-many",
|
|
1922
|
-
"strength": "medium",
|
|
1923
|
-
"required": false
|
|
1924
|
-
},
|
|
1925
|
-
"security.countermeasure.implements.security.securitypolicy": {
|
|
1926
|
-
"id": "security.countermeasure.implements.security.securitypolicy",
|
|
1927
|
-
"source_spec_node_id": "security.countermeasure",
|
|
1928
|
-
"source_layer": "security",
|
|
1929
|
-
"destination_spec_node_id": "security.securitypolicy",
|
|
1930
|
-
"destination_layer": "security",
|
|
1931
|
-
"predicate": "implements",
|
|
1932
|
-
"cardinality": "many-to-many",
|
|
1933
|
-
"strength": "medium",
|
|
1934
|
-
"required": false
|
|
1935
|
-
},
|
|
1936
|
-
"security.countermeasure.mitigates.security.threat": {
|
|
1937
|
-
"id": "security.countermeasure.mitigates.security.threat",
|
|
1938
|
-
"source_spec_node_id": "security.countermeasure",
|
|
1939
|
-
"source_layer": "security",
|
|
1940
|
-
"destination_spec_node_id": "security.threat",
|
|
1941
|
-
"destination_layer": "security",
|
|
1942
|
-
"predicate": "mitigates",
|
|
1943
|
-
"cardinality": "many-to-many",
|
|
1944
|
-
"strength": "medium",
|
|
1945
|
-
"required": false
|
|
1946
|
-
},
|
|
1947
|
-
"security.countermeasure.monitors.security.secureresource": {
|
|
1948
|
-
"id": "security.countermeasure.monitors.security.secureresource",
|
|
1949
|
-
"source_spec_node_id": "security.countermeasure",
|
|
1950
|
-
"source_layer": "security",
|
|
1951
|
-
"destination_spec_node_id": "security.secureresource",
|
|
1952
|
-
"destination_layer": "security",
|
|
1953
|
-
"predicate": "monitors",
|
|
1954
|
-
"cardinality": "many-to-many",
|
|
1955
|
-
"strength": "medium",
|
|
1956
|
-
"required": false
|
|
2108
|
+
"required": false,
|
|
2109
|
+
"description": "The countermeasure reduces the threat's likelihood or impact."
|
|
1957
2110
|
},
|
|
1958
2111
|
"security.countermeasure.protects.business.businessprocess": {
|
|
1959
2112
|
"id": "security.countermeasure.protects.business.businessprocess",
|
|
@@ -1964,7 +2117,8 @@
|
|
|
1964
2117
|
"predicate": "protects",
|
|
1965
2118
|
"cardinality": "many-to-many",
|
|
1966
2119
|
"strength": "medium",
|
|
1967
|
-
"required": false
|
|
2120
|
+
"required": false,
|
|
2121
|
+
"description": "The countermeasure guards the business process, such as fraud screening on checkout."
|
|
1968
2122
|
},
|
|
1969
2123
|
"security.countermeasure.protects.security.secureresource": {
|
|
1970
2124
|
"id": "security.countermeasure.protects.security.secureresource",
|
|
@@ -1975,7 +2129,8 @@
|
|
|
1975
2129
|
"predicate": "protects",
|
|
1976
2130
|
"cardinality": "many-to-many",
|
|
1977
2131
|
"strength": "medium",
|
|
1978
|
-
"required": false
|
|
2132
|
+
"required": false,
|
|
2133
|
+
"description": "The countermeasure guards the resource, such as encryption at rest."
|
|
1979
2134
|
},
|
|
1980
2135
|
"security.countermeasure.realizes.motivation.goal": {
|
|
1981
2136
|
"id": "security.countermeasure.realizes.motivation.goal",
|
|
@@ -1986,18 +2141,8 @@
|
|
|
1986
2141
|
"predicate": "realizes",
|
|
1987
2142
|
"cardinality": "many-to-many",
|
|
1988
2143
|
"strength": "medium",
|
|
1989
|
-
"required": false
|
|
1990
|
-
|
|
1991
|
-
"security.countermeasure.requires.security.evidence": {
|
|
1992
|
-
"id": "security.countermeasure.requires.security.evidence",
|
|
1993
|
-
"source_spec_node_id": "security.countermeasure",
|
|
1994
|
-
"source_layer": "security",
|
|
1995
|
-
"destination_spec_node_id": "security.evidence",
|
|
1996
|
-
"destination_layer": "security",
|
|
1997
|
-
"predicate": "requires",
|
|
1998
|
-
"cardinality": "many-to-many",
|
|
1999
|
-
"strength": "medium",
|
|
2000
|
-
"required": false
|
|
2144
|
+
"required": false,
|
|
2145
|
+
"description": "The countermeasure exists to achieve the security goal."
|
|
2001
2146
|
},
|
|
2002
2147
|
"security.countermeasure.satisfies.motivation.requirement": {
|
|
2003
2148
|
"id": "security.countermeasure.satisfies.motivation.requirement",
|
|
@@ -2008,18 +2153,8 @@
|
|
|
2008
2153
|
"predicate": "satisfies",
|
|
2009
2154
|
"cardinality": "many-to-many",
|
|
2010
2155
|
"strength": "medium",
|
|
2011
|
-
"required": false
|
|
2012
|
-
|
|
2013
|
-
"security.dataclassification.governs.security.fieldaccesscontrol": {
|
|
2014
|
-
"id": "security.dataclassification.governs.security.fieldaccesscontrol",
|
|
2015
|
-
"source_spec_node_id": "security.dataclassification",
|
|
2016
|
-
"source_layer": "security",
|
|
2017
|
-
"destination_spec_node_id": "security.fieldaccesscontrol",
|
|
2018
|
-
"destination_layer": "security",
|
|
2019
|
-
"predicate": "governs",
|
|
2020
|
-
"cardinality": "many-to-many",
|
|
2021
|
-
"strength": "medium",
|
|
2022
|
-
"required": false
|
|
2156
|
+
"required": false,
|
|
2157
|
+
"description": "The countermeasure meets the requirement, such as 'encrypt card data in transit'."
|
|
2023
2158
|
},
|
|
2024
2159
|
"security.dataclassification.governs.security.informationentity": {
|
|
2025
2160
|
"id": "security.dataclassification.governs.security.informationentity",
|
|
@@ -2030,7 +2165,8 @@
|
|
|
2030
2165
|
"predicate": "governs",
|
|
2031
2166
|
"cardinality": "many-to-many",
|
|
2032
2167
|
"strength": "medium",
|
|
2033
|
-
"required": false
|
|
2168
|
+
"required": false,
|
|
2169
|
+
"description": "The classification labels the information and sets its minimum protection."
|
|
2034
2170
|
},
|
|
2035
2171
|
"security.dataclassification.governs.security.retentionpolicy": {
|
|
2036
2172
|
"id": "security.dataclassification.governs.security.retentionpolicy",
|
|
@@ -2041,7 +2177,8 @@
|
|
|
2041
2177
|
"predicate": "governs",
|
|
2042
2178
|
"cardinality": "many-to-many",
|
|
2043
2179
|
"strength": "medium",
|
|
2044
|
-
"required": false
|
|
2180
|
+
"required": false,
|
|
2181
|
+
"description": "The classification sets how long data at its level must be kept and how it is disposed of."
|
|
2045
2182
|
},
|
|
2046
2183
|
"security.dataclassification.governs.security.secureresource": {
|
|
2047
2184
|
"id": "security.dataclassification.governs.security.secureresource",
|
|
@@ -2052,29 +2189,20 @@
|
|
|
2052
2189
|
"predicate": "governs",
|
|
2053
2190
|
"cardinality": "many-to-many",
|
|
2054
2191
|
"strength": "medium",
|
|
2055
|
-
"required": false
|
|
2192
|
+
"required": false,
|
|
2193
|
+
"description": "The classification labels the resource by the most sensitive data it holds."
|
|
2056
2194
|
},
|
|
2057
|
-
"security.dataclassification.
|
|
2058
|
-
"id": "security.dataclassification.
|
|
2195
|
+
"security.dataclassification.mandates.security.countermeasure": {
|
|
2196
|
+
"id": "security.dataclassification.mandates.security.countermeasure",
|
|
2059
2197
|
"source_spec_node_id": "security.dataclassification",
|
|
2060
2198
|
"source_layer": "security",
|
|
2061
2199
|
"destination_spec_node_id": "security.countermeasure",
|
|
2062
2200
|
"destination_layer": "security",
|
|
2063
|
-
"predicate": "
|
|
2064
|
-
"cardinality": "many-to-many",
|
|
2065
|
-
"strength": "medium",
|
|
2066
|
-
"required": false
|
|
2067
|
-
},
|
|
2068
|
-
"security.dataclassification.supports.security.securitypolicy": {
|
|
2069
|
-
"id": "security.dataclassification.supports.security.securitypolicy",
|
|
2070
|
-
"source_spec_node_id": "security.dataclassification",
|
|
2071
|
-
"source_layer": "security",
|
|
2072
|
-
"destination_spec_node_id": "security.securitypolicy",
|
|
2073
|
-
"destination_layer": "security",
|
|
2074
|
-
"predicate": "supports",
|
|
2201
|
+
"predicate": "mandates",
|
|
2075
2202
|
"cardinality": "many-to-many",
|
|
2076
2203
|
"strength": "medium",
|
|
2077
|
-
"required": false
|
|
2204
|
+
"required": false,
|
|
2205
|
+
"description": "Data at this level must be protected by the countermeasure, such as encryption."
|
|
2078
2206
|
},
|
|
2079
2207
|
"security.delegation.authorizes.security.role": {
|
|
2080
2208
|
"id": "security.delegation.authorizes.security.role",
|
|
@@ -2085,7 +2213,8 @@
|
|
|
2085
2213
|
"predicate": "authorizes",
|
|
2086
2214
|
"cardinality": "many-to-many",
|
|
2087
2215
|
"strength": "medium",
|
|
2088
|
-
"required": false
|
|
2216
|
+
"required": false,
|
|
2217
|
+
"description": "The delegatee receives the role through the delegation."
|
|
2089
2218
|
},
|
|
2090
2219
|
"security.delegation.constrained-by.security.securitypolicy": {
|
|
2091
2220
|
"id": "security.delegation.constrained-by.security.securitypolicy",
|
|
@@ -2096,51 +2225,32 @@
|
|
|
2096
2225
|
"predicate": "constrained-by",
|
|
2097
2226
|
"cardinality": "many-to-many",
|
|
2098
2227
|
"strength": "medium",
|
|
2099
|
-
"required": false
|
|
2100
|
-
|
|
2101
|
-
"security.delegation.requires.security.actor": {
|
|
2102
|
-
"id": "security.delegation.requires.security.actor",
|
|
2103
|
-
"source_spec_node_id": "security.delegation",
|
|
2104
|
-
"source_layer": "security",
|
|
2105
|
-
"destination_spec_node_id": "security.actor",
|
|
2106
|
-
"destination_layer": "security",
|
|
2107
|
-
"predicate": "requires",
|
|
2108
|
-
"cardinality": "many-to-many",
|
|
2109
|
-
"strength": "medium",
|
|
2110
|
-
"required": false
|
|
2228
|
+
"required": false,
|
|
2229
|
+
"description": "The policy limits what may be delegated and to whom."
|
|
2111
2230
|
},
|
|
2112
|
-
"security.delegation.
|
|
2113
|
-
"id": "security.delegation.
|
|
2231
|
+
"security.delegation.generates.security.evidence": {
|
|
2232
|
+
"id": "security.delegation.generates.security.evidence",
|
|
2114
2233
|
"source_spec_node_id": "security.delegation",
|
|
2115
2234
|
"source_layer": "security",
|
|
2116
2235
|
"destination_spec_node_id": "security.evidence",
|
|
2117
2236
|
"destination_layer": "security",
|
|
2118
|
-
"predicate": "
|
|
2119
|
-
"cardinality": "many-to-many",
|
|
2120
|
-
"strength": "medium",
|
|
2121
|
-
"required": false
|
|
2122
|
-
},
|
|
2123
|
-
"security.evidence.mitigates.security.threat": {
|
|
2124
|
-
"id": "security.evidence.mitigates.security.threat",
|
|
2125
|
-
"source_spec_node_id": "security.evidence",
|
|
2126
|
-
"source_layer": "security",
|
|
2127
|
-
"destination_spec_node_id": "security.threat",
|
|
2128
|
-
"destination_layer": "security",
|
|
2129
|
-
"predicate": "mitigates",
|
|
2237
|
+
"predicate": "generates",
|
|
2130
2238
|
"cardinality": "many-to-many",
|
|
2131
2239
|
"strength": "medium",
|
|
2132
|
-
"required": false
|
|
2240
|
+
"required": false,
|
|
2241
|
+
"description": "Granting or using the delegation is recorded as evidence."
|
|
2133
2242
|
},
|
|
2134
|
-
"security.
|
|
2135
|
-
"id": "security.
|
|
2136
|
-
"source_spec_node_id": "security.
|
|
2243
|
+
"security.delegation.requires.security.actor": {
|
|
2244
|
+
"id": "security.delegation.requires.security.actor",
|
|
2245
|
+
"source_spec_node_id": "security.delegation",
|
|
2137
2246
|
"source_layer": "security",
|
|
2138
|
-
"destination_spec_node_id": "security.
|
|
2247
|
+
"destination_spec_node_id": "security.actor",
|
|
2139
2248
|
"destination_layer": "security",
|
|
2140
|
-
"predicate": "
|
|
2249
|
+
"predicate": "requires",
|
|
2141
2250
|
"cardinality": "many-to-many",
|
|
2142
2251
|
"strength": "medium",
|
|
2143
|
-
"required": false
|
|
2252
|
+
"required": false,
|
|
2253
|
+
"description": "The delegation names the actor who delegates or receives the authority."
|
|
2144
2254
|
},
|
|
2145
2255
|
"security.evidence.supports.security.accountabilityrequirement": {
|
|
2146
2256
|
"id": "security.evidence.supports.security.accountabilityrequirement",
|
|
@@ -2151,18 +2261,8 @@
|
|
|
2151
2261
|
"predicate": "supports",
|
|
2152
2262
|
"cardinality": "many-to-many",
|
|
2153
2263
|
"strength": "medium",
|
|
2154
|
-
"required": false
|
|
2155
|
-
|
|
2156
|
-
"security.evidence.validates.security.policyrule": {
|
|
2157
|
-
"id": "security.evidence.validates.security.policyrule",
|
|
2158
|
-
"source_spec_node_id": "security.evidence",
|
|
2159
|
-
"source_layer": "security",
|
|
2160
|
-
"destination_spec_node_id": "security.policyrule",
|
|
2161
|
-
"destination_layer": "security",
|
|
2162
|
-
"predicate": "validates",
|
|
2163
|
-
"cardinality": "many-to-many",
|
|
2164
|
-
"strength": "medium",
|
|
2165
|
-
"required": false
|
|
2264
|
+
"required": false,
|
|
2265
|
+
"description": "The evidence lets the obligated action be verified later."
|
|
2166
2266
|
},
|
|
2167
2267
|
"security.fieldaccesscontrol.constrained-by.security.accesscondition": {
|
|
2168
2268
|
"id": "security.fieldaccesscontrol.constrained-by.security.accesscondition",
|
|
@@ -2173,7 +2273,8 @@
|
|
|
2173
2273
|
"predicate": "constrained-by",
|
|
2174
2274
|
"cardinality": "many-to-many",
|
|
2175
2275
|
"strength": "medium",
|
|
2176
|
-
"required": false
|
|
2276
|
+
"required": false,
|
|
2277
|
+
"description": "The field is shown in clear only while the condition holds."
|
|
2177
2278
|
},
|
|
2178
2279
|
"security.fieldaccesscontrol.constrained-by.security.dataclassification": {
|
|
2179
2280
|
"id": "security.fieldaccesscontrol.constrained-by.security.dataclassification",
|
|
@@ -2184,40 +2285,20 @@
|
|
|
2184
2285
|
"predicate": "constrained-by",
|
|
2185
2286
|
"cardinality": "many-to-many",
|
|
2186
2287
|
"strength": "medium",
|
|
2187
|
-
"required": false
|
|
2288
|
+
"required": false,
|
|
2289
|
+
"description": "The field's masking follows from the classification of the data it holds."
|
|
2188
2290
|
},
|
|
2189
|
-
"security.fieldaccesscontrol.
|
|
2190
|
-
"id": "security.fieldaccesscontrol.
|
|
2191
|
-
"source_spec_node_id": "security.fieldaccesscontrol",
|
|
2192
|
-
"source_layer": "security",
|
|
2193
|
-
"destination_spec_node_id": "security.secureresource",
|
|
2194
|
-
"destination_layer": "security",
|
|
2195
|
-
"predicate": "governs",
|
|
2196
|
-
"cardinality": "many-to-many",
|
|
2197
|
-
"strength": "medium",
|
|
2198
|
-
"required": false
|
|
2199
|
-
},
|
|
2200
|
-
"security.fieldaccesscontrol.implements.security.policyrule": {
|
|
2201
|
-
"id": "security.fieldaccesscontrol.implements.security.policyrule",
|
|
2291
|
+
"security.fieldaccesscontrol.realizes.security.policyrule": {
|
|
2292
|
+
"id": "security.fieldaccesscontrol.realizes.security.policyrule",
|
|
2202
2293
|
"source_spec_node_id": "security.fieldaccesscontrol",
|
|
2203
2294
|
"source_layer": "security",
|
|
2204
2295
|
"destination_spec_node_id": "security.policyrule",
|
|
2205
2296
|
"destination_layer": "security",
|
|
2206
|
-
"predicate": "
|
|
2207
|
-
"cardinality": "many-to-many",
|
|
2208
|
-
"strength": "medium",
|
|
2209
|
-
"required": false
|
|
2210
|
-
},
|
|
2211
|
-
"security.fieldaccesscontrol.protects.security.secureresource": {
|
|
2212
|
-
"id": "security.fieldaccesscontrol.protects.security.secureresource",
|
|
2213
|
-
"source_spec_node_id": "security.fieldaccesscontrol",
|
|
2214
|
-
"source_layer": "security",
|
|
2215
|
-
"destination_spec_node_id": "security.secureresource",
|
|
2216
|
-
"destination_layer": "security",
|
|
2217
|
-
"predicate": "protects",
|
|
2297
|
+
"predicate": "realizes",
|
|
2218
2298
|
"cardinality": "many-to-many",
|
|
2219
2299
|
"strength": "medium",
|
|
2220
|
-
"required": false
|
|
2300
|
+
"required": false,
|
|
2301
|
+
"description": "The field control carries out the rule at field level, such as masking for non-admins."
|
|
2221
2302
|
},
|
|
2222
2303
|
"security.fieldaccesscontrol.requires.security.permission": {
|
|
2223
2304
|
"id": "security.fieldaccesscontrol.requires.security.permission",
|
|
@@ -2228,51 +2309,8 @@
|
|
|
2228
2309
|
"predicate": "requires",
|
|
2229
2310
|
"cardinality": "many-to-many",
|
|
2230
2311
|
"strength": "medium",
|
|
2231
|
-
"required": false
|
|
2232
|
-
|
|
2233
|
-
"security.informationentity.constrained-by.security.dataclassification": {
|
|
2234
|
-
"id": "security.informationentity.constrained-by.security.dataclassification",
|
|
2235
|
-
"source_spec_node_id": "security.informationentity",
|
|
2236
|
-
"source_layer": "security",
|
|
2237
|
-
"destination_spec_node_id": "security.dataclassification",
|
|
2238
|
-
"destination_layer": "security",
|
|
2239
|
-
"predicate": "constrained-by",
|
|
2240
|
-
"cardinality": "many-to-many",
|
|
2241
|
-
"strength": "medium",
|
|
2242
|
-
"required": false
|
|
2243
|
-
},
|
|
2244
|
-
"security.informationentity.constrained-by.security.retentionpolicy": {
|
|
2245
|
-
"id": "security.informationentity.constrained-by.security.retentionpolicy",
|
|
2246
|
-
"source_spec_node_id": "security.informationentity",
|
|
2247
|
-
"source_layer": "security",
|
|
2248
|
-
"destination_spec_node_id": "security.retentionpolicy",
|
|
2249
|
-
"destination_layer": "security",
|
|
2250
|
-
"predicate": "constrained-by",
|
|
2251
|
-
"cardinality": "many-to-many",
|
|
2252
|
-
"strength": "medium",
|
|
2253
|
-
"required": false
|
|
2254
|
-
},
|
|
2255
|
-
"security.informationentity.governs.security.informationright": {
|
|
2256
|
-
"id": "security.informationentity.governs.security.informationright",
|
|
2257
|
-
"source_spec_node_id": "security.informationentity",
|
|
2258
|
-
"source_layer": "security",
|
|
2259
|
-
"destination_spec_node_id": "security.informationright",
|
|
2260
|
-
"destination_layer": "security",
|
|
2261
|
-
"predicate": "governs",
|
|
2262
|
-
"cardinality": "many-to-many",
|
|
2263
|
-
"strength": "medium",
|
|
2264
|
-
"required": false
|
|
2265
|
-
},
|
|
2266
|
-
"security.informationentity.requires.security.accountabilityrequirement": {
|
|
2267
|
-
"id": "security.informationentity.requires.security.accountabilityrequirement",
|
|
2268
|
-
"source_spec_node_id": "security.informationentity",
|
|
2269
|
-
"source_layer": "security",
|
|
2270
|
-
"destination_spec_node_id": "security.accountabilityrequirement",
|
|
2271
|
-
"destination_layer": "security",
|
|
2272
|
-
"predicate": "requires",
|
|
2273
|
-
"cardinality": "many-to-many",
|
|
2274
|
-
"strength": "medium",
|
|
2275
|
-
"required": false
|
|
2312
|
+
"required": false,
|
|
2313
|
+
"description": "Only holders of the permission see the field's clear value."
|
|
2276
2314
|
},
|
|
2277
2315
|
"security.informationright.accesses.security.informationentity": {
|
|
2278
2316
|
"id": "security.informationright.accesses.security.informationentity",
|
|
@@ -2283,7 +2321,8 @@
|
|
|
2283
2321
|
"predicate": "accesses",
|
|
2284
2322
|
"cardinality": "many-to-many",
|
|
2285
2323
|
"strength": "medium",
|
|
2286
|
-
"required": false
|
|
2324
|
+
"required": false,
|
|
2325
|
+
"description": "The right grants its actor the listed operations on the information."
|
|
2287
2326
|
},
|
|
2288
2327
|
"security.informationright.assigned-to.security.actor": {
|
|
2289
2328
|
"id": "security.informationright.assigned-to.security.actor",
|
|
@@ -2294,7 +2333,8 @@
|
|
|
2294
2333
|
"predicate": "assigned-to",
|
|
2295
2334
|
"cardinality": "many-to-many",
|
|
2296
2335
|
"strength": "medium",
|
|
2297
|
-
"required": false
|
|
2336
|
+
"required": false,
|
|
2337
|
+
"description": "The right is held by the actor."
|
|
2298
2338
|
},
|
|
2299
2339
|
"security.informationright.constrained-by.security.accesscondition": {
|
|
2300
2340
|
"id": "security.informationright.constrained-by.security.accesscondition",
|
|
@@ -2305,40 +2345,8 @@
|
|
|
2305
2345
|
"predicate": "constrained-by",
|
|
2306
2346
|
"cardinality": "many-to-many",
|
|
2307
2347
|
"strength": "medium",
|
|
2308
|
-
"required": false
|
|
2309
|
-
|
|
2310
|
-
"security.informationright.governs.security.informationentity": {
|
|
2311
|
-
"id": "security.informationright.governs.security.informationentity",
|
|
2312
|
-
"source_spec_node_id": "security.informationright",
|
|
2313
|
-
"source_layer": "security",
|
|
2314
|
-
"destination_spec_node_id": "security.informationentity",
|
|
2315
|
-
"destination_layer": "security",
|
|
2316
|
-
"predicate": "governs",
|
|
2317
|
-
"cardinality": "many-to-many",
|
|
2318
|
-
"strength": "medium",
|
|
2319
|
-
"required": false
|
|
2320
|
-
},
|
|
2321
|
-
"security.informationright.implements.security.permission": {
|
|
2322
|
-
"id": "security.informationright.implements.security.permission",
|
|
2323
|
-
"source_spec_node_id": "security.informationright",
|
|
2324
|
-
"source_layer": "security",
|
|
2325
|
-
"destination_spec_node_id": "security.permission",
|
|
2326
|
-
"destination_layer": "security",
|
|
2327
|
-
"predicate": "implements",
|
|
2328
|
-
"cardinality": "many-to-many",
|
|
2329
|
-
"strength": "medium",
|
|
2330
|
-
"required": false
|
|
2331
|
-
},
|
|
2332
|
-
"security.needtoknow.associated-with.security.role": {
|
|
2333
|
-
"id": "security.needtoknow.associated-with.security.role",
|
|
2334
|
-
"source_spec_node_id": "security.needtoknow",
|
|
2335
|
-
"source_layer": "security",
|
|
2336
|
-
"destination_spec_node_id": "security.role",
|
|
2337
|
-
"destination_layer": "security",
|
|
2338
|
-
"predicate": "associated-with",
|
|
2339
|
-
"cardinality": "many-to-many",
|
|
2340
|
-
"strength": "medium",
|
|
2341
|
-
"required": false
|
|
2348
|
+
"required": false,
|
|
2349
|
+
"description": "The right applies only while the condition holds."
|
|
2342
2350
|
},
|
|
2343
2351
|
"security.needtoknow.constrained-by.security.dataclassification": {
|
|
2344
2352
|
"id": "security.needtoknow.constrained-by.security.dataclassification",
|
|
@@ -2349,7 +2357,8 @@
|
|
|
2349
2357
|
"predicate": "constrained-by",
|
|
2350
2358
|
"cardinality": "many-to-many",
|
|
2351
2359
|
"strength": "medium",
|
|
2352
|
-
"required": false
|
|
2360
|
+
"required": false,
|
|
2361
|
+
"description": "The need-to-know rule applies to data at the classification level."
|
|
2353
2362
|
},
|
|
2354
2363
|
"security.needtoknow.constrains.security.permission": {
|
|
2355
2364
|
"id": "security.needtoknow.constrains.security.permission",
|
|
@@ -2360,18 +2369,20 @@
|
|
|
2360
2369
|
"predicate": "constrains",
|
|
2361
2370
|
"cardinality": "many-to-many",
|
|
2362
2371
|
"strength": "medium",
|
|
2363
|
-
"required": false
|
|
2372
|
+
"required": false,
|
|
2373
|
+
"description": "The permission is usable only for the declared purpose."
|
|
2364
2374
|
},
|
|
2365
|
-
"security.needtoknow.
|
|
2366
|
-
"id": "security.needtoknow.
|
|
2375
|
+
"security.needtoknow.constrains.security.role": {
|
|
2376
|
+
"id": "security.needtoknow.constrains.security.role",
|
|
2367
2377
|
"source_spec_node_id": "security.needtoknow",
|
|
2368
2378
|
"source_layer": "security",
|
|
2369
|
-
"destination_spec_node_id": "security.
|
|
2379
|
+
"destination_spec_node_id": "security.role",
|
|
2370
2380
|
"destination_layer": "security",
|
|
2371
|
-
"predicate": "
|
|
2381
|
+
"predicate": "constrains",
|
|
2372
2382
|
"cardinality": "many-to-many",
|
|
2373
2383
|
"strength": "medium",
|
|
2374
|
-
"required": false
|
|
2384
|
+
"required": false,
|
|
2385
|
+
"description": "Holders of the role reach the information only for the declared purpose."
|
|
2375
2386
|
},
|
|
2376
2387
|
"security.needtoknow.protects.security.informationentity": {
|
|
2377
2388
|
"id": "security.needtoknow.protects.security.informationentity",
|
|
@@ -2382,18 +2393,20 @@
|
|
|
2382
2393
|
"predicate": "protects",
|
|
2383
2394
|
"cardinality": "many-to-many",
|
|
2384
2395
|
"strength": "medium",
|
|
2385
|
-
"required": false
|
|
2396
|
+
"required": false,
|
|
2397
|
+
"description": "The information is available only to actors whose purpose matches."
|
|
2386
2398
|
},
|
|
2387
|
-
"security.
|
|
2388
|
-
"id": "security.
|
|
2389
|
-
"source_spec_node_id": "security.
|
|
2399
|
+
"security.needtoknow.realizes.security.policyrule": {
|
|
2400
|
+
"id": "security.needtoknow.realizes.security.policyrule",
|
|
2401
|
+
"source_spec_node_id": "security.needtoknow",
|
|
2390
2402
|
"source_layer": "security",
|
|
2391
|
-
"destination_spec_node_id": "security.
|
|
2403
|
+
"destination_spec_node_id": "security.policyrule",
|
|
2392
2404
|
"destination_layer": "security",
|
|
2393
|
-
"predicate": "
|
|
2405
|
+
"predicate": "realizes",
|
|
2394
2406
|
"cardinality": "many-to-many",
|
|
2395
2407
|
"strength": "medium",
|
|
2396
|
-
"required": false
|
|
2408
|
+
"required": false,
|
|
2409
|
+
"description": "The policy rule enforces the need-to-know constraint at decision time."
|
|
2397
2410
|
},
|
|
2398
2411
|
"security.passwordpolicy.mandates.security.countermeasure": {
|
|
2399
2412
|
"id": "security.passwordpolicy.mandates.security.countermeasure",
|
|
@@ -2404,40 +2417,8 @@
|
|
|
2404
2417
|
"predicate": "mandates",
|
|
2405
2418
|
"cardinality": "many-to-many",
|
|
2406
2419
|
"strength": "medium",
|
|
2407
|
-
"required": false
|
|
2408
|
-
|
|
2409
|
-
"security.passwordpolicy.mitigates.security.threat": {
|
|
2410
|
-
"id": "security.passwordpolicy.mitigates.security.threat",
|
|
2411
|
-
"source_spec_node_id": "security.passwordpolicy",
|
|
2412
|
-
"source_layer": "security",
|
|
2413
|
-
"destination_spec_node_id": "security.threat",
|
|
2414
|
-
"destination_layer": "security",
|
|
2415
|
-
"predicate": "mitigates",
|
|
2416
|
-
"cardinality": "many-to-many",
|
|
2417
|
-
"strength": "medium",
|
|
2418
|
-
"required": false
|
|
2419
|
-
},
|
|
2420
|
-
"security.passwordpolicy.requires.security.auditconfig": {
|
|
2421
|
-
"id": "security.passwordpolicy.requires.security.auditconfig",
|
|
2422
|
-
"source_spec_node_id": "security.passwordpolicy",
|
|
2423
|
-
"source_layer": "security",
|
|
2424
|
-
"destination_spec_node_id": "security.auditconfig",
|
|
2425
|
-
"destination_layer": "security",
|
|
2426
|
-
"predicate": "requires",
|
|
2427
|
-
"cardinality": "many-to-many",
|
|
2428
|
-
"strength": "medium",
|
|
2429
|
-
"required": false
|
|
2430
|
-
},
|
|
2431
|
-
"security.passwordpolicy.requires.security.countermeasure": {
|
|
2432
|
-
"id": "security.passwordpolicy.requires.security.countermeasure",
|
|
2433
|
-
"source_spec_node_id": "security.passwordpolicy",
|
|
2434
|
-
"source_layer": "security",
|
|
2435
|
-
"destination_spec_node_id": "security.countermeasure",
|
|
2436
|
-
"destination_layer": "security",
|
|
2437
|
-
"predicate": "requires",
|
|
2438
|
-
"cardinality": "many-to-many",
|
|
2439
|
-
"strength": "medium",
|
|
2440
|
-
"required": false
|
|
2420
|
+
"required": false,
|
|
2421
|
+
"description": "The password policy calls for the countermeasure, such as account lockout."
|
|
2441
2422
|
},
|
|
2442
2423
|
"security.passwordpolicy.uses.security.validationrule": {
|
|
2443
2424
|
"id": "security.passwordpolicy.uses.security.validationrule",
|
|
@@ -2448,7 +2429,8 @@
|
|
|
2448
2429
|
"predicate": "uses",
|
|
2449
2430
|
"cardinality": "many-to-many",
|
|
2450
2431
|
"strength": "medium",
|
|
2451
|
-
"required": false
|
|
2432
|
+
"required": false,
|
|
2433
|
+
"description": "The password policy checks secrets with the validation rule, such as a minimum length."
|
|
2452
2434
|
},
|
|
2453
2435
|
"security.permission.authorizes.security.resourceoperation": {
|
|
2454
2436
|
"id": "security.permission.authorizes.security.resourceoperation",
|
|
@@ -2459,62 +2441,8 @@
|
|
|
2459
2441
|
"predicate": "authorizes",
|
|
2460
2442
|
"cardinality": "many-to-many",
|
|
2461
2443
|
"strength": "medium",
|
|
2462
|
-
"required": false
|
|
2463
|
-
|
|
2464
|
-
"security.policyaction.enforces-requirement.security.policyrule": {
|
|
2465
|
-
"id": "security.policyaction.enforces-requirement.security.policyrule",
|
|
2466
|
-
"source_spec_node_id": "security.policyaction",
|
|
2467
|
-
"source_layer": "security",
|
|
2468
|
-
"destination_spec_node_id": "security.policyrule",
|
|
2469
|
-
"destination_layer": "security",
|
|
2470
|
-
"predicate": "enforces-requirement",
|
|
2471
|
-
"cardinality": "many-to-many",
|
|
2472
|
-
"strength": "medium",
|
|
2473
|
-
"required": false
|
|
2474
|
-
},
|
|
2475
|
-
"security.policyaction.governs.security.permission": {
|
|
2476
|
-
"id": "security.policyaction.governs.security.permission",
|
|
2477
|
-
"source_spec_node_id": "security.policyaction",
|
|
2478
|
-
"source_layer": "security",
|
|
2479
|
-
"destination_spec_node_id": "security.permission",
|
|
2480
|
-
"destination_layer": "security",
|
|
2481
|
-
"predicate": "governs",
|
|
2482
|
-
"cardinality": "many-to-many",
|
|
2483
|
-
"strength": "medium",
|
|
2484
|
-
"required": false
|
|
2485
|
-
},
|
|
2486
|
-
"security.policyaction.mandates.security.countermeasure": {
|
|
2487
|
-
"id": "security.policyaction.mandates.security.countermeasure",
|
|
2488
|
-
"source_spec_node_id": "security.policyaction",
|
|
2489
|
-
"source_layer": "security",
|
|
2490
|
-
"destination_spec_node_id": "security.countermeasure",
|
|
2491
|
-
"destination_layer": "security",
|
|
2492
|
-
"predicate": "mandates",
|
|
2493
|
-
"cardinality": "many-to-many",
|
|
2494
|
-
"strength": "medium",
|
|
2495
|
-
"required": false
|
|
2496
|
-
},
|
|
2497
|
-
"security.policyaction.mitigates.security.threat": {
|
|
2498
|
-
"id": "security.policyaction.mitigates.security.threat",
|
|
2499
|
-
"source_spec_node_id": "security.policyaction",
|
|
2500
|
-
"source_layer": "security",
|
|
2501
|
-
"destination_spec_node_id": "security.threat",
|
|
2502
|
-
"destination_layer": "security",
|
|
2503
|
-
"predicate": "mitigates",
|
|
2504
|
-
"cardinality": "many-to-many",
|
|
2505
|
-
"strength": "medium",
|
|
2506
|
-
"required": false
|
|
2507
|
-
},
|
|
2508
|
-
"security.policyaction.requires.security.countermeasure": {
|
|
2509
|
-
"id": "security.policyaction.requires.security.countermeasure",
|
|
2510
|
-
"source_spec_node_id": "security.policyaction",
|
|
2511
|
-
"source_layer": "security",
|
|
2512
|
-
"destination_spec_node_id": "security.countermeasure",
|
|
2513
|
-
"destination_layer": "security",
|
|
2514
|
-
"predicate": "requires",
|
|
2515
|
-
"cardinality": "many-to-many",
|
|
2516
|
-
"strength": "medium",
|
|
2517
|
-
"required": false
|
|
2444
|
+
"required": false,
|
|
2445
|
+
"description": "The permission allows the operation on its resource."
|
|
2518
2446
|
},
|
|
2519
2447
|
"security.policyaction.triggers.security.auditconfig": {
|
|
2520
2448
|
"id": "security.policyaction.triggers.security.auditconfig",
|
|
@@ -2525,7 +2453,8 @@
|
|
|
2525
2453
|
"predicate": "triggers",
|
|
2526
2454
|
"cardinality": "many-to-many",
|
|
2527
2455
|
"strength": "medium",
|
|
2528
|
-
"required": false
|
|
2456
|
+
"required": false,
|
|
2457
|
+
"description": "The action writes an audit event under the audit configuration, such as logging a denial."
|
|
2529
2458
|
},
|
|
2530
2459
|
"security.policyrule.authorizes.security.permission": {
|
|
2531
2460
|
"id": "security.policyrule.authorizes.security.permission",
|
|
@@ -2536,18 +2465,8 @@
|
|
|
2536
2465
|
"predicate": "authorizes",
|
|
2537
2466
|
"cardinality": "many-to-many",
|
|
2538
2467
|
"strength": "medium",
|
|
2539
|
-
"required": false
|
|
2540
|
-
|
|
2541
|
-
"security.policyrule.composes.security.securitypolicy": {
|
|
2542
|
-
"id": "security.policyrule.composes.security.securitypolicy",
|
|
2543
|
-
"source_spec_node_id": "security.policyrule",
|
|
2544
|
-
"source_layer": "security",
|
|
2545
|
-
"destination_spec_node_id": "security.securitypolicy",
|
|
2546
|
-
"destination_layer": "security",
|
|
2547
|
-
"predicate": "composes",
|
|
2548
|
-
"cardinality": "many-to-many",
|
|
2549
|
-
"strength": "medium",
|
|
2550
|
-
"required": false
|
|
2468
|
+
"required": false,
|
|
2469
|
+
"description": "The rule's effect permits or denies the permission."
|
|
2551
2470
|
},
|
|
2552
2471
|
"security.policyrule.generates.security.evidence": {
|
|
2553
2472
|
"id": "security.policyrule.generates.security.evidence",
|
|
@@ -2558,29 +2477,8 @@
|
|
|
2558
2477
|
"predicate": "generates",
|
|
2559
2478
|
"cardinality": "many-to-many",
|
|
2560
2479
|
"strength": "medium",
|
|
2561
|
-
"required": false
|
|
2562
|
-
|
|
2563
|
-
"security.policyrule.governs.security.informationright": {
|
|
2564
|
-
"id": "security.policyrule.governs.security.informationright",
|
|
2565
|
-
"source_spec_node_id": "security.policyrule",
|
|
2566
|
-
"source_layer": "security",
|
|
2567
|
-
"destination_spec_node_id": "security.informationright",
|
|
2568
|
-
"destination_layer": "security",
|
|
2569
|
-
"predicate": "governs",
|
|
2570
|
-
"cardinality": "many-to-many",
|
|
2571
|
-
"strength": "medium",
|
|
2572
|
-
"required": false
|
|
2573
|
-
},
|
|
2574
|
-
"security.policyrule.mandates.security.countermeasure": {
|
|
2575
|
-
"id": "security.policyrule.mandates.security.countermeasure",
|
|
2576
|
-
"source_spec_node_id": "security.policyrule",
|
|
2577
|
-
"source_layer": "security",
|
|
2578
|
-
"destination_spec_node_id": "security.countermeasure",
|
|
2579
|
-
"destination_layer": "security",
|
|
2580
|
-
"predicate": "mandates",
|
|
2581
|
-
"cardinality": "many-to-many",
|
|
2582
|
-
"strength": "medium",
|
|
2583
|
-
"required": false
|
|
2480
|
+
"required": false,
|
|
2481
|
+
"description": "Evaluating the rule produces evidence, such as a decision log entry."
|
|
2584
2482
|
},
|
|
2585
2483
|
"security.policyrule.protects.security.secureresource": {
|
|
2586
2484
|
"id": "security.policyrule.protects.security.secureresource",
|
|
@@ -2591,18 +2489,8 @@
|
|
|
2591
2489
|
"predicate": "protects",
|
|
2592
2490
|
"cardinality": "many-to-many",
|
|
2593
2491
|
"strength": "medium",
|
|
2594
|
-
"required": false
|
|
2595
|
-
|
|
2596
|
-
"security.policyrule.requires.security.countermeasure": {
|
|
2597
|
-
"id": "security.policyrule.requires.security.countermeasure",
|
|
2598
|
-
"source_spec_node_id": "security.policyrule",
|
|
2599
|
-
"source_layer": "security",
|
|
2600
|
-
"destination_spec_node_id": "security.countermeasure",
|
|
2601
|
-
"destination_layer": "security",
|
|
2602
|
-
"predicate": "requires",
|
|
2603
|
-
"cardinality": "many-to-many",
|
|
2604
|
-
"strength": "medium",
|
|
2605
|
-
"required": false
|
|
2492
|
+
"required": false,
|
|
2493
|
+
"description": "The rule decides access to the resource."
|
|
2606
2494
|
},
|
|
2607
2495
|
"security.policyrule.triggers.security.policyaction": {
|
|
2608
2496
|
"id": "security.policyrule.triggers.security.policyaction",
|
|
@@ -2613,7 +2501,8 @@
|
|
|
2613
2501
|
"predicate": "triggers",
|
|
2614
2502
|
"cardinality": "many-to-many",
|
|
2615
2503
|
"strength": "medium",
|
|
2616
|
-
"required": false
|
|
2504
|
+
"required": false,
|
|
2505
|
+
"description": "The action is carried out when the rule matches, such as a step-up challenge."
|
|
2617
2506
|
},
|
|
2618
2507
|
"security.policyrule.uses.security.accesscondition": {
|
|
2619
2508
|
"id": "security.policyrule.uses.security.accesscondition",
|
|
@@ -2624,7 +2513,8 @@
|
|
|
2624
2513
|
"predicate": "uses",
|
|
2625
2514
|
"cardinality": "many-to-many",
|
|
2626
2515
|
"strength": "medium",
|
|
2627
|
-
"required": false
|
|
2516
|
+
"required": false,
|
|
2517
|
+
"description": "The rule evaluates the access condition."
|
|
2628
2518
|
},
|
|
2629
2519
|
"security.policyrule.uses.security.condition": {
|
|
2630
2520
|
"id": "security.policyrule.uses.security.condition",
|
|
@@ -2635,18 +2525,8 @@
|
|
|
2635
2525
|
"predicate": "uses",
|
|
2636
2526
|
"cardinality": "many-to-many",
|
|
2637
2527
|
"strength": "medium",
|
|
2638
|
-
"required": false
|
|
2639
|
-
|
|
2640
|
-
"security.resourceoperation.accesses.security.secureresource": {
|
|
2641
|
-
"id": "security.resourceoperation.accesses.security.secureresource",
|
|
2642
|
-
"source_spec_node_id": "security.resourceoperation",
|
|
2643
|
-
"source_layer": "security",
|
|
2644
|
-
"destination_spec_node_id": "security.secureresource",
|
|
2645
|
-
"destination_layer": "security",
|
|
2646
|
-
"predicate": "accesses",
|
|
2647
|
-
"cardinality": "many-to-many",
|
|
2648
|
-
"strength": "medium",
|
|
2649
|
-
"required": false
|
|
2528
|
+
"required": false,
|
|
2529
|
+
"description": "The rule evaluates the named condition."
|
|
2650
2530
|
},
|
|
2651
2531
|
"security.resourceoperation.constrained-by.security.accesscondition": {
|
|
2652
2532
|
"id": "security.resourceoperation.constrained-by.security.accesscondition",
|
|
@@ -2657,40 +2537,20 @@
|
|
|
2657
2537
|
"predicate": "constrained-by",
|
|
2658
2538
|
"cardinality": "many-to-many",
|
|
2659
2539
|
"strength": "medium",
|
|
2660
|
-
"required": false
|
|
2540
|
+
"required": false,
|
|
2541
|
+
"description": "The operation is allowed only while the condition holds."
|
|
2661
2542
|
},
|
|
2662
|
-
"security.resourceoperation.
|
|
2663
|
-
"id": "security.resourceoperation.
|
|
2664
|
-
"source_spec_node_id": "security.resourceoperation",
|
|
2665
|
-
"source_layer": "security",
|
|
2666
|
-
"destination_spec_node_id": "security.secureresource",
|
|
2667
|
-
"destination_layer": "security",
|
|
2668
|
-
"predicate": "governs",
|
|
2669
|
-
"cardinality": "many-to-many",
|
|
2670
|
-
"strength": "medium",
|
|
2671
|
-
"required": false
|
|
2672
|
-
},
|
|
2673
|
-
"security.resourceoperation.triggers.security.auditconfig": {
|
|
2674
|
-
"id": "security.resourceoperation.triggers.security.auditconfig",
|
|
2543
|
+
"security.resourceoperation.references.security.auditconfig": {
|
|
2544
|
+
"id": "security.resourceoperation.references.security.auditconfig",
|
|
2675
2545
|
"source_spec_node_id": "security.resourceoperation",
|
|
2676
2546
|
"source_layer": "security",
|
|
2677
2547
|
"destination_spec_node_id": "security.auditconfig",
|
|
2678
2548
|
"destination_layer": "security",
|
|
2679
|
-
"predicate": "
|
|
2680
|
-
"cardinality": "many-to-many",
|
|
2681
|
-
"strength": "medium",
|
|
2682
|
-
"required": false
|
|
2683
|
-
},
|
|
2684
|
-
"security.retentionpolicy.constrains.security.informationentity": {
|
|
2685
|
-
"id": "security.retentionpolicy.constrains.security.informationentity",
|
|
2686
|
-
"source_spec_node_id": "security.retentionpolicy",
|
|
2687
|
-
"source_layer": "security",
|
|
2688
|
-
"destination_spec_node_id": "security.informationentity",
|
|
2689
|
-
"destination_layer": "security",
|
|
2690
|
-
"predicate": "constrains",
|
|
2549
|
+
"predicate": "references",
|
|
2691
2550
|
"cardinality": "many-to-many",
|
|
2692
2551
|
"strength": "medium",
|
|
2693
|
-
"required": false
|
|
2552
|
+
"required": false,
|
|
2553
|
+
"description": "The operation names the audit configuration that records its use."
|
|
2694
2554
|
},
|
|
2695
2555
|
"security.retentionpolicy.governs.security.auditconfig": {
|
|
2696
2556
|
"id": "security.retentionpolicy.governs.security.auditconfig",
|
|
@@ -2701,7 +2561,8 @@
|
|
|
2701
2561
|
"predicate": "governs",
|
|
2702
2562
|
"cardinality": "many-to-many",
|
|
2703
2563
|
"strength": "medium",
|
|
2704
|
-
"required": false
|
|
2564
|
+
"required": false,
|
|
2565
|
+
"description": "The retention policy sets how long the audit trail is kept."
|
|
2705
2566
|
},
|
|
2706
2567
|
"security.retentionpolicy.governs.security.evidence": {
|
|
2707
2568
|
"id": "security.retentionpolicy.governs.security.evidence",
|
|
@@ -2712,40 +2573,32 @@
|
|
|
2712
2573
|
"predicate": "governs",
|
|
2713
2574
|
"cardinality": "many-to-many",
|
|
2714
2575
|
"strength": "medium",
|
|
2715
|
-
"required": false
|
|
2576
|
+
"required": false,
|
|
2577
|
+
"description": "The retention policy sets how long the evidence is kept and how it is disposed of."
|
|
2716
2578
|
},
|
|
2717
|
-
"security.retentionpolicy.
|
|
2718
|
-
"id": "security.retentionpolicy.
|
|
2579
|
+
"security.retentionpolicy.governs.security.informationentity": {
|
|
2580
|
+
"id": "security.retentionpolicy.governs.security.informationentity",
|
|
2719
2581
|
"source_spec_node_id": "security.retentionpolicy",
|
|
2720
2582
|
"source_layer": "security",
|
|
2721
|
-
"destination_spec_node_id": "security.
|
|
2583
|
+
"destination_spec_node_id": "security.informationentity",
|
|
2722
2584
|
"destination_layer": "security",
|
|
2723
|
-
"predicate": "
|
|
2585
|
+
"predicate": "governs",
|
|
2724
2586
|
"cardinality": "many-to-many",
|
|
2725
2587
|
"strength": "medium",
|
|
2726
|
-
"required": false
|
|
2588
|
+
"required": false,
|
|
2589
|
+
"description": "The retention policy sets how long the information is kept."
|
|
2727
2590
|
},
|
|
2728
|
-
"security.retentionpolicy.
|
|
2729
|
-
"id": "security.retentionpolicy.
|
|
2591
|
+
"security.retentionpolicy.mandates.security.countermeasure": {
|
|
2592
|
+
"id": "security.retentionpolicy.mandates.security.countermeasure",
|
|
2730
2593
|
"source_spec_node_id": "security.retentionpolicy",
|
|
2731
2594
|
"source_layer": "security",
|
|
2732
2595
|
"destination_spec_node_id": "security.countermeasure",
|
|
2733
2596
|
"destination_layer": "security",
|
|
2734
|
-
"predicate": "
|
|
2735
|
-
"cardinality": "many-to-many",
|
|
2736
|
-
"strength": "medium",
|
|
2737
|
-
"required": false
|
|
2738
|
-
},
|
|
2739
|
-
"security.role.accesses.security.secureresource": {
|
|
2740
|
-
"id": "security.role.accesses.security.secureresource",
|
|
2741
|
-
"source_spec_node_id": "security.role",
|
|
2742
|
-
"source_layer": "security",
|
|
2743
|
-
"destination_spec_node_id": "security.secureresource",
|
|
2744
|
-
"destination_layer": "security",
|
|
2745
|
-
"predicate": "accesses",
|
|
2597
|
+
"predicate": "mandates",
|
|
2746
2598
|
"cardinality": "many-to-many",
|
|
2747
2599
|
"strength": "medium",
|
|
2748
|
-
"required": false
|
|
2600
|
+
"required": false,
|
|
2601
|
+
"description": "The retention policy calls for the countermeasure, such as write-once storage."
|
|
2749
2602
|
},
|
|
2750
2603
|
"security.role.aggregates.security.permission": {
|
|
2751
2604
|
"id": "security.role.aggregates.security.permission",
|
|
@@ -2756,51 +2609,20 @@
|
|
|
2756
2609
|
"predicate": "aggregates",
|
|
2757
2610
|
"cardinality": "many-to-many",
|
|
2758
2611
|
"strength": "medium",
|
|
2759
|
-
"required": false
|
|
2760
|
-
|
|
2761
|
-
"security.role.authorizes.security.permission": {
|
|
2762
|
-
"id": "security.role.authorizes.security.permission",
|
|
2763
|
-
"source_spec_node_id": "security.role",
|
|
2764
|
-
"source_layer": "security",
|
|
2765
|
-
"destination_spec_node_id": "security.permission",
|
|
2766
|
-
"destination_layer": "security",
|
|
2767
|
-
"predicate": "authorizes",
|
|
2768
|
-
"cardinality": "many-to-many",
|
|
2769
|
-
"strength": "medium",
|
|
2770
|
-
"required": false
|
|
2771
|
-
},
|
|
2772
|
-
"security.role.constrained-by.security.separationofduty": {
|
|
2773
|
-
"id": "security.role.constrained-by.security.separationofduty",
|
|
2774
|
-
"source_spec_node_id": "security.role",
|
|
2775
|
-
"source_layer": "security",
|
|
2776
|
-
"destination_spec_node_id": "security.separationofduty",
|
|
2777
|
-
"destination_layer": "security",
|
|
2778
|
-
"predicate": "constrained-by",
|
|
2779
|
-
"cardinality": "many-to-many",
|
|
2780
|
-
"strength": "medium",
|
|
2781
|
-
"required": false
|
|
2612
|
+
"required": false,
|
|
2613
|
+
"description": "The role grants the permission to everyone assigned to it."
|
|
2782
2614
|
},
|
|
2783
|
-
"security.role.
|
|
2784
|
-
"id": "security.role.
|
|
2615
|
+
"security.role.references.business.businessrole": {
|
|
2616
|
+
"id": "security.role.references.business.businessrole",
|
|
2785
2617
|
"source_spec_node_id": "security.role",
|
|
2786
2618
|
"source_layer": "security",
|
|
2787
2619
|
"destination_spec_node_id": "business.businessrole",
|
|
2788
2620
|
"destination_layer": "business",
|
|
2789
|
-
"predicate": "
|
|
2790
|
-
"cardinality": "many-to-many",
|
|
2791
|
-
"strength": "medium",
|
|
2792
|
-
"required": false
|
|
2793
|
-
},
|
|
2794
|
-
"security.role.provides.security.permission": {
|
|
2795
|
-
"id": "security.role.provides.security.permission",
|
|
2796
|
-
"source_spec_node_id": "security.role",
|
|
2797
|
-
"source_layer": "security",
|
|
2798
|
-
"destination_spec_node_id": "security.permission",
|
|
2799
|
-
"destination_layer": "security",
|
|
2800
|
-
"predicate": "provides",
|
|
2621
|
+
"predicate": "references",
|
|
2801
2622
|
"cardinality": "many-to-many",
|
|
2802
2623
|
"strength": "medium",
|
|
2803
|
-
"required": false
|
|
2624
|
+
"required": false,
|
|
2625
|
+
"description": "The security role stands for the business role in access decisions."
|
|
2804
2626
|
},
|
|
2805
2627
|
"security.role.specializes.security.role": {
|
|
2806
2628
|
"id": "security.role.specializes.security.role",
|
|
@@ -2811,29 +2633,32 @@
|
|
|
2811
2633
|
"predicate": "specializes",
|
|
2812
2634
|
"cardinality": "many-to-many",
|
|
2813
2635
|
"strength": "medium",
|
|
2814
|
-
"required": false
|
|
2636
|
+
"required": false,
|
|
2637
|
+
"description": "The role inherits every permission of its parent role."
|
|
2815
2638
|
},
|
|
2816
|
-
"security.secureresource.
|
|
2817
|
-
"id": "security.secureresource.
|
|
2639
|
+
"security.secureresource.composes.security.fieldaccesscontrol": {
|
|
2640
|
+
"id": "security.secureresource.composes.security.fieldaccesscontrol",
|
|
2818
2641
|
"source_spec_node_id": "security.secureresource",
|
|
2819
2642
|
"source_layer": "security",
|
|
2820
2643
|
"destination_spec_node_id": "security.fieldaccesscontrol",
|
|
2821
2644
|
"destination_layer": "security",
|
|
2822
|
-
"predicate": "
|
|
2645
|
+
"predicate": "composes",
|
|
2823
2646
|
"cardinality": "many-to-many",
|
|
2824
2647
|
"strength": "medium",
|
|
2825
|
-
"required": false
|
|
2648
|
+
"required": false,
|
|
2649
|
+
"description": "The field control protects one field of the resource and exists only with it."
|
|
2826
2650
|
},
|
|
2827
|
-
"security.secureresource.
|
|
2828
|
-
"id": "security.secureresource.
|
|
2651
|
+
"security.secureresource.composes.security.resourceoperation": {
|
|
2652
|
+
"id": "security.secureresource.composes.security.resourceoperation",
|
|
2829
2653
|
"source_spec_node_id": "security.secureresource",
|
|
2830
2654
|
"source_layer": "security",
|
|
2831
2655
|
"destination_spec_node_id": "security.resourceoperation",
|
|
2832
2656
|
"destination_layer": "security",
|
|
2833
|
-
"predicate": "
|
|
2657
|
+
"predicate": "composes",
|
|
2834
2658
|
"cardinality": "many-to-many",
|
|
2835
2659
|
"strength": "medium",
|
|
2836
|
-
"required": false
|
|
2660
|
+
"required": false,
|
|
2661
|
+
"description": "The operation is declared on the resource and exists only with it."
|
|
2837
2662
|
},
|
|
2838
2663
|
"security.secureresource.references.business.businessobject": {
|
|
2839
2664
|
"id": "security.secureresource.references.business.businessobject",
|
|
@@ -2844,7 +2669,8 @@
|
|
|
2844
2669
|
"predicate": "references",
|
|
2845
2670
|
"cardinality": "many-to-many",
|
|
2846
2671
|
"strength": "medium",
|
|
2847
|
-
"required": false
|
|
2672
|
+
"required": false,
|
|
2673
|
+
"description": "The resource holds or exposes the business object."
|
|
2848
2674
|
},
|
|
2849
2675
|
"security.securityconstraints.aggregates.security.bindingofduty": {
|
|
2850
2676
|
"id": "security.securityconstraints.aggregates.security.bindingofduty",
|
|
@@ -2855,7 +2681,8 @@
|
|
|
2855
2681
|
"predicate": "aggregates",
|
|
2856
2682
|
"cardinality": "many-to-many",
|
|
2857
2683
|
"strength": "medium",
|
|
2858
|
-
"required": false
|
|
2684
|
+
"required": false,
|
|
2685
|
+
"description": "The container groups the binding-of-duty rule."
|
|
2859
2686
|
},
|
|
2860
2687
|
"security.securityconstraints.aggregates.security.needtoknow": {
|
|
2861
2688
|
"id": "security.securityconstraints.aggregates.security.needtoknow",
|
|
@@ -2866,7 +2693,8 @@
|
|
|
2866
2693
|
"predicate": "aggregates",
|
|
2867
2694
|
"cardinality": "many-to-many",
|
|
2868
2695
|
"strength": "medium",
|
|
2869
|
-
"required": false
|
|
2696
|
+
"required": false,
|
|
2697
|
+
"description": "The container groups the need-to-know rule."
|
|
2870
2698
|
},
|
|
2871
2699
|
"security.securityconstraints.aggregates.security.separationofduty": {
|
|
2872
2700
|
"id": "security.securityconstraints.aggregates.security.separationofduty",
|
|
@@ -2877,54 +2705,35 @@
|
|
|
2877
2705
|
"predicate": "aggregates",
|
|
2878
2706
|
"cardinality": "many-to-many",
|
|
2879
2707
|
"strength": "medium",
|
|
2880
|
-
"required": false
|
|
2708
|
+
"required": false,
|
|
2709
|
+
"description": "The container groups the separation-of-duty rule."
|
|
2881
2710
|
},
|
|
2882
|
-
"security.securityconstraints.
|
|
2883
|
-
"id": "security.securityconstraints.
|
|
2711
|
+
"security.securityconstraints.satisfies.motivation.constraint": {
|
|
2712
|
+
"id": "security.securityconstraints.satisfies.motivation.constraint",
|
|
2884
2713
|
"source_spec_node_id": "security.securityconstraints",
|
|
2885
2714
|
"source_layer": "security",
|
|
2886
|
-
"destination_spec_node_id": "
|
|
2887
|
-
"destination_layer": "
|
|
2888
|
-
"predicate": "
|
|
2889
|
-
"cardinality": "many-to-many",
|
|
2890
|
-
"strength": "medium",
|
|
2891
|
-
"required": false
|
|
2892
|
-
},
|
|
2893
|
-
"security.securityconstraints.enforces.security.securitypolicy": {
|
|
2894
|
-
"id": "security.securityconstraints.enforces.security.securitypolicy",
|
|
2895
|
-
"source_spec_node_id": "security.securityconstraints",
|
|
2896
|
-
"source_layer": "security",
|
|
2897
|
-
"destination_spec_node_id": "security.securitypolicy",
|
|
2898
|
-
"destination_layer": "security",
|
|
2899
|
-
"predicate": "enforces",
|
|
2715
|
+
"destination_spec_node_id": "motivation.constraint",
|
|
2716
|
+
"destination_layer": "motivation",
|
|
2717
|
+
"predicate": "satisfies",
|
|
2900
2718
|
"cardinality": "many-to-many",
|
|
2901
2719
|
"strength": "medium",
|
|
2902
|
-
"required": false
|
|
2720
|
+
"required": false,
|
|
2721
|
+
"description": "The security constraints meet a motivation constraint on the solution, such as a four-eyes rule."
|
|
2903
2722
|
},
|
|
2904
|
-
"security.
|
|
2905
|
-
"id": "security.
|
|
2906
|
-
"source_spec_node_id": "security.
|
|
2723
|
+
"security.securitymodel.aggregates.security.accountabilityrequirement": {
|
|
2724
|
+
"id": "security.securitymodel.aggregates.security.accountabilityrequirement",
|
|
2725
|
+
"source_spec_node_id": "security.securitymodel",
|
|
2907
2726
|
"source_layer": "security",
|
|
2908
|
-
"destination_spec_node_id": "security.
|
|
2727
|
+
"destination_spec_node_id": "security.accountabilityrequirement",
|
|
2909
2728
|
"destination_layer": "security",
|
|
2910
|
-
"predicate": "
|
|
2911
|
-
"cardinality": "many-to-many",
|
|
2912
|
-
"strength": "medium",
|
|
2913
|
-
"required": false
|
|
2914
|
-
},
|
|
2915
|
-
"security.securityconstraints.implements.motivation.constraint": {
|
|
2916
|
-
"id": "security.securityconstraints.implements.motivation.constraint",
|
|
2917
|
-
"source_spec_node_id": "security.securityconstraints",
|
|
2918
|
-
"source_layer": "security",
|
|
2919
|
-
"destination_spec_node_id": "motivation.constraint",
|
|
2920
|
-
"destination_layer": "motivation",
|
|
2921
|
-
"predicate": "implements",
|
|
2729
|
+
"predicate": "aggregates",
|
|
2922
2730
|
"cardinality": "many-to-many",
|
|
2923
2731
|
"strength": "medium",
|
|
2924
|
-
"required": false
|
|
2732
|
+
"required": false,
|
|
2733
|
+
"description": "The model includes the accountability requirement."
|
|
2925
2734
|
},
|
|
2926
|
-
"security.securitymodel.aggregates.actor": {
|
|
2927
|
-
"id": "security.securitymodel.aggregates.actor",
|
|
2735
|
+
"security.securitymodel.aggregates.security.actor": {
|
|
2736
|
+
"id": "security.securitymodel.aggregates.security.actor",
|
|
2928
2737
|
"source_spec_node_id": "security.securitymodel",
|
|
2929
2738
|
"source_layer": "security",
|
|
2930
2739
|
"destination_spec_node_id": "security.actor",
|
|
@@ -2932,21 +2741,23 @@
|
|
|
2932
2741
|
"predicate": "aggregates",
|
|
2933
2742
|
"cardinality": "many-to-many",
|
|
2934
2743
|
"strength": "medium",
|
|
2935
|
-
"required": false
|
|
2744
|
+
"required": false,
|
|
2745
|
+
"description": "The model includes the actor."
|
|
2936
2746
|
},
|
|
2937
|
-
"security.securitymodel.aggregates.security.
|
|
2938
|
-
"id": "security.securitymodel.aggregates.security.
|
|
2747
|
+
"security.securitymodel.aggregates.security.dataclassification": {
|
|
2748
|
+
"id": "security.securitymodel.aggregates.security.dataclassification",
|
|
2939
2749
|
"source_spec_node_id": "security.securitymodel",
|
|
2940
2750
|
"source_layer": "security",
|
|
2941
|
-
"destination_spec_node_id": "security.
|
|
2751
|
+
"destination_spec_node_id": "security.dataclassification",
|
|
2942
2752
|
"destination_layer": "security",
|
|
2943
2753
|
"predicate": "aggregates",
|
|
2944
2754
|
"cardinality": "many-to-many",
|
|
2945
2755
|
"strength": "medium",
|
|
2946
|
-
"required": false
|
|
2756
|
+
"required": false,
|
|
2757
|
+
"description": "The model includes the classification level."
|
|
2947
2758
|
},
|
|
2948
|
-
"security.securitymodel.aggregates.delegation": {
|
|
2949
|
-
"id": "security.securitymodel.aggregates.delegation",
|
|
2759
|
+
"security.securitymodel.aggregates.security.delegation": {
|
|
2760
|
+
"id": "security.securitymodel.aggregates.security.delegation",
|
|
2950
2761
|
"source_spec_node_id": "security.securitymodel",
|
|
2951
2762
|
"source_layer": "security",
|
|
2952
2763
|
"destination_spec_node_id": "security.delegation",
|
|
@@ -2954,10 +2765,11 @@
|
|
|
2954
2765
|
"predicate": "aggregates",
|
|
2955
2766
|
"cardinality": "many-to-many",
|
|
2956
2767
|
"strength": "medium",
|
|
2957
|
-
"required": false
|
|
2768
|
+
"required": false,
|
|
2769
|
+
"description": "The model includes the delegation."
|
|
2958
2770
|
},
|
|
2959
|
-
"security.securitymodel.aggregates.informationentity": {
|
|
2960
|
-
"id": "security.securitymodel.aggregates.informationentity",
|
|
2771
|
+
"security.securitymodel.aggregates.security.informationentity": {
|
|
2772
|
+
"id": "security.securitymodel.aggregates.security.informationentity",
|
|
2961
2773
|
"source_spec_node_id": "security.securitymodel",
|
|
2962
2774
|
"source_layer": "security",
|
|
2963
2775
|
"destination_spec_node_id": "security.informationentity",
|
|
@@ -2965,10 +2777,11 @@
|
|
|
2965
2777
|
"predicate": "aggregates",
|
|
2966
2778
|
"cardinality": "many-to-many",
|
|
2967
2779
|
"strength": "medium",
|
|
2968
|
-
"required": false
|
|
2780
|
+
"required": false,
|
|
2781
|
+
"description": "The model includes the information entity."
|
|
2969
2782
|
},
|
|
2970
|
-
"security.securitymodel.aggregates.permission": {
|
|
2971
|
-
"id": "security.securitymodel.aggregates.permission",
|
|
2783
|
+
"security.securitymodel.aggregates.security.permission": {
|
|
2784
|
+
"id": "security.securitymodel.aggregates.security.permission",
|
|
2972
2785
|
"source_spec_node_id": "security.securitymodel",
|
|
2973
2786
|
"source_layer": "security",
|
|
2974
2787
|
"destination_spec_node_id": "security.permission",
|
|
@@ -2976,10 +2789,11 @@
|
|
|
2976
2789
|
"predicate": "aggregates",
|
|
2977
2790
|
"cardinality": "many-to-many",
|
|
2978
2791
|
"strength": "medium",
|
|
2979
|
-
"required": false
|
|
2792
|
+
"required": false,
|
|
2793
|
+
"description": "The model includes the permission."
|
|
2980
2794
|
},
|
|
2981
|
-
"security.securitymodel.aggregates.role": {
|
|
2982
|
-
"id": "security.securitymodel.aggregates.role",
|
|
2795
|
+
"security.securitymodel.aggregates.security.role": {
|
|
2796
|
+
"id": "security.securitymodel.aggregates.security.role",
|
|
2983
2797
|
"source_spec_node_id": "security.securitymodel",
|
|
2984
2798
|
"source_layer": "security",
|
|
2985
2799
|
"destination_spec_node_id": "security.role",
|
|
@@ -2987,10 +2801,11 @@
|
|
|
2987
2801
|
"predicate": "aggregates",
|
|
2988
2802
|
"cardinality": "many-to-many",
|
|
2989
2803
|
"strength": "medium",
|
|
2990
|
-
"required": false
|
|
2804
|
+
"required": false,
|
|
2805
|
+
"description": "The model includes the role."
|
|
2991
2806
|
},
|
|
2992
|
-
"security.securitymodel.aggregates.secureresource": {
|
|
2993
|
-
"id": "security.securitymodel.aggregates.secureresource",
|
|
2807
|
+
"security.securitymodel.aggregates.security.secureresource": {
|
|
2808
|
+
"id": "security.securitymodel.aggregates.security.secureresource",
|
|
2994
2809
|
"source_spec_node_id": "security.securitymodel",
|
|
2995
2810
|
"source_layer": "security",
|
|
2996
2811
|
"destination_spec_node_id": "security.secureresource",
|
|
@@ -2998,7 +2813,8 @@
|
|
|
2998
2813
|
"predicate": "aggregates",
|
|
2999
2814
|
"cardinality": "many-to-many",
|
|
3000
2815
|
"strength": "medium",
|
|
3001
|
-
"required": false
|
|
2816
|
+
"required": false,
|
|
2817
|
+
"description": "The model includes the secure resource."
|
|
3002
2818
|
},
|
|
3003
2819
|
"security.securitymodel.aggregates.security.threat": {
|
|
3004
2820
|
"id": "security.securitymodel.aggregates.security.threat",
|
|
@@ -3009,7 +2825,8 @@
|
|
|
3009
2825
|
"predicate": "aggregates",
|
|
3010
2826
|
"cardinality": "many-to-many",
|
|
3011
2827
|
"strength": "medium",
|
|
3012
|
-
"required": false
|
|
2828
|
+
"required": false,
|
|
2829
|
+
"description": "The model includes the threat in its threat model."
|
|
3013
2830
|
},
|
|
3014
2831
|
"security.securitymodel.composes.security.authenticationconfig": {
|
|
3015
2832
|
"id": "security.securitymodel.composes.security.authenticationconfig",
|
|
@@ -3020,7 +2837,8 @@
|
|
|
3020
2837
|
"predicate": "composes",
|
|
3021
2838
|
"cardinality": "many-to-many",
|
|
3022
2839
|
"strength": "medium",
|
|
3023
|
-
"required": false
|
|
2840
|
+
"required": false,
|
|
2841
|
+
"description": "The authentication configuration belongs to the model's application."
|
|
3024
2842
|
},
|
|
3025
2843
|
"security.securitymodel.composes.security.securityconstraints": {
|
|
3026
2844
|
"id": "security.securitymodel.composes.security.securityconstraints",
|
|
@@ -3031,7 +2849,8 @@
|
|
|
3031
2849
|
"predicate": "composes",
|
|
3032
2850
|
"cardinality": "many-to-many",
|
|
3033
2851
|
"strength": "medium",
|
|
3034
|
-
"required": false
|
|
2852
|
+
"required": false,
|
|
2853
|
+
"description": "The constraints container belongs to the model."
|
|
3035
2854
|
},
|
|
3036
2855
|
"security.securitymodel.composes.security.securitypolicy": {
|
|
3037
2856
|
"id": "security.securitymodel.composes.security.securitypolicy",
|
|
@@ -3042,106 +2861,32 @@
|
|
|
3042
2861
|
"predicate": "composes",
|
|
3043
2862
|
"cardinality": "many-to-many",
|
|
3044
2863
|
"strength": "medium",
|
|
3045
|
-
"required": false
|
|
3046
|
-
|
|
3047
|
-
"security.securitymodel.constrains.security.accountabilityrequirement": {
|
|
3048
|
-
"id": "security.securitymodel.constrains.security.accountabilityrequirement",
|
|
3049
|
-
"source_spec_node_id": "security.securitymodel",
|
|
3050
|
-
"source_layer": "security",
|
|
3051
|
-
"destination_spec_node_id": "security.accountabilityrequirement",
|
|
3052
|
-
"destination_layer": "security",
|
|
3053
|
-
"predicate": "constrains",
|
|
3054
|
-
"cardinality": "many-to-many",
|
|
3055
|
-
"strength": "medium",
|
|
3056
|
-
"required": false
|
|
3057
|
-
},
|
|
3058
|
-
"security.securitymodel.governs.security.dataclassification": {
|
|
3059
|
-
"id": "security.securitymodel.governs.security.dataclassification",
|
|
3060
|
-
"source_spec_node_id": "security.securitymodel",
|
|
3061
|
-
"source_layer": "security",
|
|
3062
|
-
"destination_spec_node_id": "security.dataclassification",
|
|
3063
|
-
"destination_layer": "security",
|
|
3064
|
-
"predicate": "governs",
|
|
3065
|
-
"cardinality": "many-to-many",
|
|
3066
|
-
"strength": "medium",
|
|
3067
|
-
"required": false
|
|
3068
|
-
},
|
|
3069
|
-
"security.securitymodel.governs.security.securitypolicy": {
|
|
3070
|
-
"id": "security.securitymodel.governs.security.securitypolicy",
|
|
3071
|
-
"source_spec_node_id": "security.securitymodel",
|
|
3072
|
-
"source_layer": "security",
|
|
3073
|
-
"destination_spec_node_id": "security.securitypolicy",
|
|
3074
|
-
"destination_layer": "security",
|
|
3075
|
-
"predicate": "governs",
|
|
3076
|
-
"cardinality": "many-to-many",
|
|
3077
|
-
"strength": "medium",
|
|
3078
|
-
"required": false
|
|
3079
|
-
},
|
|
3080
|
-
"security.securitymodel.manages.security.threat": {
|
|
3081
|
-
"id": "security.securitymodel.manages.security.threat",
|
|
3082
|
-
"source_spec_node_id": "security.securitymodel",
|
|
3083
|
-
"source_layer": "security",
|
|
3084
|
-
"destination_spec_node_id": "security.threat",
|
|
3085
|
-
"destination_layer": "security",
|
|
3086
|
-
"predicate": "manages",
|
|
3087
|
-
"cardinality": "many-to-many",
|
|
3088
|
-
"strength": "medium",
|
|
3089
|
-
"required": false
|
|
2864
|
+
"required": false,
|
|
2865
|
+
"description": "The policy belongs to the model."
|
|
3090
2866
|
},
|
|
3091
|
-
"security.securitypolicy.
|
|
3092
|
-
"id": "security.securitypolicy.
|
|
2867
|
+
"security.securitypolicy.composes.security.policyrule": {
|
|
2868
|
+
"id": "security.securitypolicy.composes.security.policyrule",
|
|
3093
2869
|
"source_spec_node_id": "security.securitypolicy",
|
|
3094
2870
|
"source_layer": "security",
|
|
3095
2871
|
"destination_spec_node_id": "security.policyrule",
|
|
3096
2872
|
"destination_layer": "security",
|
|
3097
|
-
"predicate": "
|
|
2873
|
+
"predicate": "composes",
|
|
3098
2874
|
"cardinality": "many-to-many",
|
|
3099
2875
|
"strength": "medium",
|
|
3100
|
-
"required": false
|
|
2876
|
+
"required": false,
|
|
2877
|
+
"description": "The rule is evaluated as part of the policy and exists only within it."
|
|
3101
2878
|
},
|
|
3102
|
-
"security.securitypolicy.
|
|
3103
|
-
"id": "security.securitypolicy.
|
|
2879
|
+
"security.securitypolicy.governs.business.businessprocess": {
|
|
2880
|
+
"id": "security.securitypolicy.governs.business.businessprocess",
|
|
3104
2881
|
"source_spec_node_id": "security.securitypolicy",
|
|
3105
2882
|
"source_layer": "security",
|
|
3106
2883
|
"destination_spec_node_id": "business.businessprocess",
|
|
3107
2884
|
"destination_layer": "business",
|
|
3108
|
-
"predicate": "
|
|
3109
|
-
"cardinality": "many-to-many",
|
|
3110
|
-
"strength": "medium",
|
|
3111
|
-
"required": false
|
|
3112
|
-
},
|
|
3113
|
-
"security.securitypolicy.constrains.security.permission": {
|
|
3114
|
-
"id": "security.securitypolicy.constrains.security.permission",
|
|
3115
|
-
"source_spec_node_id": "security.securitypolicy",
|
|
3116
|
-
"source_layer": "security",
|
|
3117
|
-
"destination_spec_node_id": "security.permission",
|
|
3118
|
-
"destination_layer": "security",
|
|
3119
|
-
"predicate": "constrains",
|
|
3120
|
-
"cardinality": "many-to-many",
|
|
3121
|
-
"strength": "medium",
|
|
3122
|
-
"required": false
|
|
3123
|
-
},
|
|
3124
|
-
"security.securitypolicy.enforces-requirement.security.accesscondition": {
|
|
3125
|
-
"id": "security.securitypolicy.enforces-requirement.security.accesscondition",
|
|
3126
|
-
"source_spec_node_id": "security.securitypolicy",
|
|
3127
|
-
"source_layer": "security",
|
|
3128
|
-
"destination_spec_node_id": "security.accesscondition",
|
|
3129
|
-
"destination_layer": "security",
|
|
3130
|
-
"predicate": "enforces-requirement",
|
|
3131
|
-
"cardinality": "many-to-many",
|
|
3132
|
-
"strength": "medium",
|
|
3133
|
-
"required": false
|
|
3134
|
-
},
|
|
3135
|
-
"security.securitypolicy.fulfills.security.accountabilityrequirement": {
|
|
3136
|
-
"id": "security.securitypolicy.fulfills.security.accountabilityrequirement",
|
|
3137
|
-
"source_spec_node_id": "security.securitypolicy",
|
|
3138
|
-
"source_layer": "security",
|
|
3139
|
-
"destination_spec_node_id": "security.accountabilityrequirement",
|
|
3140
|
-
"destination_layer": "security",
|
|
3141
|
-
"predicate": "fulfills",
|
|
2885
|
+
"predicate": "governs",
|
|
3142
2886
|
"cardinality": "many-to-many",
|
|
3143
2887
|
"strength": "medium",
|
|
3144
|
-
"required": false
|
|
2888
|
+
"required": false,
|
|
2889
|
+
"description": "The policy applies to the business process, such as approval rules for refunds."
|
|
3145
2890
|
},
|
|
3146
2891
|
"security.securitypolicy.governs.business.businessservice": {
|
|
3147
2892
|
"id": "security.securitypolicy.governs.business.businessservice",
|
|
@@ -3152,7 +2897,8 @@
|
|
|
3152
2897
|
"predicate": "governs",
|
|
3153
2898
|
"cardinality": "many-to-many",
|
|
3154
2899
|
"strength": "medium",
|
|
3155
|
-
"required": false
|
|
2900
|
+
"required": false,
|
|
2901
|
+
"description": "The policy applies to the business service."
|
|
3156
2902
|
},
|
|
3157
2903
|
"security.securitypolicy.governs.security.passwordpolicy": {
|
|
3158
2904
|
"id": "security.securitypolicy.governs.security.passwordpolicy",
|
|
@@ -3163,7 +2909,8 @@
|
|
|
3163
2909
|
"predicate": "governs",
|
|
3164
2910
|
"cardinality": "many-to-many",
|
|
3165
2911
|
"strength": "medium",
|
|
3166
|
-
"required": false
|
|
2912
|
+
"required": false,
|
|
2913
|
+
"description": "The security policy sets the password policy's rules."
|
|
3167
2914
|
},
|
|
3168
2915
|
"security.securitypolicy.governs.security.secureresource": {
|
|
3169
2916
|
"id": "security.securitypolicy.governs.security.secureresource",
|
|
@@ -3174,7 +2921,8 @@
|
|
|
3174
2921
|
"predicate": "governs",
|
|
3175
2922
|
"cardinality": "many-to-many",
|
|
3176
2923
|
"strength": "medium",
|
|
3177
|
-
"required": false
|
|
2924
|
+
"required": false,
|
|
2925
|
+
"description": "The policy decides access to the resource."
|
|
3178
2926
|
},
|
|
3179
2927
|
"security.securitypolicy.mandates.security.countermeasure": {
|
|
3180
2928
|
"id": "security.securitypolicy.mandates.security.countermeasure",
|
|
@@ -3185,29 +2933,32 @@
|
|
|
3185
2933
|
"predicate": "mandates",
|
|
3186
2934
|
"cardinality": "many-to-many",
|
|
3187
2935
|
"strength": "medium",
|
|
3188
|
-
"required": false
|
|
2936
|
+
"required": false,
|
|
2937
|
+
"description": "The policy calls for the countermeasure."
|
|
3189
2938
|
},
|
|
3190
|
-
"security.securitypolicy.
|
|
3191
|
-
"id": "security.securitypolicy.
|
|
2939
|
+
"security.securitypolicy.satisfies.security.accountabilityrequirement": {
|
|
2940
|
+
"id": "security.securitypolicy.satisfies.security.accountabilityrequirement",
|
|
3192
2941
|
"source_spec_node_id": "security.securitypolicy",
|
|
3193
2942
|
"source_layer": "security",
|
|
3194
|
-
"destination_spec_node_id": "
|
|
3195
|
-
"destination_layer": "
|
|
3196
|
-
"predicate": "
|
|
2943
|
+
"destination_spec_node_id": "security.accountabilityrequirement",
|
|
2944
|
+
"destination_layer": "security",
|
|
2945
|
+
"predicate": "satisfies",
|
|
3197
2946
|
"cardinality": "many-to-many",
|
|
3198
2947
|
"strength": "medium",
|
|
3199
|
-
"required": false
|
|
2948
|
+
"required": false,
|
|
2949
|
+
"description": "The policy meets the accountability requirement by assigning who must be able to prove each action."
|
|
3200
2950
|
},
|
|
3201
|
-
"security.securitypolicy.
|
|
3202
|
-
"id": "security.securitypolicy.
|
|
2951
|
+
"security.securitypolicy.satisfies.motivation.principle": {
|
|
2952
|
+
"id": "security.securitypolicy.satisfies.motivation.principle",
|
|
3203
2953
|
"source_spec_node_id": "security.securitypolicy",
|
|
3204
2954
|
"source_layer": "security",
|
|
3205
|
-
"destination_spec_node_id": "
|
|
3206
|
-
"destination_layer": "
|
|
3207
|
-
"predicate": "
|
|
2955
|
+
"destination_spec_node_id": "motivation.principle",
|
|
2956
|
+
"destination_layer": "motivation",
|
|
2957
|
+
"predicate": "satisfies",
|
|
3208
2958
|
"cardinality": "many-to-many",
|
|
3209
2959
|
"strength": "medium",
|
|
3210
|
-
"required": false
|
|
2960
|
+
"required": false,
|
|
2961
|
+
"description": "The policy applies the principle to security decisions, such as a least-privilege principle."
|
|
3211
2962
|
},
|
|
3212
2963
|
"security.securitypolicy.satisfies.motivation.requirement": {
|
|
3213
2964
|
"id": "security.securitypolicy.satisfies.motivation.requirement",
|
|
@@ -3218,7 +2969,8 @@
|
|
|
3218
2969
|
"predicate": "satisfies",
|
|
3219
2970
|
"cardinality": "many-to-many",
|
|
3220
2971
|
"strength": "medium",
|
|
3221
|
-
"required": false
|
|
2972
|
+
"required": false,
|
|
2973
|
+
"description": "The policy meets the requirement, such as 'only finance may approve refunds'."
|
|
3222
2974
|
},
|
|
3223
2975
|
"security.separationofduty.associated-with.security.bindingofduty": {
|
|
3224
2976
|
"id": "security.separationofduty.associated-with.security.bindingofduty",
|
|
@@ -3229,7 +2981,8 @@
|
|
|
3229
2981
|
"predicate": "associated-with",
|
|
3230
2982
|
"cardinality": "many-to-many",
|
|
3231
2983
|
"strength": "medium",
|
|
3232
|
-
"required": false
|
|
2984
|
+
"required": false,
|
|
2985
|
+
"description": "The separation and binding rules apply to the same workflow, one keeping steps apart and the other together."
|
|
3233
2986
|
},
|
|
3234
2987
|
"security.separationofduty.constrains.business.businessrole": {
|
|
3235
2988
|
"id": "security.separationofduty.constrains.business.businessrole",
|
|
@@ -3240,7 +2993,8 @@
|
|
|
3240
2993
|
"predicate": "constrains",
|
|
3241
2994
|
"cardinality": "many-to-many",
|
|
3242
2995
|
"strength": "medium",
|
|
3243
|
-
"required": false
|
|
2996
|
+
"required": false,
|
|
2997
|
+
"description": "Holders of the business role may not also perform the conflicting task."
|
|
3244
2998
|
},
|
|
3245
2999
|
"security.separationofduty.constrains.security.role": {
|
|
3246
3000
|
"id": "security.separationofduty.constrains.security.role",
|
|
@@ -3251,73 +3005,8 @@
|
|
|
3251
3005
|
"predicate": "constrains",
|
|
3252
3006
|
"cardinality": "many-to-many",
|
|
3253
3007
|
"strength": "medium",
|
|
3254
|
-
"required": false
|
|
3255
|
-
|
|
3256
|
-
"security.separationofduty.governs.security.policyrule": {
|
|
3257
|
-
"id": "security.separationofduty.governs.security.policyrule",
|
|
3258
|
-
"source_spec_node_id": "security.separationofduty",
|
|
3259
|
-
"source_layer": "security",
|
|
3260
|
-
"destination_spec_node_id": "security.policyrule",
|
|
3261
|
-
"destination_layer": "security",
|
|
3262
|
-
"predicate": "governs",
|
|
3263
|
-
"cardinality": "many-to-many",
|
|
3264
|
-
"strength": "medium",
|
|
3265
|
-
"required": false
|
|
3266
|
-
},
|
|
3267
|
-
"security.separationofduty.mitigates.security.threat": {
|
|
3268
|
-
"id": "security.separationofduty.mitigates.security.threat",
|
|
3269
|
-
"source_spec_node_id": "security.separationofduty",
|
|
3270
|
-
"source_layer": "security",
|
|
3271
|
-
"destination_spec_node_id": "security.threat",
|
|
3272
|
-
"destination_layer": "security",
|
|
3273
|
-
"predicate": "mitigates",
|
|
3274
|
-
"cardinality": "many-to-many",
|
|
3275
|
-
"strength": "medium",
|
|
3276
|
-
"required": false
|
|
3277
|
-
},
|
|
3278
|
-
"security.separationofduty.requires.security.accountabilityrequirement": {
|
|
3279
|
-
"id": "security.separationofduty.requires.security.accountabilityrequirement",
|
|
3280
|
-
"source_spec_node_id": "security.separationofduty",
|
|
3281
|
-
"source_layer": "security",
|
|
3282
|
-
"destination_spec_node_id": "security.accountabilityrequirement",
|
|
3283
|
-
"destination_layer": "security",
|
|
3284
|
-
"predicate": "requires",
|
|
3285
|
-
"cardinality": "many-to-many",
|
|
3286
|
-
"strength": "medium",
|
|
3287
|
-
"required": false
|
|
3288
|
-
},
|
|
3289
|
-
"security.threat.accesses.security.secureresource": {
|
|
3290
|
-
"id": "security.threat.accesses.security.secureresource",
|
|
3291
|
-
"source_spec_node_id": "security.threat",
|
|
3292
|
-
"source_layer": "security",
|
|
3293
|
-
"destination_spec_node_id": "security.secureresource",
|
|
3294
|
-
"destination_layer": "security",
|
|
3295
|
-
"predicate": "accesses",
|
|
3296
|
-
"cardinality": "many-to-many",
|
|
3297
|
-
"strength": "medium",
|
|
3298
|
-
"required": false
|
|
3299
|
-
},
|
|
3300
|
-
"security.threat.aggregates.countermeasure": {
|
|
3301
|
-
"id": "security.threat.aggregates.countermeasure",
|
|
3302
|
-
"source_spec_node_id": "security.threat",
|
|
3303
|
-
"source_layer": "security",
|
|
3304
|
-
"destination_spec_node_id": "security.countermeasure",
|
|
3305
|
-
"destination_layer": "security",
|
|
3306
|
-
"predicate": "aggregates",
|
|
3307
|
-
"cardinality": "many-to-many",
|
|
3308
|
-
"strength": "medium",
|
|
3309
|
-
"required": false
|
|
3310
|
-
},
|
|
3311
|
-
"security.threat.constrains.security.accesscondition": {
|
|
3312
|
-
"id": "security.threat.constrains.security.accesscondition",
|
|
3313
|
-
"source_spec_node_id": "security.threat",
|
|
3314
|
-
"source_layer": "security",
|
|
3315
|
-
"destination_spec_node_id": "security.accesscondition",
|
|
3316
|
-
"destination_layer": "security",
|
|
3317
|
-
"predicate": "constrains",
|
|
3318
|
-
"cardinality": "many-to-many",
|
|
3319
|
-
"strength": "medium",
|
|
3320
|
-
"required": false
|
|
3008
|
+
"required": false,
|
|
3009
|
+
"description": "The role may not be combined with the conflicting role for one actor."
|
|
3321
3010
|
},
|
|
3322
3011
|
"security.threat.influence.security.dataclassification": {
|
|
3323
3012
|
"id": "security.threat.influence.security.dataclassification",
|
|
@@ -3328,7 +3017,8 @@
|
|
|
3328
3017
|
"predicate": "influence",
|
|
3329
3018
|
"cardinality": "many-to-many",
|
|
3330
3019
|
"strength": "medium",
|
|
3331
|
-
"required": false
|
|
3020
|
+
"required": false,
|
|
3021
|
+
"description": "The threat raises the classification, and so the protection, of the data it targets."
|
|
3332
3022
|
},
|
|
3333
3023
|
"security.threat.influence.security.securitypolicy": {
|
|
3334
3024
|
"id": "security.threat.influence.security.securitypolicy",
|
|
@@ -3339,29 +3029,20 @@
|
|
|
3339
3029
|
"predicate": "influence",
|
|
3340
3030
|
"cardinality": "many-to-many",
|
|
3341
3031
|
"strength": "medium",
|
|
3342
|
-
"required": false
|
|
3343
|
-
|
|
3344
|
-
"security.threat.maps-to.motivation.requirement": {
|
|
3345
|
-
"id": "security.threat.maps-to.motivation.requirement",
|
|
3346
|
-
"source_spec_node_id": "security.threat",
|
|
3347
|
-
"source_layer": "security",
|
|
3348
|
-
"destination_spec_node_id": "motivation.requirement",
|
|
3349
|
-
"destination_layer": "motivation",
|
|
3350
|
-
"predicate": "maps-to",
|
|
3351
|
-
"cardinality": "many-to-many",
|
|
3352
|
-
"strength": "medium",
|
|
3353
|
-
"required": false
|
|
3032
|
+
"required": false,
|
|
3033
|
+
"description": "The threat shapes the policy, such as rate limits against credential stuffing."
|
|
3354
3034
|
},
|
|
3355
|
-
"security.threat.
|
|
3356
|
-
"id": "security.threat.
|
|
3035
|
+
"security.threat.references.motivation.driver": {
|
|
3036
|
+
"id": "security.threat.references.motivation.driver",
|
|
3357
3037
|
"source_spec_node_id": "security.threat",
|
|
3358
3038
|
"source_layer": "security",
|
|
3359
3039
|
"destination_spec_node_id": "motivation.driver",
|
|
3360
3040
|
"destination_layer": "motivation",
|
|
3361
|
-
"predicate": "
|
|
3041
|
+
"predicate": "references",
|
|
3362
3042
|
"cardinality": "many-to-many",
|
|
3363
3043
|
"strength": "medium",
|
|
3364
|
-
"required": false
|
|
3044
|
+
"required": false,
|
|
3045
|
+
"description": "The threat gives rise to the driver, such as regulatory pressure after a breach."
|
|
3365
3046
|
},
|
|
3366
3047
|
"security.threat.targets.business.businessprocess": {
|
|
3367
3048
|
"id": "security.threat.targets.business.businessprocess",
|
|
@@ -3372,7 +3053,8 @@
|
|
|
3372
3053
|
"predicate": "targets",
|
|
3373
3054
|
"cardinality": "many-to-many",
|
|
3374
3055
|
"strength": "medium",
|
|
3375
|
-
"required": false
|
|
3056
|
+
"required": false,
|
|
3057
|
+
"description": "The threat attacks the business process, such as fraud against checkout."
|
|
3376
3058
|
},
|
|
3377
3059
|
"security.threat.targets.business.businessservice": {
|
|
3378
3060
|
"id": "security.threat.targets.business.businessservice",
|
|
@@ -3383,7 +3065,8 @@
|
|
|
3383
3065
|
"predicate": "targets",
|
|
3384
3066
|
"cardinality": "many-to-many",
|
|
3385
3067
|
"strength": "medium",
|
|
3386
|
-
"required": false
|
|
3068
|
+
"required": false,
|
|
3069
|
+
"description": "The threat attacks the business service."
|
|
3387
3070
|
},
|
|
3388
3071
|
"security.threat.targets.security.informationentity": {
|
|
3389
3072
|
"id": "security.threat.targets.security.informationentity",
|
|
@@ -3394,7 +3077,8 @@
|
|
|
3394
3077
|
"predicate": "targets",
|
|
3395
3078
|
"cardinality": "many-to-many",
|
|
3396
3079
|
"strength": "medium",
|
|
3397
|
-
"required": false
|
|
3080
|
+
"required": false,
|
|
3081
|
+
"description": "The threat aims to read, alter or destroy the information."
|
|
3398
3082
|
},
|
|
3399
3083
|
"security.threat.targets.security.secureresource": {
|
|
3400
3084
|
"id": "security.threat.targets.security.secureresource",
|
|
@@ -3405,29 +3089,8 @@
|
|
|
3405
3089
|
"predicate": "targets",
|
|
3406
3090
|
"cardinality": "many-to-many",
|
|
3407
3091
|
"strength": "medium",
|
|
3408
|
-
"required": false
|
|
3409
|
-
|
|
3410
|
-
"security.threat.triggers.security.auditconfig": {
|
|
3411
|
-
"id": "security.threat.triggers.security.auditconfig",
|
|
3412
|
-
"source_spec_node_id": "security.threat",
|
|
3413
|
-
"source_layer": "security",
|
|
3414
|
-
"destination_spec_node_id": "security.auditconfig",
|
|
3415
|
-
"destination_layer": "security",
|
|
3416
|
-
"predicate": "triggers",
|
|
3417
|
-
"cardinality": "many-to-many",
|
|
3418
|
-
"strength": "medium",
|
|
3419
|
-
"required": false
|
|
3420
|
-
},
|
|
3421
|
-
"security.validationrule.constrains.security.accesscondition": {
|
|
3422
|
-
"id": "security.validationrule.constrains.security.accesscondition",
|
|
3423
|
-
"source_spec_node_id": "security.validationrule",
|
|
3424
|
-
"source_layer": "security",
|
|
3425
|
-
"destination_spec_node_id": "security.accesscondition",
|
|
3426
|
-
"destination_layer": "security",
|
|
3427
|
-
"predicate": "constrains",
|
|
3428
|
-
"cardinality": "many-to-many",
|
|
3429
|
-
"strength": "medium",
|
|
3430
|
-
"required": false
|
|
3092
|
+
"required": false,
|
|
3093
|
+
"description": "The threat attacks the resource."
|
|
3431
3094
|
},
|
|
3432
3095
|
"security.validationrule.constrains.security.fieldaccesscontrol": {
|
|
3433
3096
|
"id": "security.validationrule.constrains.security.fieldaccesscontrol",
|
|
@@ -3438,40 +3101,8 @@
|
|
|
3438
3101
|
"predicate": "constrains",
|
|
3439
3102
|
"cardinality": "many-to-many",
|
|
3440
3103
|
"strength": "medium",
|
|
3441
|
-
"required": false
|
|
3442
|
-
|
|
3443
|
-
"security.validationrule.enforces-requirement.security.fieldaccesscontrol": {
|
|
3444
|
-
"id": "security.validationrule.enforces-requirement.security.fieldaccesscontrol",
|
|
3445
|
-
"source_spec_node_id": "security.validationrule",
|
|
3446
|
-
"source_layer": "security",
|
|
3447
|
-
"destination_spec_node_id": "security.fieldaccesscontrol",
|
|
3448
|
-
"destination_layer": "security",
|
|
3449
|
-
"predicate": "enforces-requirement",
|
|
3450
|
-
"cardinality": "many-to-many",
|
|
3451
|
-
"strength": "medium",
|
|
3452
|
-
"required": false
|
|
3453
|
-
},
|
|
3454
|
-
"security.validationrule.enforces-requirement.security.securityconstraints": {
|
|
3455
|
-
"id": "security.validationrule.enforces-requirement.security.securityconstraints",
|
|
3456
|
-
"source_spec_node_id": "security.validationrule",
|
|
3457
|
-
"source_layer": "security",
|
|
3458
|
-
"destination_spec_node_id": "security.securityconstraints",
|
|
3459
|
-
"destination_layer": "security",
|
|
3460
|
-
"predicate": "enforces-requirement",
|
|
3461
|
-
"cardinality": "many-to-many",
|
|
3462
|
-
"strength": "medium",
|
|
3463
|
-
"required": false
|
|
3464
|
-
},
|
|
3465
|
-
"security.validationrule.realizes.security.policyrule": {
|
|
3466
|
-
"id": "security.validationrule.realizes.security.policyrule",
|
|
3467
|
-
"source_spec_node_id": "security.validationrule",
|
|
3468
|
-
"source_layer": "security",
|
|
3469
|
-
"destination_spec_node_id": "security.policyrule",
|
|
3470
|
-
"destination_layer": "security",
|
|
3471
|
-
"predicate": "realizes",
|
|
3472
|
-
"cardinality": "many-to-many",
|
|
3473
|
-
"strength": "medium",
|
|
3474
|
-
"required": false
|
|
3104
|
+
"required": false,
|
|
3105
|
+
"description": "The field's value must pass the validation rule before the field control applies."
|
|
3475
3106
|
},
|
|
3476
3107
|
"security.validationrule.supports.security.securitypolicy": {
|
|
3477
3108
|
"id": "security.validationrule.supports.security.securitypolicy",
|
|
@@ -3482,7 +3113,8 @@
|
|
|
3482
3113
|
"predicate": "supports",
|
|
3483
3114
|
"cardinality": "many-to-many",
|
|
3484
3115
|
"strength": "medium",
|
|
3485
|
-
"required": false
|
|
3116
|
+
"required": false,
|
|
3117
|
+
"description": "The validation rule helps carry out the policy, such as rejecting script in input."
|
|
3486
3118
|
}
|
|
3487
3119
|
}
|
|
3488
3120
|
}
|