create-filegrc 0.11.1 → 0.12.1
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/package.json +1 -1
- package/src/defaults.js +48 -14
- package/src/index.js +3 -3
- package/template/AGENTS.md +13 -3
- package/template/README.md +2 -2
- package/template/data/AGENTS.md +10 -1
- package/template/data/collection-reviews/collection-review-classification.json +10 -0
- package/template/data/documents/document-security-incident-recovery-plan.md +3 -3
- package/template/data/obligations/AGENTS.md +3 -1
- package/template/data/policies/policy-information-security.json +14 -0
- package/template/data/policies/policy-information-security.md +1 -1
- package/template/data/reporting-route-sets/reporting-route-set-security-reporting.json +23 -0
- package/template/data/reporting-route-sets/reporting-route-set-security-reporting.md +9 -0
- package/template/data/training/training-security-awareness.md +3 -3
- package/template/data/workspace.json +1 -1
- package/template/package.json +1 -1
package/package.json
CHANGED
package/src/defaults.js
CHANGED
|
@@ -1125,24 +1125,39 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
|
|
|
1125
1125
|
evidenceSourceKinds: FILEGRC_SOURCE_FAMILIES,
|
|
1126
1126
|
evidenceOwnerIds: [POLICY_OWNER_APPOINTMENT_ID]
|
|
1127
1127
|
};
|
|
1128
|
-
const obligationRecords = obligations.map((obligation) =>
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1128
|
+
const obligationRecords = obligations.map((obligation) => {
|
|
1129
|
+
const ruleId = `${obligation.id.replace(/^obligation-/, "obligation-rule-")}-v1`;
|
|
1130
|
+
return {
|
|
1131
|
+
id: obligation.id,
|
|
1132
|
+
type: "obligation",
|
|
1133
|
+
title: obligation.title,
|
|
1134
|
+
status: "proposed",
|
|
1135
|
+
activityType: obligation.activityType,
|
|
1136
|
+
scheduleMode: "rule",
|
|
1137
|
+
ruleIds: [ruleId],
|
|
1138
|
+
ownerIds: obligation.ownerIds,
|
|
1139
|
+
...(obligation.triggerPrompt ? { triggerPrompt: obligation.triggerPrompt } : {}),
|
|
1140
|
+
...(obligation.eventRiskLevels ? { eventRiskLevels: obligation.eventRiskLevels } : {}),
|
|
1141
|
+
...(obligation.scopeResourceIds ? { scopeResourceIds: obligation.scopeResourceIds } : {}),
|
|
1142
|
+
...(obligation.templateResourceId ? { templateResourceId: obligation.templateResourceId } : {}),
|
|
1143
|
+
controlIds: obligation.controlIds,
|
|
1144
|
+
policyIds: obligation.policyIds
|
|
1145
|
+
};
|
|
1146
|
+
});
|
|
1147
|
+
const obligationRuleRecords = obligations.map((obligation) => ({
|
|
1148
|
+
id: `${obligation.id.replace(/^obligation-/, "obligation-rule-")}-v1`,
|
|
1149
|
+
type: "obligation-rule",
|
|
1150
|
+
title: `${obligation.title} rule v1`,
|
|
1132
1151
|
status: "proposed",
|
|
1133
|
-
|
|
1152
|
+
obligationId: obligation.id,
|
|
1153
|
+
activityDefinitionVersion: "1",
|
|
1134
1154
|
recurrence: obligation.recurrence.mode === "calendar"
|
|
1135
1155
|
? { ...obligation.recurrence, anchorDate: effectiveDate }
|
|
1136
1156
|
: obligation.recurrence,
|
|
1137
|
-
ownerIds: obligation.ownerIds,
|
|
1138
|
-
startsOn: effectiveDate,
|
|
1139
|
-
...(obligation.triggerPrompt ? { triggerPrompt: obligation.triggerPrompt } : {}),
|
|
1140
|
-
...(obligation.eventRiskLevels ? { eventRiskLevels: obligation.eventRiskLevels } : {}),
|
|
1141
1157
|
...(obligation.window ? { window: obligation.window } : {}),
|
|
1142
|
-
...(obligation.
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
policyIds: obligation.policyIds
|
|
1158
|
+
...(starterObligationSelector(obligation.id) ? { selector: starterObligationSelector(obligation.id) } : {}),
|
|
1159
|
+
rationale: "Starter proposal derived from the linked Policy. Management must review the cadence, population, completion criteria, and timing before activation.",
|
|
1160
|
+
sourceResourceIds: [...(obligation.policyIds || [])]
|
|
1146
1161
|
}));
|
|
1147
1162
|
const sourceCoverageRecords = SOURCE_FAMILIES.map(([sourceFamilyId, title]) => {
|
|
1148
1163
|
const filegrcManaged = FILEGRC_SOURCE_FAMILIES.includes(sourceFamilyId);
|
|
@@ -1201,10 +1216,29 @@ export function baselineRecordFiles(effectiveDate, starter = "security") {
|
|
|
1201
1216
|
...foundation,
|
|
1202
1217
|
...sourceCoverageRecords.map((record) => recordFile("source-coverage", record)),
|
|
1203
1218
|
...retentionScheduleItems.map((record) => recordFile("retention-schedule-items", record)),
|
|
1204
|
-
...obligationRecords.map((record) => recordFile("obligations", record))
|
|
1219
|
+
...obligationRecords.map((record) => recordFile("obligations", record)),
|
|
1220
|
+
...obligationRuleRecords.map((record) => recordFile("obligation-rules", record))
|
|
1205
1221
|
];
|
|
1206
1222
|
}
|
|
1207
1223
|
|
|
1224
|
+
function starterObligationSelector(obligationId) {
|
|
1225
|
+
const definitions = {
|
|
1226
|
+
"obligation-annual-workforce-competence-review": { resourceType: "person", statuses: ["active"] },
|
|
1227
|
+
"obligation-annual-access-review": { resourceType: "system", statuses: ["active"], criticalities: ["high", "critical"] },
|
|
1228
|
+
"obligation-annual-network-access-review": { resourceType: "system", statuses: ["active"], criticalities: ["high", "critical"] },
|
|
1229
|
+
"obligation-quarterly-vulnerability-scan": { resourceType: "system", statuses: ["active"], criticalities: ["high", "critical"] },
|
|
1230
|
+
"obligation-quarterly-log-review": { resourceType: "system", statuses: ["active"], criticalities: ["high", "critical"] },
|
|
1231
|
+
"obligation-annual-backup-restoration-test": { resourceType: "system", statuses: ["active"], criticalities: ["high", "critical"] },
|
|
1232
|
+
"obligation-annual-critical-vendor-review": { resourceType: "vendor", statuses: ["active"], criticalities: ["high", "critical"] }
|
|
1233
|
+
};
|
|
1234
|
+
const definition = definitions[obligationId];
|
|
1235
|
+
return definition ? {
|
|
1236
|
+
...definition,
|
|
1237
|
+
membershipMode: "as-of",
|
|
1238
|
+
cutoff: "window-end"
|
|
1239
|
+
} : null;
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1208
1242
|
export async function writeBaselineRecords(target, effectiveDate, starter = "security") {
|
|
1209
1243
|
for (const { path: relativePath, record } of baselineRecordFiles(effectiveDate, starter)) {
|
|
1210
1244
|
const path = join(target, relativePath);
|
package/src/index.js
CHANGED
|
@@ -10,7 +10,7 @@ const execute = promisify(execFile);
|
|
|
10
10
|
const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
11
11
|
const textExtensions = new Set(["", ".json", ".md", ".txt", ".yml", ".yaml", ".gitignore"]);
|
|
12
12
|
const STARTER_PROFILES = new Set(["foundation", "security"]);
|
|
13
|
-
const SECURITY_TEMPLATE_COLLECTIONS = new Set(["collection-reviews", "documents", "policies", "training"]);
|
|
13
|
+
const SECURITY_TEMPLATE_COLLECTIONS = new Set(["collection-reviews", "documents", "policies", "reporting-route-sets", "training"]);
|
|
14
14
|
|
|
15
15
|
export async function createFilegrc(options = {}) {
|
|
16
16
|
const parameterConfig = JSON.parse(await readFile(join(packageRoot, "template-parameters.json"), "utf8"));
|
|
@@ -523,13 +523,13 @@ async function runCombinedSetup(target, input) {
|
|
|
523
523
|
async function writeMinimalLockfile(target, name, versionRange) {
|
|
524
524
|
const lock = {
|
|
525
525
|
name,
|
|
526
|
-
version: "0.
|
|
526
|
+
version: "0.12.1",
|
|
527
527
|
lockfileVersion: 3,
|
|
528
528
|
requires: true,
|
|
529
529
|
packages: {
|
|
530
530
|
"": {
|
|
531
531
|
name,
|
|
532
|
-
version: "0.
|
|
532
|
+
version: "0.12.1",
|
|
533
533
|
dependencies: { filegrc: versionRange }
|
|
534
534
|
}
|
|
535
535
|
}
|
package/template/AGENTS.md
CHANGED
|
@@ -42,6 +42,10 @@ Read `data/AGENTS.md` before changing records. More specific instructions inside
|
|
|
42
42
|
|
|
43
43
|
- Read `README.md` and run `npm run validate` before broad changes.
|
|
44
44
|
- Treat `data/` as the source of truth. Do not hand-edit `.filegrc/` output.
|
|
45
|
+
- Let Git exclusively supply version-control facts, including authors, commit timestamps, messages, diffs, revisions, renames, and prior file versions. Do not copy them into records or maintain a parallel change log.
|
|
46
|
+
- Store each mutable program fact in one authoritative record and refer to it by ID. Policies state durable rules and outcomes instead of copying current people, vendors, systems, reporting channels, schedules, targets, or inventories.
|
|
47
|
+
- A Reporting Channel Set holds the normal and fallback ways people send a report for one purpose, such as a security email address and a hotline. Keep one revision for each Program and purpose. Commit its proposal before recording approval, use separate Appointment kinds for approval and ongoing responsibility, and create a successor instead of editing an approved revision.
|
|
48
|
+
- Keep an Obligation occurrence rolled up when one owner, window, population rule, and reconciliation conclusion govern the work. Split it only when a member needs its own owner, deadline, conclusion, or follow-up lifecycle.
|
|
45
49
|
- Keep compliance records focused on business facts, decisions, scope, Controls, and Evidence. Do not mention filegrc versions, migrations, or workflow mechanics unless filegrc itself is the subject.
|
|
46
50
|
- Use UTF-8 JSON for structured records and Markdown for long-form work.
|
|
47
51
|
- Keep one resource in each JSON file.
|
|
@@ -70,7 +74,7 @@ Run `npm run check:milestone` in CI. Before an assurance goal is selected it che
|
|
|
70
74
|
|
|
71
75
|
## Git is the audit trail
|
|
72
76
|
|
|
73
|
-
Git supplies file authors, commit timestamps, messages, diffs, and
|
|
77
|
+
Git exclusively supplies file authors, commit timestamps, messages, diffs, revisions, renames, and prior versions. Do not add fields such as `createdAt`, `updatedAt`, `createdBy`, `updatedBy`, or a second change log.
|
|
74
78
|
|
|
75
79
|
Domain events still need explicit dates. Keep values such as `occurredOn`, `scheduledFor`, `approvedOn`, `completedOn`, and audit-period dates in their records.
|
|
76
80
|
|
|
@@ -115,7 +119,7 @@ npx filegrc migrate --to-model 8 --preview --json
|
|
|
115
119
|
|
|
116
120
|
Older workspaces migrate one version at a time. Review every preview’s automatic, review-required, and unsupported classifications before applying it with the same options and `--yes`. The v8 migration preserves legacy retention prose as notes, renames Component processing operations, and creates no retention periods or disposition behavior.
|
|
117
121
|
|
|
118
|
-
The [model
|
|
122
|
+
The [model v10 upgrade guide](https://github.com/Alignbase/filegrc/blob/main/docs/upgrading-to-model-v10.md) explains Reporting Channel Sets and the legacy-route review. The [model v9 upgrade guide](https://github.com/Alignbase/filegrc/blob/main/docs/upgrading-to-model-v9.md) explains rolled-up Obligation occurrences, reviewed schedule rules, and temporal Collection Reviews.
|
|
119
123
|
|
|
120
124
|
Run these commands when working with records:
|
|
121
125
|
|
|
@@ -127,11 +131,17 @@ npx filegrc list risk --json
|
|
|
127
131
|
npx filegrc get risk-example
|
|
128
132
|
npx filegrc get risk-example --mutation
|
|
129
133
|
npx filegrc references risk-example --json
|
|
134
|
+
npx filegrc reporting-route-sets --json
|
|
135
|
+
npx filegrc reporting-route-set scaffold approve --id REPORTING_ROUTE_SET_ID
|
|
136
|
+
npx filegrc reporting-route-set scaffold cancel --id REPORTING_ROUTE_SET_ID
|
|
137
|
+
npx filegrc reporting-route-set scaffold successor --id SUCCESSOR_ROUTE_SET_ID
|
|
130
138
|
npx filegrc describe risk
|
|
131
139
|
npx filegrc search "access review"
|
|
132
140
|
npm run serve
|
|
133
141
|
```
|
|
134
142
|
|
|
143
|
+
The Reporting Channel Set scaffolds are action-specific. Approval needs the exact committed proposal, current route-set revision, authorized Appointment, actual times, timezone, and verified fixed Evidence. Cancellation needs its own authority, time, reason, Evidence, and current revision. A successor approval also includes the predecessor cancellation authority, Evidence, and revision so FileGRC records the cutover atomically. Replace every placeholder before passing the payload to `reporting-route-set approve` or `reporting-route-set cancel`.
|
|
144
|
+
|
|
135
145
|
Prefer existing fields. Put organization-specific values under `extensions` with a namespace owned by {{company_name}}. Add structure only when validation, filtering, relationships, due dates, or audit completeness need it. Variable procedures, interviews, observations, rationale, and detailed results belong in the record's Markdown companion.
|
|
136
146
|
|
|
137
147
|
Never change a resource ID after it is committed. Create a replacement and link the records if identity truly changes.
|
|
@@ -282,7 +292,7 @@ Link a control test to its `audit-population` record when sampling applies. Link
|
|
|
282
292
|
|
|
283
293
|
## Content and approvals
|
|
284
294
|
|
|
285
|
-
The initial program lead is {{policy_owner_name}}, {{policy_owner_job_title}}, at {{policy_owner_email}}. The separate Policy Owner Appointment records this person’s starting program authority
|
|
295
|
+
The initial program lead is {{policy_owner_name}}, {{policy_owner_job_title}}, at {{policy_owner_email}}. The separate Policy Owner Appointment records this person’s starting program authority. The Reporting Channel Set holds the normal and fallback ways people send security concerns. Update the Person when their organizational position changes. End and replace Appointments when named authority moves to someone else.
|
|
286
296
|
|
|
287
297
|
Appoint an independent management reviewer during policy review, not as a condition of defining the service boundary. The reviewer must be separate from the policy owner and able to challenge the owner’s decisions. Assign another internal leader or manager when a suitable reviewer is available. Otherwise, appoint a qualified external reviewer. The reviewer chairs Security and Risk Oversight and approves policies and governed documents.
|
|
288
298
|
|
package/template/README.md
CHANGED
|
@@ -19,7 +19,7 @@ npm run serve
|
|
|
19
19
|
|
|
20
20
|
Requires Node.js 20 or newer and Git.
|
|
21
21
|
|
|
22
|
-
Existing model
|
|
22
|
+
Existing model v9 workspaces must run `npx filegrc migrate --to-model 10 --preview --json` after installing a model v10 package. The migration preserves prior Reporting Routes as legacy facts and asks management to create one reviewed Reporting Channel Set: the normal and fallback ways people send a report for one purpose. It does not infer missing Program, channel pairing, authority, or event-time facts. Older workspaces migrate one model version at a time. See the [model v10 upgrade guide](https://github.com/Alignbase/filegrc/blob/main/docs/upgrading-to-model-v10.md).
|
|
23
23
|
|
|
24
24
|
## How it works
|
|
25
25
|
|
|
@@ -27,7 +27,7 @@ The repository is the program. There is no separate application database.
|
|
|
27
27
|
|
|
28
28
|
- **JSON** holds records that filegrc validates, filters, and connects.
|
|
29
29
|
- **Markdown** holds policies, procedures, plans, minutes, and narratives.
|
|
30
|
-
- **Git** supplies authors, timestamps, revisions, diffs, and commit messages.
|
|
30
|
+
- **Git** exclusively supplies authors, commit timestamps, revisions, diffs, renames, prior versions, and commit messages.
|
|
31
31
|
|
|
32
32
|
Use the same source through the local web app, a text editor, the CLI, or CI. Browser and CLI actions call the same rules, so engineers and agents see the same validation and readiness results.
|
|
33
33
|
|
package/template/data/AGENTS.md
CHANGED
|
@@ -101,7 +101,7 @@ When `guide` returns a collection review requirement, review the listed type-spe
|
|
|
101
101
|
|
|
102
102
|
Use Retention Schedule Items as the structured rows of the Data Retention Schedule. Keep a row `planned` until management has approved its Information Types, scope, cutoff, period, disposition action, instructions, sources, approver, date, and reviewed source revisions. Run `npx filegrc program-readiness --json` after changing an information use, source-coverage record, Commitment, Policy, or other source. FileGRC may identify missing or stale decisions, but it must never infer an organization-specific period or deletion behavior.
|
|
103
103
|
|
|
104
|
-
Store a relationship only on its authoritative record. Control Tests store `auditId`; Evidence Artifacts store `auditIds`; Commitments store `systemIds` and `controlIds`; Controls store `policyIds`, `requirementIds`, `systemIds`, `componentIds`, and `evidenceSourceComponentIds`; Risks store `controlIds`; Components store their `vendorId` and `systemUses
|
|
104
|
+
Store a relationship only on its authoritative record. Control Tests store `auditId`; Evidence Artifacts store `auditIds`; Commitments store `systemIds` and `controlIds`; Controls store `policyIds`, `requirementIds`, `systemIds`, `componentIds`, and `evidenceSourceComponentIds`; Risks store `controlIds`; Components store their `vendorId` and `systemUses`; Reporting Channel Sets store the normal and fallback ways people send a report, the rules requiring them, and the responsible role. Use `references` to inspect derived inbound links.
|
|
105
105
|
|
|
106
106
|
Use explicit business dates. Git records when a file changed, but it does not replace `occurredOn`, `scheduledFor`, `completedOn`, `approvedOn`, or similar fields.
|
|
107
107
|
|
|
@@ -188,8 +188,13 @@ Use `get RESOURCE_ID --mutation` and `update` so JSON and Markdown change togeth
|
|
|
188
188
|
|
|
189
189
|
```sh
|
|
190
190
|
npx filegrc obligations --json
|
|
191
|
+
npx filegrc activate-obligation-rule RULE_ID --scaffold > activation.json
|
|
192
|
+
npx filegrc activate-obligation-rule RULE_ID activation.json
|
|
191
193
|
npx filegrc complete OBLIGATION_ID --scaffold --window-start YYYY-MM-DD --completed-on YYYY-MM-DD > completion-mutation.json
|
|
192
194
|
npx filegrc complete OBLIGATION_ID completion-mutation.json
|
|
195
|
+
npx filegrc reconcile-obligation OBLIGATION_ID --scaffold --window-start YYYY-MM-DD > occurrence.json
|
|
196
|
+
npx filegrc reconcile-obligation OBLIGATION_ID occurrence.json
|
|
197
|
+
npx filegrc reconcile-obligation OBLIGATION_ID --scaffold --window-start YYYY-MM-DD --correct-finalized > occurrence-correction.json
|
|
193
198
|
npx filegrc trigger EVENT_TYPE --occurred-on YYYY-MM-DD --subject RESOURCE_ID --json
|
|
194
199
|
npx filegrc complete-action ACTION_ITEM_ID --scaffold --completed-on YYYY-MM-DD > completion-mutation.json
|
|
195
200
|
npx filegrc complete-action ACTION_ITEM_ID completion-mutation.json --completed-on YYYY-MM-DD
|
|
@@ -204,6 +209,10 @@ Fill the scaffold with the actual work, evidence, review, and every null or empt
|
|
|
204
209
|
npx filegrc program-readiness --summary --json
|
|
205
210
|
npx filegrc prepare-audit AUDIT_ID
|
|
206
211
|
npx filegrc audit-readiness AUDIT_ID --json
|
|
212
|
+
npx filegrc reconcile-management-documents AUDIT_ID --scaffold > management-reconciliation.json
|
|
213
|
+
npx filegrc reconcile-management-documents AUDIT_ID management-reconciliation.json
|
|
214
|
+
npx filegrc correct-audit-population POPULATION_ID --scaffold > population-correction.json
|
|
215
|
+
npx filegrc correct-audit-population POPULATION_ID population-correction.json
|
|
207
216
|
npx filegrc evidence-packet --audit AUDIT_ID --preview --json
|
|
208
217
|
```
|
|
209
218
|
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
This plan coordinates reporting, response, recovery, and continuity when a security event or disruption affects {{company_name}} or an in-scope service. Supporting procedures, system records, and retained evidence document the actual technical configuration and operation.
|
|
6
6
|
|
|
7
|
-
## Reporting
|
|
7
|
+
## Reporting channels
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
People send suspected security concerns through the current approved normal reporting channel, such as the security email address. If that channel is unavailable, compromised, or involved in the concern, they use the approved fallback channel. The Reporting Channel Set is the source of truth for the current destinations, responsible role, and effective period.
|
|
10
10
|
|
|
11
|
-
[Complete before activation:
|
|
11
|
+
[Complete before activation: Describe how workers can find the fallback reporting channel when the normal email, identity, or collaboration System is unavailable, compromised, or involved in the concern. Do not copy the destination here or include plaintext credentials, private keys, tokens, or recovery codes.]
|
|
12
12
|
|
|
13
13
|
Reports may describe suspected unauthorized access, malware, data loss, credential exposure, security-Control failure, service disruption, fraud affecting the service, or another policy violation. The recipient records the report, protects confidentiality, preserves relevant information, and assigns an initial owner.
|
|
14
14
|
|
|
@@ -4,10 +4,12 @@ An obligation is a reusable policy schedule or event template. It is not the rec
|
|
|
4
4
|
|
|
5
5
|
- Calendar obligations need a valid recurrence anchor, owners, expected completion types, and policy or control links.
|
|
6
6
|
- Event obligations need a stable lowercase `eventType`, a prompt, owners, expected completion types, and an explicit deadline window.
|
|
7
|
+
- Keep one rolled-up Obligation Occurrence per rule window when one queue-level owner, population rule, and reconciliation conclusion govern the work. Reconcile each selected member to dated completion proof, an approved Exception, or a reviewed non-applicability decision.
|
|
8
|
+
- Split the work only when a member needs its own queue owner, deadline, conclusion, or follow-up lifecycle.
|
|
7
9
|
- Keep completed occurrences in `completionResourceIds`. Do not replace prior links when a new period starts.
|
|
8
10
|
- Configure and enable Obligations during Step 3. An enabled Obligation remains dormant until every governing Policy and required program Document is active and effective and, when it names Controls, at least one linked Control is implemented. FileGRC starts calendar work from the latest Policy or governed Document effective date, so pre-cutover periods do not become overdue work.
|
|
9
11
|
- Calendar Obligations generated with `status: proposed` contain suggested starting cadences. Review the scope and risk, edit the cadence when needed, and change the Obligation to `active` only when management accepts that schedule. A proposed Obligation never counts as a configured schedule.
|
|
10
|
-
- When an approved cadence changes, update the
|
|
12
|
+
- When an approved cadence changes, update its authoritative Obligation schedule. Keep the durable required outcome in the Policy and the implementation fact in the Control instead of copying the cadence across all three records.
|
|
11
13
|
- Pause or retire a template only when the underlying policy work no longer applies. Do not delete historical templates that explain prior periods.
|
|
12
14
|
|
|
13
15
|
Use `npx filegrc obligations --json` to inspect calculated recurring work and preview every Policy Event task, owner, deadline, and requested proof. Run `npx filegrc complete OBLIGATION_ID --scaffold --window-start YYYY-MM-DD --completed-on YYYY-MM-DD > completion-mutation.json`, fill the actual work and proof, then pass that file to `npx filegrc complete OBLIGATION_ID completion-mutation.json`. The scaffold includes the current Obligation revision, and the final command creates and links the dated occurrence in one validated write. Use `npx filegrc trigger EVENT_TYPE ...` only after the matching event occurs; it adds all configured Action Items to the Work Queue atomically.
|
|
@@ -17,6 +17,20 @@
|
|
|
17
17
|
"document-security-incident-recovery-plan",
|
|
18
18
|
"document-data-retention-schedule"
|
|
19
19
|
],
|
|
20
|
+
"reportingRouteRequirements": [
|
|
21
|
+
{
|
|
22
|
+
"purposeKey": "security-reporting",
|
|
23
|
+
"programScope": "all-programs",
|
|
24
|
+
"requiredLanes": [
|
|
25
|
+
"primary",
|
|
26
|
+
"alternate"
|
|
27
|
+
],
|
|
28
|
+
"distinctChannels": true,
|
|
29
|
+
"independentDependencies": false,
|
|
30
|
+
"effectiveAt": "1970-01-01T00:00:00Z",
|
|
31
|
+
"timezone": "UTC"
|
|
32
|
+
}
|
|
33
|
+
],
|
|
20
34
|
"proposedEffectiveOn": "{{effective_date}}",
|
|
21
35
|
"programRole": "required"
|
|
22
36
|
}
|
|
@@ -50,7 +50,7 @@ Management obtains or generates, checks, and uses relevant information from inte
|
|
|
50
50
|
|
|
51
51
|
Everyone in scope must act honestly, protect company and customer information, follow approved security processes, disclose conflicts that could affect security decisions, and preserve accurate records. Fraud, deliberate Control bypass, false Evidence, credential sharing, unauthorized access, concealment of a security event, and retaliation for a good-faith report are prohibited.
|
|
52
52
|
|
|
53
|
-
Suspected security events, Control failures, fraud, or policy violations must be reported promptly through the
|
|
53
|
+
Suspected security events, Control failures, fraud, or policy violations must be reported promptly through the current normal Security Reporting Channel or its usable fallback. A person may use the fallback when the normal channel is unavailable, compromised, or involved in the concern. Management investigates credible reports, limits disclosure to people who need the information, preserves relevant records, and records corrective action.
|
|
54
54
|
|
|
55
55
|
## Risk Management and Compliance Policy
|
|
56
56
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "reporting-route-set-security-reporting",
|
|
3
|
+
"type": "reporting-route-set",
|
|
4
|
+
"title": "Security reporting channels",
|
|
5
|
+
"status": "draft",
|
|
6
|
+
"programId": "program-soc-2",
|
|
7
|
+
"purposeKey": "security-reporting",
|
|
8
|
+
"purposeLabel": "Security reporting",
|
|
9
|
+
"primaryLane": {
|
|
10
|
+
"channelKind": "email",
|
|
11
|
+
"destination": "{{security_contact_email}}"
|
|
12
|
+
},
|
|
13
|
+
"alternateLane": {
|
|
14
|
+
"channelKind": "other",
|
|
15
|
+
"destination": "TBD: protected alternate channel"
|
|
16
|
+
},
|
|
17
|
+
"authorityAppointmentKind": "policy-owner",
|
|
18
|
+
"approvalAppointmentKind": "independent-policy-reviewer",
|
|
19
|
+
"sourceResourceIds": [
|
|
20
|
+
"policy-information-security",
|
|
21
|
+
"document-security-incident-recovery-plan"
|
|
22
|
+
]
|
|
23
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Security reporting channels
|
|
2
|
+
|
|
3
|
+
This record tells FileGRC where people should send security concerns. A channel can be an email address, phone number, web form, named in-person contact, or another clear destination.
|
|
4
|
+
|
|
5
|
+
- The normal channel is the method people should use first.
|
|
6
|
+
- The fallback channel must still work when the normal channel is unavailable, compromised, or involved in the concern.
|
|
7
|
+
- The responsible Appointment identifies the role that keeps both channels usable and known to the intended audience.
|
|
8
|
+
|
|
9
|
+
Before proposing this set, replace the fallback placeholder and confirm that people can find both channels. Do not store credentials, recovery codes, or other secrets here.
|
|
@@ -6,7 +6,7 @@ Security depends on the choices people make while using accounts, devices, data,
|
|
|
6
6
|
|
|
7
7
|
This training applies to employees and contractors who use {{company_name}} systems or information. Complete it within 30 days after starting, at least annually, and again when assigned after a material change or incident.
|
|
8
8
|
|
|
9
|
-
Questions and incident reports
|
|
9
|
+
Questions and incident reports use the current approved security reporting channel delivered with this assignment.
|
|
10
10
|
|
|
11
11
|
## Your responsibilities
|
|
12
12
|
|
|
@@ -176,7 +176,7 @@ Report any event that could affect the confidentiality, integrity, or availabili
|
|
|
176
176
|
## Reporting and first actions
|
|
177
177
|
|
|
178
178
|
1. Stop the unsafe action. Do not continue entering credentials, sending data, or following the request.
|
|
179
|
-
2. Report the event immediately
|
|
179
|
+
2. Report the event immediately through the approved security reporting channel delivered with this assignment. If that channel is unavailable, use the current approved fallback channel.
|
|
180
180
|
3. State what happened, when it happened, the affected account, device, system, or data, and any action already taken.
|
|
181
181
|
4. Preserve the message, file, screen, device, or other evidence. Take a screenshot only when it is safe and does not expose more sensitive data.
|
|
182
182
|
5. Follow response-team instructions. Remain available for questions.
|
|
@@ -200,7 +200,7 @@ The person who reports an event should cooperate with the response but should no
|
|
|
200
200
|
After reviewing this training:
|
|
201
201
|
|
|
202
202
|
- Ask about any requirement you do not understand.
|
|
203
|
-
- Confirm that you know how to
|
|
203
|
+
- Confirm that you know how to use the security reporting channel delivered with this assignment.
|
|
204
204
|
- Complete the assigned training acknowledgement.
|
|
205
205
|
|
|
206
206
|
The acknowledgement records the exact training revision reviewed and any signed evidence required for the assignment.
|