create-filegrc 0.3.4 → 0.5.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 +4 -3
- package/package.json +1 -1
- package/src/cli.js +12 -4
- package/src/defaults.js +299 -123
- package/src/index.js +30 -17
- package/template/AGENTS.md +55 -17
- package/template/README.md +20 -9
- package/template/WORKSPACE.md +13 -0
- package/template/data/AGENTS.md +41 -11
- package/template/data/action-items/AGENTS.md +2 -2
- package/template/data/appointments/appointment-independent-policy-reviewer.json +11 -0
- package/template/data/appointments/appointment-policy-owner.json +11 -0
- package/template/data/audits/AGENTS.md +1 -1
- package/template/data/collection-reviews/collection-review-complementary-control.json +10 -0
- package/template/data/collection-reviews/collection-review-framework.json +10 -0
- package/template/data/collection-reviews/collection-review-person.json +10 -0
- package/template/data/collection-reviews/collection-review-system.json +10 -0
- package/template/data/collection-reviews/collection-review-vendor.json +10 -0
- package/template/data/documents/document-business-continuity-disaster-recovery.json +14 -13
- package/template/data/documents/document-business-continuity-disaster-recovery.md +3 -1
- package/template/data/documents/document-contractor-policy-acknowledgement.json +12 -12
- package/template/data/documents/document-contractor-training-acknowledgement.json +15 -13
- package/template/data/documents/document-data-retention-schedule.json +11 -12
- package/template/data/documents/document-employee-handbook-acknowledgement.json +12 -12
- package/template/data/documents/document-employee-policy-acknowledgement.json +12 -12
- package/template/data/documents/document-employee-training-acknowledgement.json +15 -13
- package/template/data/documents/document-incident-response-plan.json +14 -13
- package/template/data/documents/document-incident-response-plan.md +4 -2
- package/template/data/documents/document-soc2-management-assertion.json +3 -3
- package/template/data/documents/document-soc2-management-representation.json +3 -3
- package/template/data/documents/document-soc2-period-completeness.json +3 -3
- package/template/data/documents/document-soc2-system-description.json +3 -3
- package/template/data/evidence/AGENTS.md +3 -3
- package/template/data/obligation-events/AGENTS.md +2 -2
- package/template/data/obligations/AGENTS.md +1 -1
- package/template/data/people/person-program-lead.json +9 -0
- package/template/data/policies/AGENTS.md +1 -1
- package/template/data/policies/policy-anti-bribery-corruption.json +10 -15
- package/template/data/policies/policy-anti-bribery-corruption.md +1 -1
- package/template/data/policies/policy-clear-desk-screen.json +9 -14
- package/template/data/policies/policy-clear-desk-screen.md +1 -1
- package/template/data/policies/policy-data-protection-handling.json +13 -24
- package/template/data/policies/policy-data-protection-handling.md +2 -2
- package/template/data/policies/policy-employee-handbook.json +9 -18
- package/template/data/policies/policy-information-security.json +11 -42
- package/template/data/policies/policy-information-security.md +3 -3
- package/template/data/policies/policy-mobile-computing-communications.json +9 -18
- package/template/data/policies/policy-mobile-computing-communications.md +1 -1
- package/template/data/renderer.json +1 -3
- package/template/data/systems/system-filegrc-program-repository.md +2 -2
- package/template/data/training/training-anti-bribery-high-risk-roles.json +1 -2
- package/template/data/training/training-privileged-sensitive-roles.json +1 -2
- package/template/data/training/training-secure-development.json +1 -2
- package/template/data/training/training-security-awareness.json +7 -9
- package/template/data/training/training-security-awareness.md +1 -1
- package/template/data/workspace.json +19 -8
- package/template/docs/filegrc-home.png +0 -0
- package/template/package.json +3 -2
- package/template-parameters.json +6 -1
- package/template/data/people/person-policy-owner.json +0 -10
package/src/defaults.js
CHANGED
|
@@ -3,7 +3,8 @@ import { mkdir, writeFile } from "node:fs/promises";
|
|
|
3
3
|
|
|
4
4
|
const FRAMEWORK_ID = "framework-aicpa-trust-services-criteria";
|
|
5
5
|
const DESCRIPTION_FRAMEWORK_ID = "framework-aicpa-soc2-description-criteria";
|
|
6
|
-
const
|
|
6
|
+
const PROGRAM_LEAD_ID = "person-program-lead";
|
|
7
|
+
const POLICY_OWNER_APPOINTMENT_ID = "appointment-policy-owner";
|
|
7
8
|
const OVERSIGHT_TEAM_ID = "team-security-risk-oversight";
|
|
8
9
|
const INFORMATION_SECURITY_POLICY_ID = "policy-information-security";
|
|
9
10
|
const DATA_POLICY_ID = "policy-data-protection-handling";
|
|
@@ -13,6 +14,41 @@ const ROLE_TRAINING_IDS = [
|
|
|
13
14
|
"training-privileged-sensitive-roles",
|
|
14
15
|
"training-anti-bribery-high-risk-roles"
|
|
15
16
|
];
|
|
17
|
+
const FILEGRC_SOURCE_FAMILIES = [
|
|
18
|
+
"training-acknowledgement",
|
|
19
|
+
"exception-finding",
|
|
20
|
+
"governance",
|
|
21
|
+
"risk-management",
|
|
22
|
+
"vendor-management"
|
|
23
|
+
];
|
|
24
|
+
const FILEGRC_SOURCE_CONTROL_CODES = new Set([
|
|
25
|
+
"GOV-01",
|
|
26
|
+
"GOV-02",
|
|
27
|
+
"GOV-03",
|
|
28
|
+
"HR-01",
|
|
29
|
+
"HR-02",
|
|
30
|
+
"RSK-01",
|
|
31
|
+
"MON-01",
|
|
32
|
+
"EXC-01",
|
|
33
|
+
"VEN-01",
|
|
34
|
+
"VEN-02"
|
|
35
|
+
]);
|
|
36
|
+
const SOURCE_FAMILIES = [
|
|
37
|
+
["workforce", "Workforce System"],
|
|
38
|
+
["training-acknowledgement", "Training and Acknowledgements"],
|
|
39
|
+
["identity-access", "Identity and Access Systems"],
|
|
40
|
+
["production-change", "Production Change Systems"],
|
|
41
|
+
["security-monitoring", "Security Monitoring Systems"],
|
|
42
|
+
["vulnerability-management", "Vulnerability Management"],
|
|
43
|
+
["endpoint-asset", "Endpoint Management Systems"],
|
|
44
|
+
["backup-recovery", "Backup and Recovery"],
|
|
45
|
+
["vendor-management", "Vendors"],
|
|
46
|
+
["exception-finding", "Exceptions and Findings"],
|
|
47
|
+
["data-handling", "Data Protection Configuration"],
|
|
48
|
+
["network-security", "Network Security Systems"],
|
|
49
|
+
["governance", "Governance"],
|
|
50
|
+
["risk-management", "Risk Management"]
|
|
51
|
+
];
|
|
16
52
|
|
|
17
53
|
const commonCriteria = [
|
|
18
54
|
["CC1.1", "Integrity and ethical values", "Set, communicate, and enforce standards for integrity and ethical conduct."],
|
|
@@ -72,7 +108,7 @@ const controls = [
|
|
|
72
108
|
activity: "Assign an independent reviewer who is separate from program ownership and record quarterly oversight decisions, approvals, and actions.",
|
|
73
109
|
controlType: "preventive",
|
|
74
110
|
operationMode: "manual",
|
|
75
|
-
|
|
111
|
+
operationPattern: "scheduled",
|
|
76
112
|
policies: [INFORMATION_SECURITY_POLICY_ID, "policy-anti-bribery-corruption"]
|
|
77
113
|
},
|
|
78
114
|
{
|
|
@@ -84,7 +120,7 @@ const controls = [
|
|
|
84
120
|
activity: "Review, approve, communicate, and version policies and plans.",
|
|
85
121
|
controlType: "preventive",
|
|
86
122
|
operationMode: "manual",
|
|
87
|
-
|
|
123
|
+
operationPattern: "mixed",
|
|
88
124
|
policies: [
|
|
89
125
|
"policy-anti-bribery-corruption",
|
|
90
126
|
"policy-clear-desk-screen",
|
|
@@ -102,7 +138,7 @@ const controls = [
|
|
|
102
138
|
activity: "Maintain reporting routes and communicate policies, changes, and security information.",
|
|
103
139
|
controlType: "preventive",
|
|
104
140
|
operationMode: "hybrid",
|
|
105
|
-
|
|
141
|
+
operationPattern: "mixed",
|
|
106
142
|
policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
107
143
|
},
|
|
108
144
|
{
|
|
@@ -114,7 +150,7 @@ const controls = [
|
|
|
114
150
|
activity: "Complete screening when appropriate, agreements, policy acknowledgement, and corrective action.",
|
|
115
151
|
controlType: "preventive",
|
|
116
152
|
operationMode: "manual",
|
|
117
|
-
|
|
153
|
+
operationPattern: "event-driven",
|
|
118
154
|
policies: [INFORMATION_SECURITY_POLICY_ID, "policy-anti-bribery-corruption"]
|
|
119
155
|
},
|
|
120
156
|
{
|
|
@@ -126,7 +162,7 @@ const controls = [
|
|
|
126
162
|
activity: "Assign general and role-based training, document non-applicability where needed, collect completion attestations, and follow up on overdue assignments.",
|
|
127
163
|
controlType: "preventive",
|
|
128
164
|
operationMode: "manual",
|
|
129
|
-
|
|
165
|
+
operationPattern: "mixed",
|
|
130
166
|
policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID, "policy-anti-bribery-corruption"]
|
|
131
167
|
},
|
|
132
168
|
{
|
|
@@ -138,7 +174,7 @@ const controls = [
|
|
|
138
174
|
activity: "Complete and retain annual performance reviews and resulting corrective work.",
|
|
139
175
|
controlType: "detective",
|
|
140
176
|
operationMode: "manual",
|
|
141
|
-
|
|
177
|
+
operationPattern: "scheduled",
|
|
142
178
|
policies: [INFORMATION_SECURITY_POLICY_ID]
|
|
143
179
|
},
|
|
144
180
|
{
|
|
@@ -150,7 +186,7 @@ const controls = [
|
|
|
150
186
|
activity: "Identify threats and changes, score risk, select treatment, and track review dates.",
|
|
151
187
|
controlType: "detective",
|
|
152
188
|
operationMode: "manual",
|
|
153
|
-
|
|
189
|
+
operationPattern: "mixed",
|
|
154
190
|
policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
155
191
|
},
|
|
156
192
|
{
|
|
@@ -162,7 +198,7 @@ const controls = [
|
|
|
162
198
|
activity: "Review control evidence and track deficiencies, owners, due dates, and verification.",
|
|
163
199
|
controlType: "detective",
|
|
164
200
|
operationMode: "manual",
|
|
165
|
-
|
|
201
|
+
operationPattern: "mixed",
|
|
166
202
|
policies: [INFORMATION_SECURITY_POLICY_ID]
|
|
167
203
|
},
|
|
168
204
|
{
|
|
@@ -174,7 +210,7 @@ const controls = [
|
|
|
174
210
|
activity: "Request, approve, provision, change, and record access.",
|
|
175
211
|
controlType: "preventive",
|
|
176
212
|
operationMode: "hybrid",
|
|
177
|
-
|
|
213
|
+
operationPattern: "event-driven",
|
|
178
214
|
policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
179
215
|
},
|
|
180
216
|
{
|
|
@@ -186,7 +222,7 @@ const controls = [
|
|
|
186
222
|
activity: "Configure and monitor authentication, credential storage, and privileged roles.",
|
|
187
223
|
controlType: "preventive",
|
|
188
224
|
operationMode: "hybrid",
|
|
189
|
-
|
|
225
|
+
operationPattern: "continuous",
|
|
190
226
|
policies: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
|
|
191
227
|
},
|
|
192
228
|
{
|
|
@@ -198,7 +234,7 @@ const controls = [
|
|
|
198
234
|
activity: "Review access populations, record decisions, and remove dormant, expired, or unneeded access.",
|
|
199
235
|
controlType: "detective",
|
|
200
236
|
operationMode: "manual",
|
|
201
|
-
|
|
237
|
+
operationPattern: "mixed",
|
|
202
238
|
policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
203
239
|
},
|
|
204
240
|
{
|
|
@@ -210,7 +246,7 @@ const controls = [
|
|
|
210
246
|
activity: "Control visitors and facilities, secure workspaces, and report loss or exposure.",
|
|
211
247
|
controlType: "preventive",
|
|
212
248
|
operationMode: "manual",
|
|
213
|
-
|
|
249
|
+
operationPattern: "continuous",
|
|
214
250
|
policies: [INFORMATION_SECURITY_POLICY_ID, "policy-clear-desk-screen", "policy-mobile-computing-communications"]
|
|
215
251
|
},
|
|
216
252
|
{
|
|
@@ -222,7 +258,7 @@ const controls = [
|
|
|
222
258
|
activity: "Maintain classification, ownership, system, vendor, and processing records.",
|
|
223
259
|
controlType: "preventive",
|
|
224
260
|
operationMode: "manual",
|
|
225
|
-
|
|
261
|
+
operationPattern: "mixed",
|
|
226
262
|
policies: [DATA_POLICY_ID, INFORMATION_SECURITY_POLICY_ID]
|
|
227
263
|
},
|
|
228
264
|
{
|
|
@@ -234,7 +270,7 @@ const controls = [
|
|
|
234
270
|
activity: "Configure encryption and approved transfer methods based on classification.",
|
|
235
271
|
controlType: "preventive",
|
|
236
272
|
operationMode: "automated",
|
|
237
|
-
|
|
273
|
+
operationPattern: "continuous",
|
|
238
274
|
policies: [DATA_POLICY_ID, INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
|
|
239
275
|
},
|
|
240
276
|
{
|
|
@@ -246,7 +282,7 @@ const controls = [
|
|
|
246
282
|
activity: "Apply approved retention and disposal methods to active, local, backup, and vendor-held copies.",
|
|
247
283
|
controlType: "preventive",
|
|
248
284
|
operationMode: "hybrid",
|
|
249
|
-
|
|
285
|
+
operationPattern: "event-driven",
|
|
250
286
|
policies: [DATA_POLICY_ID, INFORMATION_SECURITY_POLICY_ID]
|
|
251
287
|
},
|
|
252
288
|
{
|
|
@@ -258,7 +294,7 @@ const controls = [
|
|
|
258
294
|
activity: "Maintain inventories, baselines, ownership, classification, and approved deviations.",
|
|
259
295
|
controlType: "preventive",
|
|
260
296
|
operationMode: "hybrid",
|
|
261
|
-
|
|
297
|
+
operationPattern: "mixed",
|
|
262
298
|
policies: [INFORMATION_SECURITY_POLICY_ID]
|
|
263
299
|
},
|
|
264
300
|
{
|
|
@@ -270,7 +306,7 @@ const controls = [
|
|
|
270
306
|
activity: "Manage endpoint safeguards and perform a full or equivalent malware scan at least monthly.",
|
|
271
307
|
controlType: "preventive",
|
|
272
308
|
operationMode: "automated",
|
|
273
|
-
|
|
309
|
+
operationPattern: "mixed",
|
|
274
310
|
policies: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
|
|
275
311
|
},
|
|
276
312
|
{
|
|
@@ -282,7 +318,7 @@ const controls = [
|
|
|
282
318
|
activity: "Manage boundaries, firewall rules, wireless safeguards, and remote production access.",
|
|
283
319
|
controlType: "preventive",
|
|
284
320
|
operationMode: "hybrid",
|
|
285
|
-
|
|
321
|
+
operationPattern: "mixed",
|
|
286
322
|
policies: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
|
|
287
323
|
},
|
|
288
324
|
{
|
|
@@ -294,7 +330,7 @@ const controls = [
|
|
|
294
330
|
activity: "Record the reason, author, reviewer, test result, deployment, and rollback method.",
|
|
295
331
|
controlType: "preventive",
|
|
296
332
|
operationMode: "hybrid",
|
|
297
|
-
|
|
333
|
+
operationPattern: "event-driven",
|
|
298
334
|
policies: [INFORMATION_SECURITY_POLICY_ID]
|
|
299
335
|
},
|
|
300
336
|
{
|
|
@@ -306,7 +342,7 @@ const controls = [
|
|
|
306
342
|
activity: "Identify, validate, prioritize, remediate, or approve time-bound exceptions for vulnerabilities.",
|
|
307
343
|
controlType: "detective",
|
|
308
344
|
operationMode: "hybrid",
|
|
309
|
-
|
|
345
|
+
operationPattern: "mixed",
|
|
310
346
|
policies: [INFORMATION_SECURITY_POLICY_ID]
|
|
311
347
|
},
|
|
312
348
|
{
|
|
@@ -318,7 +354,7 @@ const controls = [
|
|
|
318
354
|
activity: "Define scope, perform independent testing, review results, and track findings.",
|
|
319
355
|
controlType: "detective",
|
|
320
356
|
operationMode: "manual",
|
|
321
|
-
|
|
357
|
+
operationPattern: "scheduled",
|
|
322
358
|
policies: [INFORMATION_SECURITY_POLICY_ID]
|
|
323
359
|
},
|
|
324
360
|
{
|
|
@@ -330,7 +366,7 @@ const controls = [
|
|
|
330
366
|
activity: "Collect, protect, alert on, test, and review important log output and access.",
|
|
331
367
|
controlType: "detective",
|
|
332
368
|
operationMode: "hybrid",
|
|
333
|
-
|
|
369
|
+
operationPattern: "mixed",
|
|
334
370
|
policies: [INFORMATION_SECURITY_POLICY_ID]
|
|
335
371
|
},
|
|
336
372
|
{
|
|
@@ -342,7 +378,7 @@ const controls = [
|
|
|
342
378
|
activity: "Triage events, preserve evidence, coordinate response and notification review, and complete retrospectives.",
|
|
343
379
|
controlType: "corrective",
|
|
344
380
|
operationMode: "hybrid",
|
|
345
|
-
|
|
381
|
+
operationPattern: "event-driven",
|
|
346
382
|
policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
347
383
|
},
|
|
348
384
|
{
|
|
@@ -354,7 +390,7 @@ const controls = [
|
|
|
354
390
|
activity: "Plan, conduct, review, and document an incident response and alert-path exercise.",
|
|
355
391
|
controlType: "detective",
|
|
356
392
|
operationMode: "manual",
|
|
357
|
-
|
|
393
|
+
operationPattern: "scheduled",
|
|
358
394
|
policies: [INFORMATION_SECURITY_POLICY_ID]
|
|
359
395
|
},
|
|
360
396
|
{
|
|
@@ -366,7 +402,7 @@ const controls = [
|
|
|
366
402
|
activity: "Protect and monitor backups, then test retrieval and use of restored data.",
|
|
367
403
|
controlType: "corrective",
|
|
368
404
|
operationMode: "hybrid",
|
|
369
|
-
|
|
405
|
+
operationPattern: "scheduled",
|
|
370
406
|
policies: [INFORMATION_SECURITY_POLICY_ID]
|
|
371
407
|
},
|
|
372
408
|
{
|
|
@@ -378,7 +414,7 @@ const controls = [
|
|
|
378
414
|
activity: "Maintain the plan, contacts, recovery objectives, exercises, results, and follow-up work.",
|
|
379
415
|
controlType: "corrective",
|
|
380
416
|
operationMode: "manual",
|
|
381
|
-
|
|
417
|
+
operationPattern: "mixed",
|
|
382
418
|
policies: [INFORMATION_SECURITY_POLICY_ID]
|
|
383
419
|
},
|
|
384
420
|
{
|
|
@@ -390,7 +426,7 @@ const controls = [
|
|
|
390
426
|
activity: "Assess service, data, access, assurance, recovery, incidents, and contract terms before access.",
|
|
391
427
|
controlType: "preventive",
|
|
392
428
|
operationMode: "manual",
|
|
393
|
-
|
|
429
|
+
operationPattern: "event-driven",
|
|
394
430
|
policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
395
431
|
},
|
|
396
432
|
{
|
|
@@ -402,7 +438,7 @@ const controls = [
|
|
|
402
438
|
activity: "Review vendor performance, assurance, recovery, access, incidents, and contract obligations.",
|
|
403
439
|
controlType: "detective",
|
|
404
440
|
operationMode: "manual",
|
|
405
|
-
|
|
441
|
+
operationPattern: "mixed",
|
|
406
442
|
policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
407
443
|
},
|
|
408
444
|
{
|
|
@@ -414,7 +450,7 @@ const controls = [
|
|
|
414
450
|
activity: "Request, assess, approve, monitor, and close time-bound exceptions.",
|
|
415
451
|
controlType: "preventive",
|
|
416
452
|
operationMode: "manual",
|
|
417
|
-
|
|
453
|
+
operationPattern: "event-driven",
|
|
418
454
|
policies: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
419
455
|
}
|
|
420
456
|
];
|
|
@@ -435,7 +471,7 @@ const obligations = [
|
|
|
435
471
|
title: "Annual policy and governed-plan review",
|
|
436
472
|
activityType: "policy-review",
|
|
437
473
|
recurrence: calendar("year", 1),
|
|
438
|
-
ownerIds: [
|
|
474
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
439
475
|
scopeResourceIds: [
|
|
440
476
|
"policy-anti-bribery-corruption",
|
|
441
477
|
"policy-clear-desk-screen",
|
|
@@ -463,10 +499,14 @@ const obligations = [
|
|
|
463
499
|
title: "Annual security awareness training",
|
|
464
500
|
activityType: "training",
|
|
465
501
|
recurrence: calendar("year", 1),
|
|
466
|
-
ownerIds: [
|
|
502
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
467
503
|
scopeResourceIds: ["training-security-awareness"],
|
|
468
504
|
templateResourceId: "training-security-awareness",
|
|
469
|
-
controlIds: [
|
|
505
|
+
controlIds: [
|
|
506
|
+
"control-security-communication",
|
|
507
|
+
"control-workforce-expectations",
|
|
508
|
+
"control-security-training"
|
|
509
|
+
],
|
|
470
510
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
471
511
|
},
|
|
472
512
|
{
|
|
@@ -474,7 +514,7 @@ const obligations = [
|
|
|
474
514
|
title: "Annual workforce performance review",
|
|
475
515
|
activityType: "performance-review",
|
|
476
516
|
recurrence: calendar("year", 1),
|
|
477
|
-
ownerIds: [
|
|
517
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
478
518
|
controlIds: ["control-performance-review"],
|
|
479
519
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
480
520
|
},
|
|
@@ -483,7 +523,7 @@ const obligations = [
|
|
|
483
523
|
title: "Quarterly privileged and production access review",
|
|
484
524
|
activityType: "access-review",
|
|
485
525
|
recurrence: calendar("month", 3),
|
|
486
|
-
ownerIds: [
|
|
526
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
487
527
|
controlIds: ["control-access-review-offboarding"],
|
|
488
528
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
489
529
|
},
|
|
@@ -492,7 +532,7 @@ const obligations = [
|
|
|
492
532
|
title: "Annual important-system access review",
|
|
493
533
|
activityType: "access-review",
|
|
494
534
|
recurrence: calendar("year", 1),
|
|
495
|
-
ownerIds: [
|
|
535
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
496
536
|
controlIds: ["control-access-review-offboarding"],
|
|
497
537
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
498
538
|
},
|
|
@@ -501,7 +541,7 @@ const obligations = [
|
|
|
501
541
|
title: "Annual system, company and personal device, vendor, and data inventory review",
|
|
502
542
|
activityType: "inventory-review",
|
|
503
543
|
recurrence: calendar("year", 1),
|
|
504
|
-
ownerIds: [
|
|
544
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
505
545
|
controlIds: ["control-inventory-configuration", "control-data-classification-inventory"],
|
|
506
546
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
507
547
|
},
|
|
@@ -510,7 +550,7 @@ const obligations = [
|
|
|
510
550
|
title: "Monthly endpoint malware scan",
|
|
511
551
|
activityType: "security-scan",
|
|
512
552
|
recurrence: calendar("month", 1),
|
|
513
|
-
ownerIds: [
|
|
553
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
514
554
|
controlIds: ["control-endpoint-protection"],
|
|
515
555
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
516
556
|
},
|
|
@@ -519,7 +559,7 @@ const obligations = [
|
|
|
519
559
|
title: "Annual firewall and network access review",
|
|
520
560
|
activityType: "network-review",
|
|
521
561
|
recurrence: calendar("year", 1),
|
|
522
|
-
ownerIds: [
|
|
562
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
523
563
|
controlIds: ["control-network-security"],
|
|
524
564
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
525
565
|
},
|
|
@@ -528,7 +568,7 @@ const obligations = [
|
|
|
528
568
|
title: "Quarterly vulnerability scan",
|
|
529
569
|
activityType: "vulnerability-scan",
|
|
530
570
|
recurrence: calendar("month", 3),
|
|
531
|
-
ownerIds: [
|
|
571
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
532
572
|
controlIds: ["control-vulnerability-management"],
|
|
533
573
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
534
574
|
},
|
|
@@ -537,7 +577,7 @@ const obligations = [
|
|
|
537
577
|
title: "Annual independent penetration test",
|
|
538
578
|
activityType: "penetration-test",
|
|
539
579
|
recurrence: calendar("year", 1),
|
|
540
|
-
ownerIds: [
|
|
580
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
541
581
|
controlIds: ["control-penetration-testing"],
|
|
542
582
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
543
583
|
},
|
|
@@ -546,7 +586,7 @@ const obligations = [
|
|
|
546
586
|
title: "Quarterly security log and log-access review",
|
|
547
587
|
activityType: "log-review",
|
|
548
588
|
recurrence: calendar("month", 3),
|
|
549
|
-
ownerIds: [
|
|
589
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
550
590
|
controlIds: ["control-logging-monitoring"],
|
|
551
591
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
552
592
|
},
|
|
@@ -555,7 +595,7 @@ const obligations = [
|
|
|
555
595
|
title: "Annual incident response and alert-path exercise",
|
|
556
596
|
activityType: "exercise",
|
|
557
597
|
recurrence: calendar("year", 1),
|
|
558
|
-
ownerIds: [
|
|
598
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
559
599
|
scopeResourceIds: ["document-incident-response-plan"],
|
|
560
600
|
templateResourceId: "document-incident-response-plan",
|
|
561
601
|
controlIds: ["control-incident-exercise", "control-logging-monitoring"],
|
|
@@ -566,7 +606,7 @@ const obligations = [
|
|
|
566
606
|
title: "Annual backup restoration test",
|
|
567
607
|
activityType: "backup-test",
|
|
568
608
|
recurrence: calendar("year", 1),
|
|
569
|
-
ownerIds: [
|
|
609
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
570
610
|
controlIds: ["control-backup-restoration"],
|
|
571
611
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
572
612
|
},
|
|
@@ -586,8 +626,8 @@ const obligations = [
|
|
|
586
626
|
title: "Annual critical and high-risk vendor review",
|
|
587
627
|
activityType: "vendor-review",
|
|
588
628
|
recurrence: calendar("year", 1),
|
|
589
|
-
ownerIds: [
|
|
590
|
-
controlIds: ["control-vendor-monitoring"],
|
|
629
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
630
|
+
controlIds: ["control-vendor-due-diligence", "control-vendor-monitoring"],
|
|
591
631
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
592
632
|
},
|
|
593
633
|
{
|
|
@@ -595,7 +635,7 @@ const obligations = [
|
|
|
595
635
|
title: "Annual emergency contact review",
|
|
596
636
|
activityType: "continuity-review",
|
|
597
637
|
recurrence: calendar("year", 1),
|
|
598
|
-
ownerIds: [
|
|
638
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
599
639
|
scopeResourceIds: ["document-business-continuity-disaster-recovery"],
|
|
600
640
|
controlIds: ["control-continuity-exercise"],
|
|
601
641
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
@@ -607,8 +647,7 @@ const obligations = [
|
|
|
607
647
|
recurrence: event("person-started"),
|
|
608
648
|
triggerPrompt: "New employee or contractor?",
|
|
609
649
|
window: eventWindow(0),
|
|
610
|
-
|
|
611
|
-
ownerIds: [OWNER_ID],
|
|
650
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
612
651
|
controlIds: ["control-workforce-expectations"],
|
|
613
652
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
614
653
|
},
|
|
@@ -619,8 +658,7 @@ const obligations = [
|
|
|
619
658
|
recurrence: event("person-started"),
|
|
620
659
|
triggerPrompt: "New employee or contractor?",
|
|
621
660
|
window: eventWindow(0),
|
|
622
|
-
|
|
623
|
-
ownerIds: [OWNER_ID],
|
|
661
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
624
662
|
controlIds: ["control-access-authorization"],
|
|
625
663
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
626
664
|
},
|
|
@@ -631,8 +669,7 @@ const obligations = [
|
|
|
631
669
|
recurrence: event("person-started"),
|
|
632
670
|
triggerPrompt: "New employee or contractor?",
|
|
633
671
|
window: eventWindow(0),
|
|
634
|
-
|
|
635
|
-
ownerIds: [OWNER_ID],
|
|
672
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
636
673
|
controlIds: ["control-inventory-configuration"],
|
|
637
674
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
638
675
|
},
|
|
@@ -643,8 +680,7 @@ const obligations = [
|
|
|
643
680
|
recurrence: event("person-started"),
|
|
644
681
|
triggerPrompt: "New employee or contractor?",
|
|
645
682
|
window: eventWindow(30),
|
|
646
|
-
|
|
647
|
-
ownerIds: [OWNER_ID],
|
|
683
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
648
684
|
scopeResourceIds: ["training-security-awareness"],
|
|
649
685
|
templateResourceId: "training-security-awareness",
|
|
650
686
|
controlIds: ["control-security-training"],
|
|
@@ -657,8 +693,7 @@ const obligations = [
|
|
|
657
693
|
recurrence: event("person-started"),
|
|
658
694
|
triggerPrompt: "New employee or contractor?",
|
|
659
695
|
window: eventWindow(30),
|
|
660
|
-
|
|
661
|
-
ownerIds: [OWNER_ID],
|
|
696
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
662
697
|
scopeResourceIds: ROLE_TRAINING_IDS,
|
|
663
698
|
controlIds: ["control-security-training"],
|
|
664
699
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID, "policy-anti-bribery-corruption"]
|
|
@@ -670,8 +705,7 @@ const obligations = [
|
|
|
670
705
|
recurrence: event("person-ended"),
|
|
671
706
|
triggerPrompt: "Employee or contractor departing?",
|
|
672
707
|
window: eventWindowHours(24),
|
|
673
|
-
|
|
674
|
-
ownerIds: [OWNER_ID],
|
|
708
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
675
709
|
controlIds: ["control-access-review-offboarding"],
|
|
676
710
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
677
711
|
},
|
|
@@ -682,8 +716,7 @@ const obligations = [
|
|
|
682
716
|
recurrence: event("person-ended"),
|
|
683
717
|
triggerPrompt: "Employee or contractor departing?",
|
|
684
718
|
window: eventWindow(7),
|
|
685
|
-
|
|
686
|
-
ownerIds: [OWNER_ID],
|
|
719
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
687
720
|
controlIds: ["control-access-review-offboarding", "control-inventory-configuration"],
|
|
688
721
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
689
722
|
},
|
|
@@ -691,11 +724,11 @@ const obligations = [
|
|
|
691
724
|
id: "obligation-high-risk-departure-access",
|
|
692
725
|
title: "Revoke access at or before departure notice",
|
|
693
726
|
activityType: "access-removal",
|
|
694
|
-
recurrence: event("
|
|
727
|
+
recurrence: event("person-ended"),
|
|
728
|
+
eventRiskLevels: ["high"],
|
|
695
729
|
triggerPrompt: "Involuntary or high-risk departure?",
|
|
696
730
|
window: eventWindowHours(0),
|
|
697
|
-
|
|
698
|
-
ownerIds: [OWNER_ID],
|
|
731
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
699
732
|
controlIds: ["control-access-review-offboarding"],
|
|
700
733
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
701
734
|
},
|
|
@@ -706,8 +739,7 @@ const obligations = [
|
|
|
706
739
|
recurrence: event("person-role-changed"),
|
|
707
740
|
triggerPrompt: "Worker role changed?",
|
|
708
741
|
window: eventWindow(3),
|
|
709
|
-
|
|
710
|
-
ownerIds: [OWNER_ID],
|
|
742
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
711
743
|
controlIds: ["control-access-authorization", "control-access-review-offboarding"],
|
|
712
744
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
713
745
|
},
|
|
@@ -718,8 +750,7 @@ const obligations = [
|
|
|
718
750
|
recurrence: event("person-role-changed"),
|
|
719
751
|
triggerPrompt: "Worker role changed?",
|
|
720
752
|
window: eventWindow(30),
|
|
721
|
-
|
|
722
|
-
ownerIds: [OWNER_ID],
|
|
753
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
723
754
|
scopeResourceIds: ROLE_TRAINING_IDS,
|
|
724
755
|
controlIds: ["control-security-training"],
|
|
725
756
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID, "policy-anti-bribery-corruption"]
|
|
@@ -731,8 +762,7 @@ const obligations = [
|
|
|
731
762
|
recurrence: event("personal-device-access-planned"),
|
|
732
763
|
triggerPrompt: "Personal device needs company access?",
|
|
733
764
|
window: eventWindow(0),
|
|
734
|
-
|
|
735
|
-
ownerIds: [OWNER_ID],
|
|
765
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
736
766
|
controlIds: ["control-access-authorization", "control-endpoint-protection"],
|
|
737
767
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
|
|
738
768
|
},
|
|
@@ -743,8 +773,7 @@ const obligations = [
|
|
|
743
773
|
recurrence: event("personal-device-access-planned"),
|
|
744
774
|
triggerPrompt: "Personal device needs company access?",
|
|
745
775
|
window: eventWindow(0),
|
|
746
|
-
|
|
747
|
-
ownerIds: [OWNER_ID],
|
|
776
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
748
777
|
controlIds: ["control-inventory-configuration", "control-endpoint-protection"],
|
|
749
778
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, "policy-mobile-computing-communications"]
|
|
750
779
|
},
|
|
@@ -755,8 +784,7 @@ const obligations = [
|
|
|
755
784
|
recurrence: event("vendor-access-planned"),
|
|
756
785
|
triggerPrompt: "New vendor access or data use?",
|
|
757
786
|
window: eventWindow(0),
|
|
758
|
-
|
|
759
|
-
ownerIds: [OWNER_ID],
|
|
787
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
760
788
|
controlIds: ["control-vendor-due-diligence"],
|
|
761
789
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
762
790
|
},
|
|
@@ -767,8 +795,7 @@ const obligations = [
|
|
|
767
795
|
recurrence: event("vendor-access-planned"),
|
|
768
796
|
triggerPrompt: "New vendor access or data use?",
|
|
769
797
|
window: eventWindow(0),
|
|
770
|
-
|
|
771
|
-
ownerIds: [OWNER_ID],
|
|
798
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
772
799
|
controlIds: ["control-vendor-due-diligence"],
|
|
773
800
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
774
801
|
},
|
|
@@ -779,8 +806,7 @@ const obligations = [
|
|
|
779
806
|
recurrence: event("vendor-reassessment-needed"),
|
|
780
807
|
triggerPrompt: "Vendor changed materially or had an incident?",
|
|
781
808
|
window: eventWindow(30),
|
|
782
|
-
|
|
783
|
-
ownerIds: [OWNER_ID],
|
|
809
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
784
810
|
controlIds: ["control-vendor-monitoring"],
|
|
785
811
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
786
812
|
},
|
|
@@ -791,8 +817,7 @@ const obligations = [
|
|
|
791
817
|
recurrence: event("vendor-reassessment-needed"),
|
|
792
818
|
triggerPrompt: "Vendor changed materially or had an incident?",
|
|
793
819
|
window: eventWindow(30),
|
|
794
|
-
|
|
795
|
-
ownerIds: [OWNER_ID],
|
|
820
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
796
821
|
controlIds: ["control-vendor-monitoring", "control-data-classification-inventory"],
|
|
797
822
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
798
823
|
},
|
|
@@ -803,7 +828,6 @@ const obligations = [
|
|
|
803
828
|
recurrence: event("system-material-change"),
|
|
804
829
|
triggerPrompt: "Material system, service, or data-use change?",
|
|
805
830
|
window: eventWindow(30),
|
|
806
|
-
completionResourceTypes: ["risk-assessment", "risk", "evidence"],
|
|
807
831
|
ownerIds: [OVERSIGHT_TEAM_ID],
|
|
808
832
|
controlIds: ["control-risk-assessment"],
|
|
809
833
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
@@ -815,8 +839,7 @@ const obligations = [
|
|
|
815
839
|
recurrence: event("system-material-change"),
|
|
816
840
|
triggerPrompt: "Material system, service, or data-use change?",
|
|
817
841
|
window: eventWindow(30),
|
|
818
|
-
|
|
819
|
-
ownerIds: [OWNER_ID],
|
|
842
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
820
843
|
controlIds: ["control-vulnerability-management"],
|
|
821
844
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
822
845
|
},
|
|
@@ -827,7 +850,6 @@ const obligations = [
|
|
|
827
850
|
recurrence: event("system-material-change"),
|
|
828
851
|
triggerPrompt: "Material system, service, or data-use change?",
|
|
829
852
|
window: eventWindow(30),
|
|
830
|
-
completionResourceTypes: ["meeting", "policy", "control", "evidence"],
|
|
831
853
|
ownerIds: [OVERSIGHT_TEAM_ID],
|
|
832
854
|
controlIds: ["control-policy-management", "control-security-communication"],
|
|
833
855
|
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
@@ -839,8 +861,7 @@ const obligations = [
|
|
|
839
861
|
recurrence: event("system-material-change"),
|
|
840
862
|
triggerPrompt: "Material system, service, or data-use change?",
|
|
841
863
|
window: eventWindow(30),
|
|
842
|
-
|
|
843
|
-
ownerIds: [OWNER_ID],
|
|
864
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
844
865
|
scopeResourceIds: [RETENTION_SCHEDULE_ID],
|
|
845
866
|
templateResourceId: RETENTION_SCHEDULE_ID,
|
|
846
867
|
controlIds: ["control-data-retention-disposal", "control-data-classification-inventory"],
|
|
@@ -853,8 +874,7 @@ const obligations = [
|
|
|
853
874
|
recurrence: event("system-material-change"),
|
|
854
875
|
triggerPrompt: "Material system, service, or data-use change?",
|
|
855
876
|
window: eventWindow(30),
|
|
856
|
-
|
|
857
|
-
ownerIds: [OWNER_ID],
|
|
877
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
858
878
|
controlIds: ["control-logging-monitoring", "control-incident-exercise"],
|
|
859
879
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
860
880
|
},
|
|
@@ -865,7 +885,6 @@ const obligations = [
|
|
|
865
885
|
recurrence: event("material-incident"),
|
|
866
886
|
triggerPrompt: "Material security incident?",
|
|
867
887
|
window: eventWindow(7),
|
|
868
|
-
completionResourceTypes: ["incident", "document", "evidence"],
|
|
869
888
|
ownerIds: [OVERSIGHT_TEAM_ID],
|
|
870
889
|
controlIds: ["control-incident-response"],
|
|
871
890
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
@@ -877,9 +896,151 @@ const obligations = [
|
|
|
877
896
|
recurrence: event("material-incident"),
|
|
878
897
|
triggerPrompt: "Material security incident?",
|
|
879
898
|
window: eventWindow(7),
|
|
880
|
-
completionResourceTypes: ["action-item", "finding"],
|
|
881
899
|
ownerIds: [OVERSIGHT_TEAM_ID],
|
|
882
|
-
controlIds: ["control-monitoring-remediation"],
|
|
900
|
+
controlIds: ["control-monitoring-remediation", "control-security-exceptions"],
|
|
901
|
+
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
902
|
+
},
|
|
903
|
+
{
|
|
904
|
+
id: "obligation-vendor-activation-review",
|
|
905
|
+
title: "Complete vendor activation review",
|
|
906
|
+
activityType: "vendor-review",
|
|
907
|
+
recurrence: event("vendor-activated"),
|
|
908
|
+
triggerPrompt: "Vendor activated?",
|
|
909
|
+
window: eventWindow(30),
|
|
910
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
911
|
+
controlIds: ["control-vendor-due-diligence", "control-vendor-monitoring"],
|
|
912
|
+
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
913
|
+
},
|
|
914
|
+
{
|
|
915
|
+
id: "obligation-vendor-termination-closeout",
|
|
916
|
+
title: "Revoke vendor access and confirm data return or disposal",
|
|
917
|
+
activityType: "access-removal",
|
|
918
|
+
recurrence: event("vendor-terminated"),
|
|
919
|
+
triggerPrompt: "Vendor terminated?",
|
|
920
|
+
window: eventWindow(7),
|
|
921
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
922
|
+
controlIds: ["control-vendor-monitoring", "control-access-review-offboarding"],
|
|
923
|
+
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
924
|
+
},
|
|
925
|
+
{
|
|
926
|
+
id: "obligation-data-use-change-assessment",
|
|
927
|
+
title: "Assess the changed data use and control impact",
|
|
928
|
+
activityType: "risk-assessment",
|
|
929
|
+
recurrence: event("material-data-use-change"),
|
|
930
|
+
triggerPrompt: "Material data-use change?",
|
|
931
|
+
window: eventWindow(30),
|
|
932
|
+
ownerIds: [OVERSIGHT_TEAM_ID],
|
|
933
|
+
controlIds: ["control-risk-assessment", "control-data-classification-inventory"],
|
|
934
|
+
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
935
|
+
},
|
|
936
|
+
{
|
|
937
|
+
id: "obligation-incident-closure-review",
|
|
938
|
+
title: "Complete incident closure and lessons-learned review",
|
|
939
|
+
activityType: "incident-retrospective",
|
|
940
|
+
recurrence: event("incident-closed"),
|
|
941
|
+
triggerPrompt: "Incident closed?",
|
|
942
|
+
window: eventWindow(7),
|
|
943
|
+
ownerIds: [OVERSIGHT_TEAM_ID],
|
|
944
|
+
controlIds: ["control-incident-response", "control-monitoring-remediation"],
|
|
945
|
+
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
946
|
+
},
|
|
947
|
+
{
|
|
948
|
+
id: "obligation-policy-revision-approval",
|
|
949
|
+
title: "Review and approve the revised policy",
|
|
950
|
+
activityType: "policy-review",
|
|
951
|
+
recurrence: event("policy-revised"),
|
|
952
|
+
triggerPrompt: "Policy materially revised?",
|
|
953
|
+
window: eventWindow(30),
|
|
954
|
+
ownerIds: [OVERSIGHT_TEAM_ID],
|
|
955
|
+
controlIds: ["control-policy-management"],
|
|
956
|
+
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
957
|
+
},
|
|
958
|
+
{
|
|
959
|
+
id: "obligation-emergency-change-review",
|
|
960
|
+
title: "Complete emergency-change post-review",
|
|
961
|
+
activityType: "change-review",
|
|
962
|
+
recurrence: event("emergency-change"),
|
|
963
|
+
triggerPrompt: "Emergency change completed?",
|
|
964
|
+
window: eventWindow(2),
|
|
965
|
+
ownerIds: [OVERSIGHT_TEAM_ID],
|
|
966
|
+
controlIds: ["control-change-management"],
|
|
967
|
+
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
968
|
+
},
|
|
969
|
+
{
|
|
970
|
+
id: "obligation-exception-expiry-review",
|
|
971
|
+
title: "Review expired exception and compensating controls",
|
|
972
|
+
activityType: "exception-review",
|
|
973
|
+
recurrence: event("exception-expired"),
|
|
974
|
+
triggerPrompt: "Exception expired?",
|
|
975
|
+
window: eventWindow(1),
|
|
976
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
977
|
+
controlIds: ["control-monitoring-remediation", "control-security-exceptions"],
|
|
978
|
+
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
979
|
+
},
|
|
980
|
+
{
|
|
981
|
+
id: "obligation-service-account-creation-review",
|
|
982
|
+
title: "Authorize and review the new service account",
|
|
983
|
+
activityType: "access-provisioning",
|
|
984
|
+
recurrence: event("service-account-created"),
|
|
985
|
+
triggerPrompt: "Service account created?",
|
|
986
|
+
window: eventWindow(3),
|
|
987
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
988
|
+
controlIds: ["control-access-authorization"],
|
|
989
|
+
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
990
|
+
},
|
|
991
|
+
{
|
|
992
|
+
id: "obligation-service-account-expiry",
|
|
993
|
+
title: "Disable or renew the expired service account",
|
|
994
|
+
activityType: "access-removal",
|
|
995
|
+
recurrence: event("service-account-expired"),
|
|
996
|
+
triggerPrompt: "Service account expired?",
|
|
997
|
+
window: eventWindow(1),
|
|
998
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
999
|
+
controlIds: ["control-access-review-offboarding"],
|
|
1000
|
+
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
1001
|
+
},
|
|
1002
|
+
{
|
|
1003
|
+
id: "obligation-vulnerability-confirmed-remediation",
|
|
1004
|
+
title: "Assign confirmed vulnerability remediation",
|
|
1005
|
+
activityType: "remediation",
|
|
1006
|
+
recurrence: event("vulnerability-confirmed"),
|
|
1007
|
+
triggerPrompt: "Vulnerability confirmed?",
|
|
1008
|
+
window: eventWindow(3),
|
|
1009
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
1010
|
+
controlIds: ["control-vulnerability-management"],
|
|
1011
|
+
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
1012
|
+
},
|
|
1013
|
+
{
|
|
1014
|
+
id: "obligation-vulnerability-overdue-escalation",
|
|
1015
|
+
title: "Escalate overdue vulnerability remediation",
|
|
1016
|
+
activityType: "remediation",
|
|
1017
|
+
recurrence: event("vulnerability-overdue"),
|
|
1018
|
+
triggerPrompt: "Vulnerability remediation overdue?",
|
|
1019
|
+
window: eventWindow(1),
|
|
1020
|
+
ownerIds: [OVERSIGHT_TEAM_ID],
|
|
1021
|
+
controlIds: ["control-vulnerability-management", "control-monitoring-remediation"],
|
|
1022
|
+
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
1023
|
+
},
|
|
1024
|
+
{
|
|
1025
|
+
id: "obligation-asset-disposal-proof",
|
|
1026
|
+
title: "Record asset sanitization and disposal proof",
|
|
1027
|
+
activityType: "asset-recovery",
|
|
1028
|
+
recurrence: event("asset-disposed"),
|
|
1029
|
+
triggerPrompt: "Asset disposed?",
|
|
1030
|
+
window: eventWindow(7),
|
|
1031
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
1032
|
+
controlIds: ["control-inventory-configuration", "control-data-retention-disposal"],
|
|
1033
|
+
policyIds: [INFORMATION_SECURITY_POLICY_ID, DATA_POLICY_ID]
|
|
1034
|
+
},
|
|
1035
|
+
{
|
|
1036
|
+
id: "obligation-continuity-activation-review",
|
|
1037
|
+
title: "Review continuity activation, recovery, and follow-up",
|
|
1038
|
+
activityType: "continuity-review",
|
|
1039
|
+
recurrence: event("continuity-activated"),
|
|
1040
|
+
triggerPrompt: "Continuity plan activated?",
|
|
1041
|
+
window: eventWindow(7),
|
|
1042
|
+
ownerIds: [OVERSIGHT_TEAM_ID],
|
|
1043
|
+
controlIds: ["control-continuity-exercise", "control-monitoring-remediation"],
|
|
883
1044
|
policyIds: [INFORMATION_SECURITY_POLICY_ID]
|
|
884
1045
|
}
|
|
885
1046
|
];
|
|
@@ -890,7 +1051,6 @@ export function baselineRecordPaths(starter = "security") {
|
|
|
890
1051
|
|
|
891
1052
|
export function baselineRecordFiles(effectiveDate, starter = "security") {
|
|
892
1053
|
const framework = {
|
|
893
|
-
schemaVersion: 1,
|
|
894
1054
|
id: FRAMEWORK_ID,
|
|
895
1055
|
type: "framework",
|
|
896
1056
|
title: "AICPA Trust Services Criteria",
|
|
@@ -904,7 +1064,6 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
|
|
|
904
1064
|
}
|
|
905
1065
|
};
|
|
906
1066
|
const descriptionFramework = {
|
|
907
|
-
schemaVersion: 1,
|
|
908
1067
|
id: DESCRIPTION_FRAMEWORK_ID,
|
|
909
1068
|
type: "framework",
|
|
910
1069
|
title: "AICPA SOC 2 Description Criteria",
|
|
@@ -918,79 +1077,74 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
|
|
|
918
1077
|
}
|
|
919
1078
|
};
|
|
920
1079
|
const commonRequirements = commonCriteria.map(([reference, name, description]) => ({
|
|
921
|
-
schemaVersion: 1,
|
|
922
1080
|
id: requirementId(reference),
|
|
923
1081
|
type: "requirement",
|
|
924
1082
|
title: `${reference}: ${name}`,
|
|
925
1083
|
frameworkId: FRAMEWORK_ID,
|
|
926
1084
|
reference,
|
|
927
|
-
applicability: "
|
|
1085
|
+
applicability: "undetermined",
|
|
928
1086
|
description,
|
|
929
|
-
applicabilityRationale: "
|
|
1087
|
+
applicabilityRationale: "Confirm applicability against the selected service, scope, and auditor guidance before accepting this starter criterion.",
|
|
930
1088
|
tags: ["security", "common-criteria"]
|
|
931
1089
|
}));
|
|
932
1090
|
const descriptionRequirements = descriptionCriteria.map(([reference, name, description]) => ({
|
|
933
|
-
schemaVersion: 1,
|
|
934
1091
|
id: requirementId(reference),
|
|
935
1092
|
type: "requirement",
|
|
936
1093
|
title: `${reference}: ${name}`,
|
|
937
1094
|
frameworkId: DESCRIPTION_FRAMEWORK_ID,
|
|
938
1095
|
reference,
|
|
939
|
-
applicability: "
|
|
1096
|
+
applicability: "undetermined",
|
|
940
1097
|
description,
|
|
941
|
-
applicabilityRationale: "
|
|
1098
|
+
applicabilityRationale: "Confirm applicability against the selected service and auditor guidance before accepting this starter description criterion.",
|
|
942
1099
|
tags: ["description-criteria"]
|
|
943
1100
|
}));
|
|
944
1101
|
const controlRecords = controls.map((control) => ({
|
|
945
|
-
schemaVersion: 1,
|
|
946
1102
|
id: control.id,
|
|
947
1103
|
type: "control",
|
|
948
1104
|
title: control.title,
|
|
949
1105
|
status: "planned",
|
|
950
1106
|
statement: control.statement,
|
|
951
|
-
ownerIds: [
|
|
1107
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
952
1108
|
requirementIds: control.requirements.map(requirementId),
|
|
953
1109
|
code: control.code,
|
|
954
1110
|
activity: control.activity,
|
|
955
1111
|
controlType: control.controlType,
|
|
956
1112
|
operationMode: control.operationMode,
|
|
957
|
-
|
|
958
|
-
policyIds: control.policies
|
|
1113
|
+
operationPattern: control.operationPattern,
|
|
1114
|
+
policyIds: control.policies,
|
|
1115
|
+
...(FILEGRC_SOURCE_CONTROL_CODES.has(control.code)
|
|
1116
|
+
? { evidenceSourceIds: ["system-filegrc-program-repository"] }
|
|
1117
|
+
: {})
|
|
959
1118
|
}));
|
|
960
1119
|
const team = {
|
|
961
|
-
schemaVersion: 1,
|
|
962
1120
|
id: OVERSIGHT_TEAM_ID,
|
|
963
1121
|
type: "team",
|
|
964
1122
|
title: "Security and Risk Oversight",
|
|
965
|
-
status: "
|
|
1123
|
+
status: "planned",
|
|
966
1124
|
purpose: "Provide independent oversight of the security program, risk register, incidents, findings, vendor and access reviews, policy changes, exercises, and overdue work. The chair must be separate from the policy owner and people who operate the controls under review.",
|
|
967
|
-
memberIds: [
|
|
968
|
-
chairIds: []
|
|
969
|
-
meetingCadence: calendar("month", 3, effectiveDate)
|
|
1125
|
+
memberIds: [PROGRAM_LEAD_ID],
|
|
1126
|
+
chairIds: []
|
|
970
1127
|
};
|
|
971
1128
|
const programRepository = {
|
|
972
|
-
schemaVersion: 1,
|
|
973
1129
|
id: "system-filegrc-program-repository",
|
|
974
1130
|
type: "system",
|
|
975
1131
|
title: "filegrc Program Repository",
|
|
976
1132
|
status: "active",
|
|
977
1133
|
criticality: "high",
|
|
978
|
-
ownerIds: [
|
|
1134
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
979
1135
|
description: "The Git repository that is authoritative for filegrc governance records, approvals, exceptions, findings, acknowledgements, evidence indexes, and their revision history.",
|
|
980
1136
|
systemKind: "governance-system-of-record",
|
|
981
1137
|
environment: "Git repository",
|
|
982
|
-
|
|
1138
|
+
classificationId: "confidential",
|
|
983
1139
|
internetExposed: false,
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
evidenceOwnerIds: [OWNER_ID]
|
|
1140
|
+
evidenceSourceKinds: FILEGRC_SOURCE_FAMILIES,
|
|
1141
|
+
evidenceOwnerIds: [POLICY_OWNER_APPOINTMENT_ID]
|
|
987
1142
|
};
|
|
988
1143
|
const obligationRecords = obligations.map((obligation) => ({
|
|
989
|
-
schemaVersion: 1,
|
|
990
1144
|
id: obligation.id,
|
|
991
1145
|
type: "obligation",
|
|
992
1146
|
title: obligation.title,
|
|
993
|
-
status: "
|
|
1147
|
+
status: "proposed",
|
|
994
1148
|
activityType: obligation.activityType,
|
|
995
1149
|
recurrence: obligation.recurrence.mode === "calendar"
|
|
996
1150
|
? { ...obligation.recurrence, anchorDate: effectiveDate }
|
|
@@ -998,13 +1152,32 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
|
|
|
998
1152
|
ownerIds: obligation.ownerIds,
|
|
999
1153
|
startsOn: effectiveDate,
|
|
1000
1154
|
...(obligation.triggerPrompt ? { triggerPrompt: obligation.triggerPrompt } : {}),
|
|
1155
|
+
...(obligation.eventRiskLevels ? { eventRiskLevels: obligation.eventRiskLevels } : {}),
|
|
1001
1156
|
...(obligation.window ? { window: obligation.window } : {}),
|
|
1002
|
-
...(obligation.completionResourceTypes ? { completionResourceTypes: obligation.completionResourceTypes } : {}),
|
|
1003
1157
|
...(obligation.scopeResourceIds ? { scopeResourceIds: obligation.scopeResourceIds } : {}),
|
|
1004
1158
|
...(obligation.templateResourceId ? { templateResourceId: obligation.templateResourceId } : {}),
|
|
1005
1159
|
controlIds: obligation.controlIds,
|
|
1006
1160
|
policyIds: obligation.policyIds
|
|
1007
1161
|
}));
|
|
1162
|
+
const sourceCoverageRecords = SOURCE_FAMILIES.map(([sourceFamilyId, title]) => {
|
|
1163
|
+
const filegrcManaged = FILEGRC_SOURCE_FAMILIES.includes(sourceFamilyId);
|
|
1164
|
+
return {
|
|
1165
|
+
id: `source-coverage-${sourceFamilyId}`,
|
|
1166
|
+
type: "source-coverage",
|
|
1167
|
+
title: `${title} coverage`,
|
|
1168
|
+
status: filegrcManaged ? "active" : "planned",
|
|
1169
|
+
sourceFamilyId,
|
|
1170
|
+
coverageKind: filegrcManaged ? "filegrc" : "external-system",
|
|
1171
|
+
scopeResourceIds: ["workspace"],
|
|
1172
|
+
ownerIds: [POLICY_OWNER_APPOINTMENT_ID],
|
|
1173
|
+
...(filegrcManaged ? {
|
|
1174
|
+
collectionCadence: "Record work when it occurs and export the complete population for the audit period.",
|
|
1175
|
+
retention: "Keep records for the period defined in the approved Data Retention Schedule.",
|
|
1176
|
+
reconciliationMethod: "Export the complete filegrc source-family population, compare it with related in-scope records and Work Queue activity, and investigate omissions or duplicates.",
|
|
1177
|
+
validFrom: effectiveDate
|
|
1178
|
+
} : {})
|
|
1179
|
+
};
|
|
1180
|
+
});
|
|
1008
1181
|
|
|
1009
1182
|
const foundation = [
|
|
1010
1183
|
recordFile("systems", programRepository),
|
|
@@ -1019,6 +1192,7 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
|
|
|
1019
1192
|
...descriptionRequirements.map((record) => recordFile("requirements", record)),
|
|
1020
1193
|
...controlRecords.map((record) => recordFile("controls", record)),
|
|
1021
1194
|
...foundation,
|
|
1195
|
+
...sourceCoverageRecords.map((record) => recordFile("source-coverage", record)),
|
|
1022
1196
|
...obligationRecords.map((record) => recordFile("obligations", record))
|
|
1023
1197
|
];
|
|
1024
1198
|
}
|
|
@@ -1044,17 +1218,19 @@ function event(eventType) {
|
|
|
1044
1218
|
return { mode: "event", eventType };
|
|
1045
1219
|
}
|
|
1046
1220
|
|
|
1047
|
-
function eventWindow(
|
|
1221
|
+
function eventWindow(dueAfter = 30) {
|
|
1048
1222
|
return {
|
|
1049
|
-
|
|
1050
|
-
|
|
1223
|
+
precision: "date",
|
|
1224
|
+
startsAfter: 0,
|
|
1225
|
+
dueAfter
|
|
1051
1226
|
};
|
|
1052
1227
|
}
|
|
1053
1228
|
|
|
1054
|
-
function eventWindowHours(
|
|
1229
|
+
function eventWindowHours(dueAfter) {
|
|
1055
1230
|
return {
|
|
1056
|
-
|
|
1057
|
-
|
|
1231
|
+
precision: "timestamp",
|
|
1232
|
+
startsAfter: 0,
|
|
1233
|
+
dueAfter
|
|
1058
1234
|
};
|
|
1059
1235
|
}
|
|
1060
1236
|
|