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.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +1 -1
- data/README.md +6 -1
- data/docs/icons.md +29 -2
- data/docs/index.md.erb +22 -4
- data/docs/modeling.md +268 -6
- data/docs/pages.md +12 -3
- data/docs/search.md +9 -2
- data/docs/togaf.md +8 -1
- data/lib/archsight/annotations/asset_annotations.rb +34 -0
- data/lib/archsight/annotations/relation_resolver.rb +15 -6
- data/lib/archsight/annotations/risk_annotations.rb +21 -0
- data/lib/archsight/cli.rb +6 -0
- data/lib/archsight/database.rb +57 -3
- data/lib/archsight/diagram.rb +7 -0
- data/lib/archsight/documentation.rb +10 -6
- data/lib/archsight/editor.rb +2 -2
- data/lib/archsight/helpers/requirements_blocks.rb +1 -1
- data/lib/archsight/helpers/resource_resolver.rb +1 -1
- data/lib/archsight/helpers/wiki_links.rb +11 -0
- data/lib/archsight/linter.rb +110 -0
- data/lib/archsight/mcp/analyze_resource_tool.rb +2 -2
- data/lib/archsight/mcp/resource_doc_tool.rb +2 -2
- data/lib/archsight/query/ast.rb +2 -1
- data/lib/archsight/query/evaluator.rb +2 -2
- data/lib/archsight/references.rb +129 -0
- data/lib/archsight/requirements.rb +4 -4
- data/lib/archsight/resources/application_component.rb +11 -1
- data/lib/archsight/resources/application_event.rb +79 -0
- data/lib/archsight/resources/application_interface.rb +1 -1
- data/lib/archsight/resources/application_service.rb +10 -5
- data/lib/archsight/resources/base.rb +40 -5
- data/lib/archsight/resources/business_actor.rb +9 -1
- data/lib/archsight/resources/business_control.rb +88 -0
- data/lib/archsight/resources/business_event.rb +79 -0
- data/lib/archsight/resources/business_process.rb +11 -3
- data/lib/archsight/resources/business_product.rb +2 -2
- data/lib/archsight/resources/business_role.rb +69 -0
- data/lib/archsight/resources/compliance_evidence.rb +44 -3
- data/lib/archsight/resources/data_object.rb +7 -2
- data/lib/archsight/resources/implementation_deliverable.rb +62 -0
- data/lib/archsight/resources/implementation_event.rb +52 -0
- data/lib/archsight/resources/implementation_gap.rb +49 -0
- data/lib/archsight/resources/implementation_plateau.rb +61 -0
- data/lib/archsight/resources/implementation_work_package.rb +83 -0
- data/lib/archsight/resources/motivation_assessment.rb +121 -0
- data/lib/archsight/resources/{business_constraint.rb → motivation_constraint.rb} +11 -5
- data/lib/archsight/resources/motivation_driver.rb +50 -0
- data/lib/archsight/resources/motivation_goal.rb +14 -2
- data/lib/archsight/resources/motivation_principle.rb +75 -0
- data/lib/archsight/resources/{business_requirement.rb → motivation_requirement.rb} +27 -7
- data/lib/archsight/resources/motivation_stakeholder.rb +9 -2
- data/lib/archsight/resources/page.rb +5 -0
- data/lib/archsight/resources/strategy_capability.rb +2 -2
- data/lib/archsight/resources/technology_event.rb +80 -0
- data/lib/archsight/resources/technology_node.rb +8 -2
- data/lib/archsight/resources/technology_service.rb +3 -3
- data/lib/archsight/resources/technology_system_software.rb +3 -3
- data/lib/archsight/resources.rb +34 -3
- data/lib/archsight/template.rb +2 -2
- data/lib/archsight/version.rb +1 -1
- data/lib/archsight/web/api/docs.rb +1 -1
- data/lib/archsight/web/api/json_helpers.rb +14 -10
- data/lib/archsight/web/api/openapi/spec.yaml +2 -2
- data/lib/archsight/web/api/page_helpers.rb +8 -7
- data/lib/archsight/web/api/routes.rb +1 -1
- data/lib/archsight/web/application.rb +6 -1
- data/lib/archsight/web/public/vue/{ApiDocsPage-D-cPRZCT.js → ApiDocsPage-BgqnQgwa.js} +1 -1
- data/lib/archsight/web/public/vue/{DocPage-DK6vNDbF.js → DocPage-CNO71nBH.js} +1 -1
- data/lib/archsight/web/public/vue/{EditorPage-BoJpQaVw.js → EditorPage-DR0FCNTz.js} +1 -1
- data/lib/archsight/web/public/vue/{ErrorPage-PGyjdtEf.js → ErrorPage-BfYArv6s.js} +1 -1
- data/lib/archsight/web/public/vue/{GraphView-BLiKR4zP.js → GraphView-BVTW30Ak.js} +1 -1
- data/lib/archsight/web/public/vue/HomePage-Wk9P4Pma.js +2 -0
- data/lib/archsight/web/public/vue/InstanceRouter-BV8ycydz.js +1 -0
- data/lib/archsight/web/public/vue/{InstanceRouter-60Tt3ZNM.css → InstanceRouter-jeavM6PW.css} +1 -1
- data/lib/archsight/web/public/vue/KindList-C8yMsN5J.js +1 -0
- data/lib/archsight/web/public/vue/{PageView-9MgHtrgl.js → PageView-BaN6TyJB.js} +1 -1
- data/lib/archsight/web/public/vue/{QueryError-D1FL1xgA.js → QueryError-D790wH-a.js} +1 -1
- data/lib/archsight/web/public/vue/ResourceList-D-66nas2.js +2 -0
- data/lib/archsight/web/public/vue/{SearchResults-DiW5XVYW.css → SearchResults-BewvsfOc.css} +1 -1
- data/lib/archsight/web/public/vue/SearchResults-CHyqIerQ.js +1 -0
- data/lib/archsight/web/public/vue/{WikiPage-CeCQBTDS.js → WikiPage-D2svpk6B.js} +3 -3
- data/lib/archsight/web/public/vue/WikiPage-DoFJ0dbW.css +1 -0
- data/lib/archsight/web/public/vue/{index-D7m61Ahx.js → index-BXXkUK1V.js} +2 -2
- data/lib/archsight/web/public/vue/index-Cov1SnzY.css +1 -0
- data/lib/archsight/web/public/vue/{useGraphviz-DweKV7Kg.js → useGraphviz-DlSnFeCL.js} +12 -0
- data/lib/archsight/web/public/vue.html +2 -2
- metadata +38 -22
- data/lib/archsight/web/public/vue/HomePage-C0lR8i2C.js +0 -2
- data/lib/archsight/web/public/vue/InstanceRouter-D3W2jJHV.js +0 -1
- data/lib/archsight/web/public/vue/KindList-BlsaRBNO.js +0 -1
- data/lib/archsight/web/public/vue/ResourceList-vkgFyeOY.js +0 -2
- data/lib/archsight/web/public/vue/SearchResults-Cl3O_OEr.js +0 -1
- data/lib/archsight/web/public/vue/WikiPage-C-8SG67a.css +0 -1
- 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
|
|
5
|
-
# shows them, merged over all resources of the selection: one entry per
|
|
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 = :
|
|
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? ? "
|
|
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, :
|
|
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, :
|
|
218
|
-
relation :realizes, :
|
|
219
|
-
relation :partiallyRealizes, :
|
|
220
|
-
relation :plans, :
|
|
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
|
-
@
|
|
19
|
-
@
|
|
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.
|
|
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.
|
|
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, :
|
|
34
|
-
relation :realizes, :
|
|
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, :
|
|
202
|
-
relation :realizes, :
|
|
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
|
-
|
|
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, :
|
|
54
|
+
relation :realizes, :motivationConstraints, :MotivationConstraint
|
|
50
55
|
end
|