archsight 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +1 -1
  3. data/README.md +6 -1
  4. data/docs/icons.md +29 -2
  5. data/docs/index.md.erb +22 -4
  6. data/docs/modeling.md +268 -6
  7. data/docs/pages.md +12 -3
  8. data/docs/search.md +9 -2
  9. data/docs/togaf.md +8 -1
  10. data/lib/archsight/annotations/asset_annotations.rb +34 -0
  11. data/lib/archsight/annotations/relation_resolver.rb +15 -6
  12. data/lib/archsight/annotations/risk_annotations.rb +21 -0
  13. data/lib/archsight/cli.rb +6 -0
  14. data/lib/archsight/database.rb +57 -3
  15. data/lib/archsight/diagram.rb +7 -0
  16. data/lib/archsight/documentation.rb +10 -6
  17. data/lib/archsight/editor.rb +2 -2
  18. data/lib/archsight/helpers/requirements_blocks.rb +1 -1
  19. data/lib/archsight/helpers/resource_resolver.rb +1 -1
  20. data/lib/archsight/helpers/wiki_links.rb +11 -0
  21. data/lib/archsight/linter.rb +110 -0
  22. data/lib/archsight/mcp/analyze_resource_tool.rb +2 -2
  23. data/lib/archsight/mcp/resource_doc_tool.rb +2 -2
  24. data/lib/archsight/query/ast.rb +2 -1
  25. data/lib/archsight/query/evaluator.rb +2 -2
  26. data/lib/archsight/references.rb +129 -0
  27. data/lib/archsight/requirements.rb +4 -4
  28. data/lib/archsight/resources/application_component.rb +11 -1
  29. data/lib/archsight/resources/application_event.rb +79 -0
  30. data/lib/archsight/resources/application_interface.rb +1 -1
  31. data/lib/archsight/resources/application_service.rb +10 -5
  32. data/lib/archsight/resources/base.rb +40 -5
  33. data/lib/archsight/resources/business_actor.rb +9 -1
  34. data/lib/archsight/resources/business_control.rb +88 -0
  35. data/lib/archsight/resources/business_event.rb +79 -0
  36. data/lib/archsight/resources/business_process.rb +11 -3
  37. data/lib/archsight/resources/business_product.rb +2 -2
  38. data/lib/archsight/resources/business_role.rb +69 -0
  39. data/lib/archsight/resources/compliance_evidence.rb +44 -3
  40. data/lib/archsight/resources/data_object.rb +7 -2
  41. data/lib/archsight/resources/implementation_deliverable.rb +62 -0
  42. data/lib/archsight/resources/implementation_event.rb +52 -0
  43. data/lib/archsight/resources/implementation_gap.rb +49 -0
  44. data/lib/archsight/resources/implementation_plateau.rb +61 -0
  45. data/lib/archsight/resources/implementation_work_package.rb +83 -0
  46. data/lib/archsight/resources/motivation_assessment.rb +121 -0
  47. data/lib/archsight/resources/{business_constraint.rb → motivation_constraint.rb} +11 -5
  48. data/lib/archsight/resources/motivation_driver.rb +50 -0
  49. data/lib/archsight/resources/motivation_goal.rb +14 -2
  50. data/lib/archsight/resources/motivation_principle.rb +75 -0
  51. data/lib/archsight/resources/{business_requirement.rb → motivation_requirement.rb} +27 -7
  52. data/lib/archsight/resources/motivation_stakeholder.rb +9 -2
  53. data/lib/archsight/resources/page.rb +5 -0
  54. data/lib/archsight/resources/strategy_capability.rb +2 -2
  55. data/lib/archsight/resources/technology_event.rb +80 -0
  56. data/lib/archsight/resources/technology_node.rb +8 -2
  57. data/lib/archsight/resources/technology_service.rb +3 -3
  58. data/lib/archsight/resources/technology_system_software.rb +3 -3
  59. data/lib/archsight/resources.rb +34 -3
  60. data/lib/archsight/template.rb +2 -2
  61. data/lib/archsight/version.rb +1 -1
  62. data/lib/archsight/web/api/docs.rb +1 -1
  63. data/lib/archsight/web/api/json_helpers.rb +14 -10
  64. data/lib/archsight/web/api/openapi/spec.yaml +2 -2
  65. data/lib/archsight/web/api/page_helpers.rb +8 -7
  66. data/lib/archsight/web/api/routes.rb +1 -1
  67. data/lib/archsight/web/application.rb +6 -1
  68. data/lib/archsight/web/public/vue/{ApiDocsPage-D-cPRZCT.js → ApiDocsPage-BgqnQgwa.js} +1 -1
  69. data/lib/archsight/web/public/vue/{DocPage-DK6vNDbF.js → DocPage-CNO71nBH.js} +1 -1
  70. data/lib/archsight/web/public/vue/{EditorPage-BoJpQaVw.js → EditorPage-DR0FCNTz.js} +1 -1
  71. data/lib/archsight/web/public/vue/{ErrorPage-PGyjdtEf.js → ErrorPage-BfYArv6s.js} +1 -1
  72. data/lib/archsight/web/public/vue/{GraphView-BLiKR4zP.js → GraphView-BVTW30Ak.js} +1 -1
  73. data/lib/archsight/web/public/vue/HomePage-Wk9P4Pma.js +2 -0
  74. data/lib/archsight/web/public/vue/InstanceRouter-BV8ycydz.js +1 -0
  75. data/lib/archsight/web/public/vue/{InstanceRouter-60Tt3ZNM.css → InstanceRouter-jeavM6PW.css} +1 -1
  76. data/lib/archsight/web/public/vue/KindList-C8yMsN5J.js +1 -0
  77. data/lib/archsight/web/public/vue/{PageView-9MgHtrgl.js → PageView-BaN6TyJB.js} +1 -1
  78. data/lib/archsight/web/public/vue/{QueryError-D1FL1xgA.js → QueryError-D790wH-a.js} +1 -1
  79. data/lib/archsight/web/public/vue/ResourceList-D-66nas2.js +2 -0
  80. data/lib/archsight/web/public/vue/{SearchResults-DiW5XVYW.css → SearchResults-BewvsfOc.css} +1 -1
  81. data/lib/archsight/web/public/vue/SearchResults-CHyqIerQ.js +1 -0
  82. data/lib/archsight/web/public/vue/{WikiPage-CeCQBTDS.js → WikiPage-D2svpk6B.js} +3 -3
  83. data/lib/archsight/web/public/vue/WikiPage-DoFJ0dbW.css +1 -0
  84. data/lib/archsight/web/public/vue/{index-D7m61Ahx.js → index-BXXkUK1V.js} +2 -2
  85. data/lib/archsight/web/public/vue/index-Cov1SnzY.css +1 -0
  86. data/lib/archsight/web/public/vue/{useGraphviz-DweKV7Kg.js → useGraphviz-DlSnFeCL.js} +12 -0
  87. data/lib/archsight/web/public/vue.html +2 -2
  88. metadata +38 -22
  89. data/lib/archsight/web/public/vue/HomePage-C0lR8i2C.js +0 -2
  90. data/lib/archsight/web/public/vue/InstanceRouter-D3W2jJHV.js +0 -1
  91. data/lib/archsight/web/public/vue/KindList-BlsaRBNO.js +0 -1
  92. data/lib/archsight/web/public/vue/ResourceList-vkgFyeOY.js +0 -2
  93. data/lib/archsight/web/public/vue/SearchResults-Cl3O_OEr.js +0 -1
  94. data/lib/archsight/web/public/vue/WikiPage-C-8SG67a.css +0 -1
  95. data/lib/archsight/web/public/vue/index-Dbx3MXWG.css +0 -1
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Archsight
4
- # The business requirements of a selection of resources, as the "Business Requirements" table of an instance page
5
- # shows them, merged over all resources of the selection: one entry per BusinessRequirement, with the status the
4
+ # The requirements of a selection of resources, as the "Requirements" table of an instance page
5
+ # shows them, merged over all resources of the selection: one entry per MotivationRequirement, with the status the
6
6
  # resources give it (`realizes` = implemented, `partiallyRealizes` = partial, `plans` = planned).
7
7
  #
8
8
  # Requirements.collect(db, of: 'ApplicationService: name =~ "Backup"', priority: ["must"])
@@ -12,7 +12,7 @@ module Archsight
12
12
  # Relation verb -> status, best first
13
13
  STATUSES = { "realizes" => "implemented", "partiallyRealizes" => "partial", "plans" => "planned" }.freeze
14
14
  PRIORITIES = %w[must should may].freeze
15
- RELATION = :businessRequirements
15
+ RELATION = :motivationRequirements
16
16
 
17
17
  module_function
18
18
 
@@ -52,7 +52,7 @@ module Archsight
52
52
  row << cell.new(text: e[:by].map { |b| b[:name] }.join("\n")) if with_by
53
53
  row
54
54
  end
55
- ViewTable::Table.new(title: spec[:title].to_s.empty? ? "Business Requirements" : spec[:title],
55
+ ViewTable::Table.new(title: spec[:title].to_s.empty? ? "Requirements" : spec[:title],
56
56
  columns: ["Status", "Name", "Priority", "Story", ("Realized by" if with_by)].compact, rows: rows, total: entries.length)
57
57
  end
58
58
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # ApplicationComponent a part of the ApplicationService
4
4
  class Archsight::Resources::ApplicationComponent < Archsight::Resources::Base
5
- include_annotations :git, :architecture, :generated, :backup
5
+ include_annotations :git, :architecture, :generated, :backup, :asset, :risk
6
6
 
7
7
  description <<~MD
8
8
  Represents a logical part of an application service that can be deployed independently.
@@ -24,6 +24,13 @@ class Archsight::Resources::ApplicationComponent < Archsight::Resources::Base
24
24
  - Backend components
25
25
  - Frontend applications
26
26
  - Background workers
27
+
28
+ ## Security and risk modelling
29
+
30
+ - **Asset at risk:** set `asset/value` and the protection needs; `assesses` from a vulnerability or risk.
31
+ - **Control implementation:** a component that implements a control measure `realizes` the requirement and is
32
+ `evidencedBy` evidence.
33
+ - **Threat agent:** a component can be the `causedBy` of an event (a compromised service).
27
34
  MD
28
35
 
29
36
  icon "component"
@@ -346,4 +353,7 @@ class Archsight::Resources::ApplicationComponent < Archsight::Resources::Base
346
353
  relation :exposes, :applicationInterfaces, :ApplicationInterface
347
354
  relation :dependsOn, :applicationInterfaces, :ApplicationInterface
348
355
  relation :dependsOn, :applicationComponents, :ApplicationComponent
356
+ relation :realizes, :motivationRequirements, :MotivationRequirement
357
+ relation :plans, :motivationRequirements, :MotivationRequirement
358
+ relation :evidencedBy, :complianceEvidences, :ComplianceEvidence
349
359
  end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ApplicationEvent represents an application event: something that happens in an application and triggers or interrupts application behavior
4
+ class Archsight::Resources::ApplicationEvent < Archsight::Resources::Base
5
+ include_annotations :git, :architecture, :risk
6
+
7
+ description <<~MD
8
+ Represents an application event: something that happens in an application and triggers or interrupts application behavior.
9
+
10
+ ## ArchiMate Definition
11
+
12
+ **Layer:** Application
13
+ **Aspect:** Behavior
14
+
15
+ An event is something that happens and influences behavior. It does not last: it triggers or interrupts
16
+ processes and services. In the risk and security overlay of the Open Group paper (*Modeling Enterprise Risk
17
+ Management and Security with the ArchiMate Language*) a threat event and a loss event are events that carry a
18
+ type; set `event/type` to say which.
19
+
20
+ ## Usage
21
+
22
+ Use ApplicationEvent for events on the application level:
23
+
24
+ - Threat events and loss events of applications (an exploit of a service, a burst of failed logins, a data leak)
25
+ - Security alerts raised by an application
26
+ - Triggers of application services (a message arrives, a job is scheduled)
27
+
28
+ ## Event types
29
+
30
+ - `threat-event`: an event with the potential to harm an asset; it can trigger a loss event
31
+ - `attack`: a threat event caused by intentional malicious activity
32
+ - `loss-event`: an event that harms an asset (a hazard materialises, a vulnerability is exploited)
33
+ - `incident`: a loss event that has happened
34
+ - `opportunity-event`: an event that can add value
35
+ - `audit`, `scan`, `change`: events that produce assessments or alter the architecture
36
+ - `other`
37
+
38
+ Filter, group and query by `event/type`, `risk/domain` and `risk/category` to see, for example, every loss
39
+ event of a risk domain.
40
+
41
+ ## How it connects
42
+
43
+ - A threat event `triggers` a loss event or a process or service; threat and loss events may sit on different
44
+ layers (a technology event triggers an application or business event)
45
+ - `causedBy` the threat agent (an actor, component or node)
46
+ - `affects` the assets it harms
47
+ - A `MotivationDriver` (the threat) `triggers` it; a vulnerability `MotivationAssessment` `influences` it
48
+ MD
49
+
50
+ icon "bell-notification"
51
+ layer "application"
52
+
53
+ annotation "event/type",
54
+ description: "What kind of event this is (specialization of the event, see the risk and security overlay)",
55
+ enum: %w[threat-event attack loss-event incident opportunity-event audit scan change other],
56
+ filter: :word,
57
+ summary: true
58
+
59
+ annotation "event/severity",
60
+ description: "Severity of the event",
61
+ enum: %w[info low medium high critical],
62
+ filter: :word,
63
+ summary: true
64
+
65
+ annotation "event/occurred",
66
+ description: "When the event happened or is expected (ISO 8601 date or time)",
67
+ title: "Occurred",
68
+ validator: ->(value) { Archsight::Resources::Page.timestamp_error(value) }
69
+
70
+ relation :triggers, :applicationServices, :ApplicationService
71
+ relation :triggers, :applicationEvents, :ApplicationEvent
72
+ relation :triggers, :businessEvents, :BusinessEvent
73
+ relation :causedBy, :businessActors, :BusinessActor
74
+ relation :causedBy, :applicationComponents, :ApplicationComponent
75
+ relation :causedBy, :technologyNodes, :TechnologyNode
76
+ relation :affects, :applicationServices, :ApplicationService
77
+ relation :affects, :applicationComponents, :ApplicationComponent
78
+ relation :affects, :dataObjects, :DataObject
79
+ end
@@ -47,6 +47,6 @@ class Archsight::Resources::ApplicationInterface < Archsight::Resources::Base
47
47
  enum: ["none", "hard coded", "pbac", "abac", "rbac"]
48
48
 
49
49
  relation :servedBy, :technologyComponents, :TechnologyInterface
50
- relation :realizes, :businessConstraints, :BusinessConstraint
50
+ relation :realizes, :motivationConstraints, :MotivationConstraint
51
51
  relation :serves, :dataObjects, :DataObject
52
52
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  # ApplicationService represents the high level application service that implements capabilities
4
4
  class Archsight::Resources::ApplicationService < Archsight::Resources::Base
5
- include_annotations :git, :architecture, :generated, :backup
5
+ include_annotations :git, :architecture, :generated, :backup, :asset, :risk
6
6
 
7
7
  description <<~MD
8
8
  Represents a high-level application service that implements business capabilities.
@@ -24,6 +24,11 @@ class Archsight::Resources::ApplicationService < Archsight::Resources::Base
24
24
  - Logical groupings of application components
25
25
  - Services exposed to business processes
26
26
  - APIs and their implementations as a cohesive unit
27
+
28
+ ## Security and risk modelling
29
+
30
+ A service is an asset at risk (`asset/*` profile, protection needs) that loss events `affects`, a trigger target
31
+ for `ApplicationEvent`s, and the place where requirements are realized and evidenced.
27
32
  MD
28
33
 
29
34
  icon "cube"
@@ -214,10 +219,10 @@ class Archsight::Resources::ApplicationService < Archsight::Resources::Base
214
219
  relation :realizedThrough, :applicationComponents, :ApplicationComponent
215
220
  relation :servedBy, :businessActors, :BusinessActor
216
221
  relation :servedBy, :technologyServices, :TechnologyService
217
- relation :realizes, :businessConstraints, :BusinessConstraint
218
- relation :realizes, :businessRequirements, :BusinessRequirement
219
- relation :partiallyRealizes, :businessRequirements, :BusinessRequirement
220
- relation :plans, :businessRequirements, :BusinessRequirement
222
+ relation :realizes, :motivationConstraints, :MotivationConstraint
223
+ relation :realizes, :motivationRequirements, :MotivationRequirement
224
+ relation :partiallyRealizes, :motivationRequirements, :MotivationRequirement
225
+ relation :plans, :motivationRequirements, :MotivationRequirement
221
226
  relation :realizes, :dataObjects, :DataObject
222
227
  relation :evidencedBy, :complianceEvidences, :ComplianceEvidence
223
228
  end
@@ -15,12 +15,21 @@ module Archsight
15
15
  end
16
16
 
17
17
  def self.relation(verb, kind, klass_name)
18
- @relations ||= [] #: Array[[Symbol, Symbol, String]]
19
- @relations << [verb, kind, klass_name]
18
+ @declared_relations ||= [] #: Array[[Symbol, Symbol, String]]
19
+ @declared_relations << [verb, kind, klass_name]
20
+ @relations = nil
20
21
  end
21
22
 
23
+ # The relations a resource of this kind may be written with in a file (`spec`)
24
+ def self.declared_relations
25
+ @declared_relations || []
26
+ end
27
+
28
+ # Every relation a resource of this kind can have: the declared ones and the derived ones (`mentions`,
29
+ # `depicts`, see Archsight::References). Everything that follows relations (queries, graphs, impact analysis)
30
+ # uses this; what lets a user write or choose relations uses declared_relations.
22
31
  def self.relations
23
- @relations || []
32
+ @relations ||= (declared_relations + Archsight::Resources::DERIVED_RELATIONS).freeze
24
33
  end
25
34
 
26
35
  # A kind may mark at most this many annotations as summary (see Base.annotation)
@@ -111,6 +120,17 @@ module Archsight
111
120
  annotation_matching(key)&.format
112
121
  end
113
122
 
123
+ # The formats this kind defines for the given annotation keys, `{ "evidence/gaps" => "markdown" }` (keys without
124
+ # a format are left out). The frontend shows each value accordingly.
125
+ def self.annotation_formats(keys)
126
+ formats = {} #: Hash[String, String]
127
+ keys.each do |key|
128
+ format = annotation_format(key)
129
+ formats[key] = format.to_s if format
130
+ end
131
+ formats
132
+ end
133
+
114
134
  def self.annotation_enum(key)
115
135
  annotation_matching(key)&.enum
116
136
  end
@@ -231,17 +251,32 @@ module Archsight
231
251
  end
232
252
 
233
253
  def verb_allowed?(verb)
234
- self.class.relations.any? { |v, _, _| v.to_s == verb.to_s }
254
+ self.class.declared_relations.any? { |v, _, _| v.to_s == verb.to_s }
235
255
  end
236
256
 
237
257
  def verb_kind_allowed?(verb, kind)
238
- self.class.relations.any? { |v, k, _| v.to_s == verb.to_s && k.to_s == kind.to_s }
258
+ self.class.declared_relations.any? { |v, k, _| v.to_s == verb.to_s && k.to_s == kind.to_s }
239
259
  end
240
260
 
241
261
  def relations(verb, kind)
242
262
  (spec[verb.to_s] || {})[kind.to_s] || []
243
263
  end
244
264
 
265
+ # Records a relation that is derived from this resource's text or diagram, not written in its file: the target
266
+ # goes into `spec` where the relations of this verb are read (so queries and graphs see it like any other) and
267
+ # learns about this resource as one that refers to it.
268
+ def add_derived_relation(verb, target)
269
+ key = Archsight::Resources::DERIVED_KEY.to_s
270
+ spec_root = (@raw["spec"] ||= {}) #: Hash[String, untyped]
271
+ by_key = (spec_root[verb.to_s] ||= {}) #: Hash[String, Array[Base]]
272
+ by_key[key] ||= [] #: Array[Base]
273
+ targets = by_key.fetch(key)
274
+ return if targets.any? { |known| known.equal?(target) }
275
+
276
+ targets << target
277
+ target.referenced_by(self, verb.to_sym)
278
+ end
279
+
245
280
  def set_relations(verb, kind, rels)
246
281
  spec[verb.to_s][kind.to_s] = rels
247
282
  rels.each { |rel| rel.referenced_by(self, verb) }
@@ -2,7 +2,7 @@
2
2
 
3
3
  # BusinessActor represents teams or organizational units
4
4
  class Archsight::Resources::BusinessActor < Archsight::Resources::Base
5
- include_annotations :git, :architecture, :generated
5
+ include_annotations :git, :architecture, :generated, :asset, :risk
6
6
 
7
7
  description <<~MD
8
8
  Represents a team, organizational unit, or external entity that performs business behavior.
@@ -25,6 +25,14 @@ class Archsight::Resources::BusinessActor < Archsight::Resources::Base
25
25
  - External vendors or partners
26
26
  - Support organizations
27
27
  - Cross-functional groups
28
+
29
+ ## Security and risk modelling
30
+
31
+ - **Threat agent:** an actor (also an external one, such as an attacker group or a supplier) can be the
32
+ `causedBy` of a threat or loss event.
33
+ - **Owner and executor:** actors own risks (`MotivationAssessment` `ownedBy`), policies and controls, directly or through a `BusinessRole` they `performedBy`.
34
+ - **Asset:** a supplier or a team can be an asset at risk; set the `asset/*` profile and `assesses` it from a
35
+ supplier assessment.
28
36
  MD
29
37
 
30
38
  icon "community"
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ # BusinessControl represents a control that guides a business process
4
+ class Archsight::Resources::BusinessControl < Archsight::Resources::Base
5
+ include_annotations :git, :architecture, :risk
6
+
7
+ description <<~MD
8
+ Represents a control: a safeguard or decision step with an owner that guides how a business process is carried out.
9
+
10
+ ## ArchiMate / TOGAF Definition
11
+
12
+ **Layer:** Business
13
+ **Aspect:** Behavior (guidance)
14
+
15
+ ArchiMate has no control element. TOGAF's content metamodel has one: a decision-making step with
16
+ accountability and authority, applied to a process or function. A control is therefore modelled as
17
+ a business-layer kind that a `BusinessProcess` is guided by (`guidedBy`).
18
+
19
+ ## Usage
20
+
21
+ Use BusinessControl to represent:
22
+
23
+ - Security and compliance controls (access review, network documentation, backup verification)
24
+ - Operational checks that a process must pass (change approval, four-eyes principle)
25
+ - Controls of a standard or framework (BSI C5, ISO 27001, SOC 2), linked to the requirements they satisfy
26
+
27
+ ## How it connects
28
+
29
+ - A `BusinessProcess` is `guidedBy` the control
30
+ - The control is `ownedBy` the actor or role that is accountable for it and `executedBy` the actors or roles that carry it out
31
+ - The control `satisfies` requirements and is `evidencedBy` compliance evidence
32
+
33
+ A control addresses requirements from the **process side**. Whether an application implements a requirement is
34
+ stated on the application (`realizes`, `plans`, `evidencedBy`), not on the control. Link evidence to a control
35
+ only for the records the control itself produces (reviews, diagrams, change history, audit logs), and set the
36
+ `evidence/type` of that evidence to `process`, `documentation` or `audit-log`.
37
+
38
+ Put the best practices and the evidence requirements of a control in the description.
39
+
40
+ ## Security and risk modelling
41
+
42
+ A control is the process-side implementation of a control measure. `satisfies` the requirements (catalogue
43
+ controls and control measures); a risk it reduces is `mitigatedBy` the control (written on the assessment).
44
+ Group controls with `risk/domain` and `risk/category`.
45
+ MD
46
+
47
+ icon "shield-search"
48
+ layer "business"
49
+
50
+ annotation "control/id",
51
+ description: "Identifier of the control in its catalogue (e.g. COS-07)",
52
+ title: "Control ID",
53
+ summary: true
54
+
55
+ annotation "control/status",
56
+ description: "Implementation status of the control",
57
+ enum: %w[implemented partial planned not-implemented],
58
+ filter: :word,
59
+ summary: true
60
+
61
+ annotation "control/frequency",
62
+ description: "How often the control is carried out",
63
+ enum: %w[continuous event-based daily weekly monthly quarterly semi-annually annually],
64
+ filter: :word,
65
+ summary: true
66
+
67
+ annotation "control/objective",
68
+ description: "What the control achieves, in one short paragraph",
69
+ title: "Objective",
70
+ format: :markdown
71
+
72
+ annotation "control/last-review",
73
+ description: "When the control was last reviewed (ISO 8601 date or time)",
74
+ title: "Last review",
75
+ validator: ->(value) { Archsight::Resources::Page.timestamp_error(value) }
76
+
77
+ annotation "control/next-review",
78
+ description: "When the control is due for review (ISO 8601 date or time)",
79
+ title: "Next review",
80
+ validator: ->(value) { Archsight::Resources::Page.timestamp_error(value) }
81
+
82
+ relation :ownedBy, :businessActors, :BusinessActor
83
+ relation :executedBy, :businessActors, :BusinessActor
84
+ relation :ownedBy, :businessRoles, :BusinessRole
85
+ relation :executedBy, :businessRoles, :BusinessRole
86
+ relation :satisfies, :motivationRequirements, :MotivationRequirement
87
+ relation :evidencedBy, :complianceEvidences, :ComplianceEvidence
88
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ # BusinessEvent represents a business event: something that happens in the business and triggers or interrupts business behavior
4
+ class Archsight::Resources::BusinessEvent < Archsight::Resources::Base
5
+ include_annotations :git, :architecture, :risk
6
+
7
+ description <<~MD
8
+ Represents a business event: something that happens in the business and triggers or interrupts business behavior.
9
+
10
+ ## ArchiMate Definition
11
+
12
+ **Layer:** Business
13
+ **Aspect:** Behavior
14
+
15
+ An event is something that happens and influences behavior. It does not last: it triggers or interrupts
16
+ processes and services. In the risk and security overlay of the Open Group paper (*Modeling Enterprise Risk
17
+ Management and Security with the ArchiMate Language*) a threat event and a loss event are events that carry a
18
+ type; set `event/type` to say which.
19
+
20
+ ## Usage
21
+
22
+ Use BusinessEvent for events on the business level:
23
+
24
+ - Threat events and loss events of the business (fraud, supplier failure, loss of a facility, a failed audit)
25
+ - Incidents that stop a process or a service
26
+ - Triggers of business processes (a customer order, the end of a quarter)
27
+
28
+ ## Event types
29
+
30
+ - `threat-event`: an event with the potential to harm an asset; it can trigger a loss event
31
+ - `attack`: a threat event caused by intentional malicious activity
32
+ - `loss-event`: an event that harms an asset (a hazard materialises, a vulnerability is exploited)
33
+ - `incident`: a loss event that has happened
34
+ - `opportunity-event`: an event that can add value
35
+ - `audit`, `scan`, `change`: events that produce assessments or alter the architecture
36
+ - `other`
37
+
38
+ Filter, group and query by `event/type`, `risk/domain` and `risk/category` to see, for example, every loss
39
+ event of a risk domain.
40
+
41
+ ## How it connects
42
+
43
+ - A threat event `triggers` a loss event or a process or service; threat and loss events may sit on different
44
+ layers (a technology event triggers an application or business event)
45
+ - `causedBy` the threat agent (an actor, component or node)
46
+ - `affects` the assets it harms
47
+ - A `MotivationDriver` (the threat) `triggers` it; a vulnerability `MotivationAssessment` `influences` it
48
+ MD
49
+
50
+ icon "flash"
51
+ layer "business"
52
+
53
+ annotation "event/type",
54
+ description: "What kind of event this is (specialization of the event, see the risk and security overlay)",
55
+ enum: %w[threat-event attack loss-event incident opportunity-event audit scan change other],
56
+ filter: :word,
57
+ summary: true
58
+
59
+ annotation "event/severity",
60
+ description: "Severity of the event",
61
+ enum: %w[info low medium high critical],
62
+ filter: :word,
63
+ summary: true
64
+
65
+ annotation "event/occurred",
66
+ description: "When the event happened or is expected (ISO 8601 date or time)",
67
+ title: "Occurred",
68
+ validator: ->(value) { Archsight::Resources::Page.timestamp_error(value) }
69
+
70
+ relation :triggers, :businessProcesses, :BusinessProcess
71
+ relation :triggers, :businessEvents, :BusinessEvent
72
+ relation :causedBy, :businessActors, :BusinessActor
73
+ relation :causedBy, :applicationComponents, :ApplicationComponent
74
+ relation :causedBy, :technologyNodes, :TechnologyNode
75
+ relation :affects, :businessProcesses, :BusinessProcess
76
+ relation :affects, :businessProducts, :BusinessProduct
77
+ relation :affects, :businessActors, :BusinessActor
78
+ relation :affects, :dataObjects, :DataObject
79
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  # BusinessProcess represents a structured business workflow or procedure
4
4
  class Archsight::Resources::BusinessProcess < Archsight::Resources::Base
5
- include_annotations :git, :architecture
5
+ include_annotations :git, :architecture, :asset, :risk
6
6
 
7
7
  description <<~MD
8
8
  Represents a sequence of business behaviors that achieves a specific outcome.
@@ -25,13 +25,21 @@ class Archsight::Resources::BusinessProcess < Archsight::Resources::Base
25
25
  - Change management processes
26
26
  - Release deployment pipelines
27
27
  - Support escalation processes
28
+
29
+ ## Security and risk modelling
30
+
31
+ A process is an asset at risk (set `asset/value` and the protection needs `asset/confidentiality`,
32
+ `asset/integrity`, `asset/availability`), is `guidedBy` the controls that protect it, is hit by loss
33
+ events and is triggered by events. Group it with `risk/domain`.
28
34
  MD
29
35
 
30
36
  icon "kanban-board"
31
37
  layer "business"
32
38
 
33
- relation :realizes, :businessConstraints, :BusinessConstraint
34
- relation :realizes, :businessRequirements, :BusinessRequirement
39
+ relation :realizes, :motivationConstraints, :MotivationConstraint
40
+ relation :realizes, :motivationRequirements, :MotivationRequirement
35
41
  relation :servedBy, :applicationServices, :ApplicationService
36
42
  relation :performedBy, :businessActors, :BusinessActor
43
+ relation :performedBy, :businessRoles, :BusinessRole
44
+ relation :guidedBy, :businessControls, :BusinessControl
37
45
  end
@@ -198,8 +198,8 @@ class Archsight::Resources::BusinessProduct < Archsight::Resources::Base
198
198
  end
199
199
 
200
200
  relation :realizes, :strategyCapabilities, :StrategyCapability
201
- relation :realizes, :businessConstraints, :BusinessConstraint
202
- relation :realizes, :businessRequirements, :BusinessRequirement
201
+ relation :realizes, :motivationConstraints, :MotivationConstraint
202
+ relation :realizes, :motivationRequirements, :MotivationRequirement
203
203
  relation :servedBy, :businessActors, :BusinessActor
204
204
  relation :servedBy, :applicationServices, :ApplicationService
205
205
  relation :exposes, :applicationInterfaces, :ApplicationInterface
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ # BusinessRole represents a responsibility that actors take on
4
+ class Archsight::Resources::BusinessRole < Archsight::Resources::Base
5
+ include_annotations :git, :architecture, :risk
6
+
7
+ description <<~MD
8
+ Represents the responsibility for performing specific behavior, to which an actor can be assigned.
9
+
10
+ ## ArchiMate Definition
11
+
12
+ **Layer:** Business
13
+ **Aspect:** Active Structure
14
+
15
+ A business role is the responsibility for performing specific behavior, to which an actor can be assigned. The
16
+ role is what a process, a control or a risk refers to; the actor (a team) holds the role. Changing who holds the
17
+ role changes it everywhere it is used.
18
+
19
+ ## Usage
20
+
21
+ Use BusinessRole to represent:
22
+
23
+ - Roles of an ISMS: information security officer, data protection officer, control owner, control executor,
24
+ risk owner
25
+ - Roles in a process (incident manager, release approver)
26
+ - Any responsibility that should not be tied to one team by name
27
+
28
+ ## How it connects
29
+
30
+ The responsibility edges point down to the role, and the role points down to the actor that holds it:
31
+
32
+ ```
33
+ BusinessProcess ──performedBy──▶ BusinessRole ──performedBy──▶ BusinessActor
34
+ BusinessControl ──ownedBy / executedBy──▶ BusinessRole
35
+ ```
36
+
37
+ - A `BusinessProcess` is `performedBy` the role, a `BusinessControl` is `ownedBy` and `executedBy` it
38
+ - Assessments, principles, work packages, deliverables and implementation events are `ownedBy` it
39
+ - The role is `performedBy` the actors that hold it
40
+ - Pointing straight at an actor stays valid; use a role where the responsibility has a name of its own
41
+
42
+ ## Security and risk modelling
43
+
44
+ Roles carry the accountability of the ISMS: the owner and executor roles of controls (BSI C5, ITGS), the owner of
45
+ a risk, the issuer of a policy. Use `role/type` to tell owners, executors and officers apart and `risk/domain`
46
+ to group roles by context.
47
+ MD
48
+
49
+ icon "user-badge-check"
50
+ layer "business"
51
+
52
+ annotation "role/id",
53
+ description: "Identifier of the role in its list (e.g. ISB, DPO)",
54
+ title: "Role ID",
55
+ summary: true
56
+
57
+ annotation "role/type",
58
+ description: "What kind of responsibility the role is (specialization of the role)",
59
+ enum: %w[owner executor officer reviewer operator other],
60
+ filter: :word,
61
+ summary: true
62
+
63
+ annotation "role/scope",
64
+ description: "What the role is responsible for, in a short paragraph",
65
+ title: "Scope",
66
+ format: :markdown
67
+
68
+ relation :performedBy, :businessActors, :BusinessActor
69
+ end
@@ -9,7 +9,7 @@ class Archsight::Resources::ComplianceEvidence < Archsight::Resources::Base
9
9
 
10
10
  ## ArchiMate Definition
11
11
 
12
- **Layer:** Implementation & Migration
12
+ **Layer:** Business (as a kind; ArchiMate would place evidence in Implementation & Migration)
13
13
  **Aspect:** Passive Structure
14
14
 
15
15
  Compliance evidence represents tangible proof that a system or process meets specific
@@ -25,6 +25,19 @@ class Archsight::Resources::ComplianceEvidence < Archsight::Resources::Base
25
25
  - Test results and reports
26
26
  - Configuration documentation
27
27
  - Process documentation
28
+
29
+ ## Evidence of what
30
+
31
+ - **Of an application:** linked with `evidencedBy` from a service, component or technology element; it says how
32
+ that resource meets the requirement it `satisfies`
33
+ - **Of a control:** linked with `evidencedBy` from a `BusinessControl`; the records the control produces
34
+ (reviews, diagrams, change history, audit logs). Use `evidence/type` `process`, `documentation` or `audit-log`
35
+
36
+ ## Security and risk modelling
37
+
38
+ Evidence is the proof that a control measure works. Use `evidence/status` `not-applicable` when the requirement
39
+ does not apply (BSI "entbehrlich"). Evidence of risk treatment (a test, a review, an audit report) is linked
40
+ from the control or application it is about.
28
41
  MD
29
42
 
30
43
  icon "shield-check"
@@ -37,8 +50,36 @@ class Archsight::Resources::ComplianceEvidence < Archsight::Resources::Base
37
50
 
38
51
  annotation "evidence/status",
39
52
  description: "Current status of evidence",
40
- enum: %w[implemented partial not-implemented],
53
+ enum: %w[implemented partial not-implemented not-applicable],
41
54
  summary: true
42
55
 
43
- relation :satisfies, :businessRequirements, :BusinessRequirement
56
+ # The structured answer to "how does the evidenced resource meet the requirement": one markdown field per
57
+ # question. `architecture/description` stays a short summary; the fields hold the detail.
58
+ annotation "evidence/mechanism",
59
+ description: "How the requirement is implemented: the concrete mechanism and where it lives " \
60
+ "(code, chart, configuration), as a short markdown list",
61
+ format: :markdown
62
+
63
+ annotation "evidence/coverage",
64
+ description: "What the mechanism covers and what it does not (data, flows, tenants, environments)",
65
+ format: :markdown
66
+
67
+ annotation "evidence/operatorView",
68
+ description: "Whether the mechanism holds against operators (admins, platform staff) or only against " \
69
+ "other tenants; names the privileged paths",
70
+ format: :markdown
71
+
72
+ annotation "evidence/verification",
73
+ description: "How effectiveness is verified: tests, audits, documents; says so when there are none",
74
+ format: :markdown
75
+
76
+ annotation "evidence/gaps",
77
+ description: "Remaining gaps and open questions, the most important first",
78
+ format: :markdown
79
+
80
+ annotation "evidence/sources",
81
+ description: "Where the statements come from: repositories and files, wiki pages, tickets",
82
+ format: :markdown
83
+
84
+ relation :satisfies, :motivationRequirements, :MotivationRequirement
44
85
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  # DataObject represents data structured for automated processing (ArchiMate Application Layer)
4
4
  class Archsight::Resources::DataObject < Archsight::Resources::Base
5
- include_annotations :git, :architecture, :generated
5
+ include_annotations :git, :architecture, :generated, :asset, :risk
6
6
 
7
7
  description <<~MD
8
8
  Represents data structured for automated processing by applications.
@@ -25,6 +25,11 @@ class Archsight::Resources::DataObject < Archsight::Resources::Base
25
25
  - Message payloads
26
26
  - Configuration structures
27
27
  - Domain models
28
+
29
+ ## Security and risk modelling
30
+
31
+ Data objects carry the information assets: set `asset/value` and the protection needs
32
+ (`asset/confidentiality`, `asset/integrity`, `asset/availability`, BSI Schutzbedarf), and `risk/domain`.
28
33
  MD
29
34
 
30
35
  icon "database"
@@ -46,5 +51,5 @@ class Archsight::Resources::DataObject < Archsight::Resources::Base
46
51
  title: "Schema Variants",
47
52
  sidebar: false
48
53
 
49
- relation :realizes, :businessConstraints, :BusinessConstraint
54
+ relation :realizes, :motivationConstraints, :MotivationConstraint
50
55
  end