@open-agreements/open-agreements 0.2.0 → 0.2.2
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 +10 -2
- package/content/templates/closing-checklist/metadata.yaml +6 -13
- package/content/templates/closing-checklist/template.docx +0 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +47 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/checklist.d.ts +21 -1
- package/dist/commands/checklist.d.ts.map +1 -1
- package/dist/commands/checklist.js +175 -44
- package/dist/commands/checklist.js.map +1 -1
- package/dist/commands/recipe.js +3 -11
- package/dist/commands/recipe.js.map +1 -1
- package/dist/core/checklist/index.d.ts +22 -14
- package/dist/core/checklist/index.d.ts.map +1 -1
- package/dist/core/checklist/index.js +79 -39
- package/dist/core/checklist/index.js.map +1 -1
- package/dist/core/checklist/jsonl-stores.d.ts +3 -0
- package/dist/core/checklist/jsonl-stores.d.ts.map +1 -0
- package/dist/core/checklist/jsonl-stores.js +16 -0
- package/dist/core/checklist/jsonl-stores.js.map +1 -0
- package/dist/core/checklist/schemas.d.ts +2 -2
- package/dist/core/checklist/schemas.js +1 -1
- package/dist/core/checklist/schemas.js.map +1 -1
- package/dist/core/checklist/state-manager.d.ts +146 -0
- package/dist/core/checklist/state-manager.d.ts.map +1 -0
- package/dist/core/checklist/state-manager.js +147 -0
- package/dist/core/checklist/state-manager.js.map +1 -0
- package/dist/core/checklist/status-labels.d.ts +6 -0
- package/dist/core/checklist/status-labels.d.ts.map +1 -0
- package/dist/core/checklist/status-labels.js +29 -0
- package/dist/core/checklist/status-labels.js.map +1 -0
- package/dist/core/validation/recipe.d.ts.map +1 -1
- package/dist/core/validation/recipe.js +47 -61
- package/dist/core/validation/recipe.js.map +1 -1
- package/package.json +1 -1
- package/skills/cloud-service-agreement/SKILL.md +9 -0
- package/skills/data-privacy-agreement/SKILL.md +9 -0
- package/skills/edit-docx-agreement/CONNECTORS.md +20 -0
- package/skills/edit-docx-agreement/SKILL.md +77 -0
- package/skills/employment-contract/SKILL.md +9 -0
- package/skills/iso-27001-evidence-collection/CONNECTORS.md +23 -0
- package/skills/iso-27001-evidence-collection/SKILL.md +300 -0
- package/skills/iso-27001-evidence-collection/rules/api-exports.md +191 -0
- package/skills/iso-27001-evidence-collection/rules/evidence-types.md +107 -0
- package/skills/iso-27001-evidence-collection/rules/screenshot-guide.md +77 -0
- package/skills/iso-27001-internal-audit/CONNECTORS.md +23 -0
- package/skills/iso-27001-internal-audit/SKILL.md +272 -0
- package/skills/iso-27001-internal-audit/rules/access-control.md +191 -0
- package/skills/iso-27001-internal-audit/rules/business-continuity.md +94 -0
- package/skills/iso-27001-internal-audit/rules/change-management.md +211 -0
- package/skills/iso-27001-internal-audit/rules/encryption.md +93 -0
- package/skills/iso-27001-internal-audit/rules/incident-response.md +127 -0
- package/skills/iso-27001-internal-audit/rules/isms-management.md +164 -0
- package/skills/iso-27001-internal-audit/rules/logging-monitoring.md +96 -0
- package/skills/iso-27001-internal-audit/rules/people-controls.md +161 -0
- package/skills/iso-27001-internal-audit/rules/supplier-management.md +92 -0
- package/skills/nda/SKILL.md +9 -0
- package/skills/open-agreements/SKILL.md +9 -0
- package/skills/safe/SKILL.md +9 -0
- package/skills/services-agreement/SKILL.md +9 -0
- package/skills/soc2-readiness/CONNECTORS.md +23 -0
- package/skills/soc2-readiness/SKILL.md +289 -0
- package/skills/soc2-readiness/rules/trust-services.md +230 -0
- package/skills/venture-financing/SKILL.md +9 -0
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: iso-27001-evidence-collection
|
|
3
|
+
description: >-
|
|
4
|
+
Collect, organize, and validate evidence for ISO 27001 and SOC 2 audits.
|
|
5
|
+
API-first approach with CLI commands for major cloud platforms. Produces
|
|
6
|
+
timestamped, auditor-ready evidence packages.
|
|
7
|
+
license: MIT
|
|
8
|
+
compatibility: >-
|
|
9
|
+
Works with any AI agent. Enhanced with compliance MCP server for automated
|
|
10
|
+
gap detection. Falls back to embedded checklists when no live data available.
|
|
11
|
+
metadata:
|
|
12
|
+
author: open-agreements
|
|
13
|
+
version: "0.1.0"
|
|
14
|
+
frameworks:
|
|
15
|
+
- ISO 27001:2022
|
|
16
|
+
- SOC 2 Type II
|
|
17
|
+
- NIST SP 800-53 Rev 5
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# ISO 27001 Evidence Collection
|
|
21
|
+
|
|
22
|
+
Systematically collect audit evidence for ISO 27001:2022 and SOC 2. This skill provides API-first evidence collection commands, organizes evidence by control, and validates completeness before auditor review.
|
|
23
|
+
|
|
24
|
+
## Security Model
|
|
25
|
+
|
|
26
|
+
- **No scripts executed** — this skill is markdown-only procedural guidance
|
|
27
|
+
- **No secrets required** — works with reference checklists; CLI commands use existing local credentials
|
|
28
|
+
- **Evidence stays local** — all outputs go to the local filesystem
|
|
29
|
+
- **IP-clean** — references NIST SP 800-53 (public domain); ISO controls cited by section ID only
|
|
30
|
+
|
|
31
|
+
## When to Use
|
|
32
|
+
|
|
33
|
+
Activate this skill when:
|
|
34
|
+
|
|
35
|
+
1. **Preparing evidence package for external audit** — 2-4 weeks before auditor arrives
|
|
36
|
+
2. **Quarterly evidence refresh** — update evidence that has aged beyond the audit window
|
|
37
|
+
3. **After remediation** — collect evidence proving a finding has been fixed
|
|
38
|
+
4. **New system onboarding** — establish baseline evidence for a newly in-scope system
|
|
39
|
+
5. **Evidence gap analysis** — identify what's missing before the audit
|
|
40
|
+
|
|
41
|
+
Do NOT use for:
|
|
42
|
+
- Running the internal audit itself — use `iso-27001-internal-audit`
|
|
43
|
+
- SOC 2-only readiness assessment — use `soc2-readiness`
|
|
44
|
+
- Interpreting audit findings — use the internal audit skill
|
|
45
|
+
|
|
46
|
+
## Core Concepts
|
|
47
|
+
|
|
48
|
+
### Evidence Hierarchy (Best to Worst)
|
|
49
|
+
|
|
50
|
+
| Rank | Type | Example | Why Better |
|
|
51
|
+
|------|------|---------|------------|
|
|
52
|
+
| 1 | **API export (JSON/CSV)** | `gcloud iam service-accounts list --format=json` | Timestamped, tamper-evident, reproducible |
|
|
53
|
+
| 2 | **System-generated report** | SOC 2 report from vendor, SIEM export | Authoritative source, includes metadata |
|
|
54
|
+
| 3 | **Configuration export** | Terraform state, policy JSON | Shows intended state, version-controlled |
|
|
55
|
+
| 4 | **Screenshot with system clock** | `screencapture -x ~/evidence/...` | Visual proof, but harder to validate |
|
|
56
|
+
| 5 | **Manual attestation** | Signed statement by responsible person | Last resort, requires corroboration |
|
|
57
|
+
|
|
58
|
+
### Evidence Freshness Requirements
|
|
59
|
+
|
|
60
|
+
| Evidence Type | Max Age | Refresh Cadence |
|
|
61
|
+
|---------------|---------|-----------------|
|
|
62
|
+
| Access lists | 90 days | Quarterly |
|
|
63
|
+
| Vulnerability scans | 30 days | Monthly |
|
|
64
|
+
| Configuration exports | 90 days | Quarterly |
|
|
65
|
+
| Training records | 12 months | Annual |
|
|
66
|
+
| Penetration test | 12 months | Annual |
|
|
67
|
+
| Policy documents | 12 months | Annual review |
|
|
68
|
+
| Incident records | Audit period | Continuous |
|
|
69
|
+
| Risk assessment | 12 months | Annual + on change |
|
|
70
|
+
|
|
71
|
+
### Evidence Naming Convention
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
{control_id}_{evidence_type}_{YYYY-MM-DD}.{ext}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Examples:
|
|
78
|
+
- `A.5.15_user-access-list_2026-02-28.json`
|
|
79
|
+
- `A.8.8_vulnerability-scan_2026-02-28.csv`
|
|
80
|
+
- `A.8.13_backup-test-results_2026-02-28.pdf`
|
|
81
|
+
|
|
82
|
+
## Step-by-Step Workflow
|
|
83
|
+
|
|
84
|
+
### Step 1: Identify Evidence Gaps
|
|
85
|
+
|
|
86
|
+
Determine what evidence is missing or stale.
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
# If compliance MCP is available:
|
|
90
|
+
list_evidence_gaps(framework="iso27001_2022", tier="critical")
|
|
91
|
+
|
|
92
|
+
# If reading local compliance data:
|
|
93
|
+
# Check compliance/evidence/*.md files for upload_status != "OK"
|
|
94
|
+
# Check renewal_next dates for upcoming expirations
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Step 2: Prioritize Collection
|
|
98
|
+
|
|
99
|
+
Order evidence collection by:
|
|
100
|
+
1. **Missing evidence for Critical-tier controls** — audit blockers
|
|
101
|
+
2. **Stale evidence past renewal date** — auditor will reject
|
|
102
|
+
3. **Evidence for Relevant-tier controls** — expected but not blocking
|
|
103
|
+
4. **Checkbox-tier evidence** — policies and attestations
|
|
104
|
+
|
|
105
|
+
### Step 3: Collect by Platform
|
|
106
|
+
|
|
107
|
+
Run evidence collection commands grouped by platform to minimize context-switching.
|
|
108
|
+
|
|
109
|
+
#### GitHub Evidence
|
|
110
|
+
```bash
|
|
111
|
+
# Org settings: MFA requirement, default permissions
|
|
112
|
+
gh api orgs/{org} | jq '{
|
|
113
|
+
two_factor_requirement_enabled,
|
|
114
|
+
default_repository_permission,
|
|
115
|
+
members_can_create_public_repositories
|
|
116
|
+
}' > evidence/A.5.17_github-org-mfa_$(date +%Y-%m-%d).json
|
|
117
|
+
|
|
118
|
+
# Branch protection on production repos
|
|
119
|
+
for repo in $(gh repo list {org} --json name -q '.[].name'); do
|
|
120
|
+
gh api repos/{org}/$repo/branches/main/protection 2>/dev/null | \
|
|
121
|
+
jq '{repo: "'$repo'", protection: .}' >> evidence/A.8.32_branch-protection_$(date +%Y-%m-%d).json
|
|
122
|
+
done
|
|
123
|
+
|
|
124
|
+
# Recent merged PRs (change management evidence)
|
|
125
|
+
gh pr list --state merged --limit 50 --json number,title,author,reviewDecision,mergedAt,mergedBy \
|
|
126
|
+
> evidence/A.8.32_change-records_$(date +%Y-%m-%d).json
|
|
127
|
+
|
|
128
|
+
# Dependabot alerts (vulnerability management)
|
|
129
|
+
gh api repos/{org}/{repo}/dependabot/alerts?state=open \
|
|
130
|
+
> evidence/A.8.8_dependabot-alerts_$(date +%Y-%m-%d).json
|
|
131
|
+
|
|
132
|
+
# Secret scanning alerts
|
|
133
|
+
gh api orgs/{org}/secret-scanning/alerts --paginate \
|
|
134
|
+
> evidence/A.8.24_secret-scanning_$(date +%Y-%m-%d).json
|
|
135
|
+
|
|
136
|
+
# Audit log
|
|
137
|
+
gh api orgs/{org}/audit-log?per_page=100 \
|
|
138
|
+
> evidence/A.8.15_github-audit-log_$(date +%Y-%m-%d).json
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
#### GCP Evidence
|
|
142
|
+
```bash
|
|
143
|
+
# IAM policy (access control)
|
|
144
|
+
gcloud projects get-iam-policy {project} --format=json \
|
|
145
|
+
> evidence/A.5.15_gcp-iam-policy_$(date +%Y-%m-%d).json
|
|
146
|
+
|
|
147
|
+
# Service accounts
|
|
148
|
+
gcloud iam service-accounts list --format=json \
|
|
149
|
+
> evidence/A.5.16_gcp-service-accounts_$(date +%Y-%m-%d).json
|
|
150
|
+
|
|
151
|
+
# Audit logging config
|
|
152
|
+
gcloud projects get-iam-policy {project} --format=json | jq '.auditConfigs' \
|
|
153
|
+
> evidence/A.8.15_gcp-audit-config_$(date +%Y-%m-%d).json
|
|
154
|
+
|
|
155
|
+
# Log sinks (centralization)
|
|
156
|
+
gcloud logging sinks list --format=json \
|
|
157
|
+
> evidence/A.8.15_gcp-log-sinks_$(date +%Y-%m-%d).json
|
|
158
|
+
|
|
159
|
+
# Compute instances (asset inventory)
|
|
160
|
+
gcloud compute instances list --format=json \
|
|
161
|
+
> evidence/A.5.9_gcp-compute-inventory_$(date +%Y-%m-%d).json
|
|
162
|
+
|
|
163
|
+
# Cloud SQL backup config
|
|
164
|
+
gcloud sql backups list --instance={instance} --format=json \
|
|
165
|
+
> evidence/A.8.13_gcp-sql-backups_$(date +%Y-%m-%d).json
|
|
166
|
+
|
|
167
|
+
# Firewall rules
|
|
168
|
+
gcloud compute firewall-rules list --format=json \
|
|
169
|
+
> evidence/A.8.20_gcp-firewall-rules_$(date +%Y-%m-%d).json
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
#### Azure Evidence
|
|
173
|
+
```bash
|
|
174
|
+
# Role assignments (access control)
|
|
175
|
+
az role assignment list --all --output json \
|
|
176
|
+
> evidence/A.5.15_azure-role-assignments_$(date +%Y-%m-%d).json
|
|
177
|
+
|
|
178
|
+
# Activity log (audit trail)
|
|
179
|
+
az monitor activity-log list --max-events 100 --output json \
|
|
180
|
+
> evidence/A.8.15_azure-activity-log_$(date +%Y-%m-%d).json
|
|
181
|
+
|
|
182
|
+
# Network security groups
|
|
183
|
+
az network nsg list --output json \
|
|
184
|
+
> evidence/A.8.20_azure-nsgs_$(date +%Y-%m-%d).json
|
|
185
|
+
|
|
186
|
+
# Backup jobs
|
|
187
|
+
az backup job list --resource-group {rg} --vault-name {vault} --output json \
|
|
188
|
+
> evidence/A.8.13_azure-backup-jobs_$(date +%Y-%m-%d).json
|
|
189
|
+
|
|
190
|
+
# Storage encryption
|
|
191
|
+
az storage account list --query "[].{name:name, encryption:encryption}" --output json \
|
|
192
|
+
> evidence/A.8.24_azure-storage-encryption_$(date +%Y-%m-%d).json
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
#### Google Workspace Evidence
|
|
196
|
+
```bash
|
|
197
|
+
# User list with MFA status
|
|
198
|
+
gam print users fields primaryEmail,name,isEnrolledIn2Sv,isEnforcedIn2Sv,lastLoginTime,suspended \
|
|
199
|
+
> evidence/A.5.17_workspace-users-mfa_$(date +%Y-%m-%d).csv
|
|
200
|
+
|
|
201
|
+
# Admin roles
|
|
202
|
+
gam print admins > evidence/A.8.2_workspace-admins_$(date +%Y-%m-%d).csv
|
|
203
|
+
|
|
204
|
+
# Mobile devices
|
|
205
|
+
gam print mobile > evidence/A.8.1_workspace-mobile-devices_$(date +%Y-%m-%d).csv
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
#### macOS Endpoint Evidence
|
|
209
|
+
```bash
|
|
210
|
+
# FileVault encryption
|
|
211
|
+
fdesetup status > evidence/A.8.24_filevault-status_$(date +%Y-%m-%d).txt
|
|
212
|
+
|
|
213
|
+
# System configuration
|
|
214
|
+
system_profiler SPHardwareDataType SPSoftwareDataType \
|
|
215
|
+
> evidence/A.8.1_endpoint-config_$(date +%Y-%m-%d).txt
|
|
216
|
+
|
|
217
|
+
# Screen lock settings
|
|
218
|
+
profiles show -type configuration 2>/dev/null | grep -A10 -i "lock\|idle\|screensaver" \
|
|
219
|
+
> evidence/A.6.7_screenlock-config_$(date +%Y-%m-%d).txt
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Step 4: Validate Evidence Package
|
|
223
|
+
|
|
224
|
+
Check completeness before submitting to auditor:
|
|
225
|
+
|
|
226
|
+
1. **Completeness**: Do you have evidence for every applicable control in the SoA?
|
|
227
|
+
2. **Freshness**: Is every piece of evidence within the required age?
|
|
228
|
+
3. **Format**: Are API exports in JSON/CSV with timestamps? Screenshots have system clock visible?
|
|
229
|
+
4. **Naming**: Files follow the naming convention?
|
|
230
|
+
5. **Coverage**: Critical-tier controls have at least 2 forms of evidence?
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
# If compliance MCP is available:
|
|
234
|
+
list_evidence_gaps(framework="iso27001_2022") # Should return empty for complete package
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Step 5: Generate Evidence Index
|
|
238
|
+
|
|
239
|
+
Create an index file listing all evidence, mapped to controls:
|
|
240
|
+
|
|
241
|
+
```markdown
|
|
242
|
+
# Evidence Package Index
|
|
243
|
+
Generated: {date}
|
|
244
|
+
Audit period: {start} to {end}
|
|
245
|
+
|
|
246
|
+
| Control | Evidence File | Type | Collected | Status |
|
|
247
|
+
|---------|--------------|------|-----------|--------|
|
|
248
|
+
| A.5.15 | gcp-iam-policy_2026-02-28.json | API export | 2026-02-28 | Current |
|
|
249
|
+
| A.5.17 | workspace-users-mfa_2026-02-28.csv | API export | 2026-02-28 | Current |
|
|
250
|
+
| ... | ... | ... | ... | ... |
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## DO / DON'T
|
|
254
|
+
|
|
255
|
+
### DO
|
|
256
|
+
- Use API exports with ISO 8601 timestamps over screenshots whenever possible
|
|
257
|
+
- Collect evidence from the SOURCE system (IdP, not a secondary report)
|
|
258
|
+
- Include metadata: collection date, system version, user who collected
|
|
259
|
+
- Store evidence in version-controlled directory with clear naming
|
|
260
|
+
- Collect evidence for the AUDIT PERIOD (usually past 12 months), not just current state
|
|
261
|
+
- Use `screencapture -x ~/evidence/{filename}.png` for screenshots (captures without shadow/border)
|
|
262
|
+
|
|
263
|
+
### DON'T
|
|
264
|
+
- Take screenshots without visible system clock (menu bar on macOS, taskbar on Windows)
|
|
265
|
+
- Collect evidence from sandbox/staging instead of production
|
|
266
|
+
- Manually edit evidence after collection (auditors may verify against source)
|
|
267
|
+
- Wait until the week before the audit to collect everything
|
|
268
|
+
- Assume stale evidence is acceptable — check freshness requirements above
|
|
269
|
+
- Mix evidence from different audit periods in the same file
|
|
270
|
+
|
|
271
|
+
## Troubleshooting
|
|
272
|
+
|
|
273
|
+
| Problem | Solution |
|
|
274
|
+
|---------|----------|
|
|
275
|
+
| API command requires auth | Use existing local credentials: `gcloud auth login`, `az login`, `gh auth login` |
|
|
276
|
+
| Tool not installed | Install: `brew install gh`, `brew install --cask google-cloud-sdk`, `brew install azure-cli` |
|
|
277
|
+
| Insufficient permissions | Request read-only access to the relevant service; document the access request as evidence |
|
|
278
|
+
| Evidence too large | Use `--limit` or `--max-events` flags; collect summary statistics instead of full export |
|
|
279
|
+
| Vendor won't provide SOC 2 report | Request via their trust center; if unavailable, document the request and use their security page |
|
|
280
|
+
| Screenshot doesn't include clock | On macOS: use full-screen capture, or `screencapture -x` which includes menu bar |
|
|
281
|
+
|
|
282
|
+
## Rules
|
|
283
|
+
|
|
284
|
+
For detailed evidence collection guidance by topic:
|
|
285
|
+
|
|
286
|
+
| File | Coverage |
|
|
287
|
+
|------|----------|
|
|
288
|
+
| `rules/api-exports.md` | CLI commands by cloud provider (GCP, Azure, AWS, GitHub, Google Workspace) |
|
|
289
|
+
| `rules/screenshot-guide.md` | When and how to take audit-ready screenshots |
|
|
290
|
+
| `rules/evidence-types.md` | Evidence type requirements per control domain |
|
|
291
|
+
|
|
292
|
+
## Attribution
|
|
293
|
+
|
|
294
|
+
Evidence collection procedures and control guidance developed with [Internal ISO Audit](https://internalisoaudit.com) (Hazel Castro, ISO 27001 Lead Auditor, 14+ years, 100+ audits).
|
|
295
|
+
|
|
296
|
+
## Runtime Detection
|
|
297
|
+
|
|
298
|
+
1. **Compliance MCP server available** (best) — Automated gap detection, evidence freshness tracking
|
|
299
|
+
2. **Local compliance data available** (good) — Reads evidence status from `compliance/evidence/*.md`
|
|
300
|
+
3. **Reference only** (baseline) — Uses embedded checklists and command reference
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# API Export Commands by Platform
|
|
2
|
+
|
|
3
|
+
Quick reference for evidence collection CLI commands. All commands output JSON or CSV for audit-ready evidence.
|
|
4
|
+
|
|
5
|
+
## GitHub
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Org settings
|
|
9
|
+
gh api orgs/{org} | jq '{name, two_factor_requirement_enabled, default_repository_permission, members_can_create_public_repositories}'
|
|
10
|
+
|
|
11
|
+
# Members with roles
|
|
12
|
+
gh api orgs/{org}/members --paginate | jq '.[] | {login, type, site_admin}'
|
|
13
|
+
|
|
14
|
+
# Org admins
|
|
15
|
+
gh api orgs/{org}/members?role=admin --paginate | jq '.[].login'
|
|
16
|
+
|
|
17
|
+
# Branch protection
|
|
18
|
+
gh api repos/{owner}/{repo}/branches/{branch}/protection
|
|
19
|
+
|
|
20
|
+
# Recent merged PRs
|
|
21
|
+
gh pr list --state merged --limit 50 --json number,title,author,reviewDecision,mergedAt,mergedBy
|
|
22
|
+
|
|
23
|
+
# Dependabot alerts (open)
|
|
24
|
+
gh api repos/{owner}/{repo}/dependabot/alerts?state=open
|
|
25
|
+
|
|
26
|
+
# Code scanning alerts
|
|
27
|
+
gh api repos/{owner}/{repo}/code-scanning/alerts --paginate
|
|
28
|
+
|
|
29
|
+
# Secret scanning alerts
|
|
30
|
+
gh api orgs/{org}/secret-scanning/alerts --paginate
|
|
31
|
+
|
|
32
|
+
# Audit log (enterprise/org)
|
|
33
|
+
gh api orgs/{org}/audit-log?per_page=100
|
|
34
|
+
|
|
35
|
+
# Repository list with visibility
|
|
36
|
+
gh repo list {org} --json name,visibility,isArchived --limit 100
|
|
37
|
+
|
|
38
|
+
# Team membership
|
|
39
|
+
gh api orgs/{org}/teams --paginate | jq '.[].slug'
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## GCP (Google Cloud)
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# IAM policy (who has access)
|
|
46
|
+
gcloud projects get-iam-policy {project} --format=json
|
|
47
|
+
|
|
48
|
+
# Service accounts
|
|
49
|
+
gcloud iam service-accounts list --format=json
|
|
50
|
+
|
|
51
|
+
# Service account keys (key rotation evidence)
|
|
52
|
+
gcloud iam service-accounts keys list --iam-account={sa_email} --format=json
|
|
53
|
+
|
|
54
|
+
# Compute instances (asset inventory)
|
|
55
|
+
gcloud compute instances list --format=json
|
|
56
|
+
|
|
57
|
+
# Firewall rules
|
|
58
|
+
gcloud compute firewall-rules list --format=json
|
|
59
|
+
|
|
60
|
+
# Cloud SQL instances
|
|
61
|
+
gcloud sql instances list --format=json
|
|
62
|
+
|
|
63
|
+
# Cloud SQL backups
|
|
64
|
+
gcloud sql backups list --instance={instance} --format=json
|
|
65
|
+
|
|
66
|
+
# Log sinks (centralization)
|
|
67
|
+
gcloud logging sinks list --format=json
|
|
68
|
+
|
|
69
|
+
# Audit config
|
|
70
|
+
gcloud projects get-iam-policy {project} --format=json | jq '.auditConfigs'
|
|
71
|
+
|
|
72
|
+
# Alerting policies
|
|
73
|
+
gcloud monitoring policies list --format=json
|
|
74
|
+
|
|
75
|
+
# Cloud KMS keys
|
|
76
|
+
gcloud kms keys list --location=global --keyring={keyring} --format=json
|
|
77
|
+
|
|
78
|
+
# VPC networks
|
|
79
|
+
gcloud compute networks list --format=json
|
|
80
|
+
|
|
81
|
+
# Cloud Storage buckets
|
|
82
|
+
gcloud storage ls --json
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Azure
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# Role assignments
|
|
89
|
+
az role assignment list --all --output json
|
|
90
|
+
|
|
91
|
+
# Users (Azure AD)
|
|
92
|
+
az ad user list --output json | jq '.[] | {displayName, userPrincipalName, accountEnabled}'
|
|
93
|
+
|
|
94
|
+
# Global admins (via MS Graph)
|
|
95
|
+
az rest --method GET \
|
|
96
|
+
--url "https://graph.microsoft.com/v1.0/directoryRoles/$(az rest --method GET --url 'https://graph.microsoft.com/v1.0/directoryRoles' --query "value[?displayName=='Global Administrator'].id" -o tsv)/members" \
|
|
97
|
+
--query "value[].{displayName:displayName,upn:userPrincipalName}" -o json
|
|
98
|
+
|
|
99
|
+
# Activity log
|
|
100
|
+
az monitor activity-log list --max-events 100 --output json
|
|
101
|
+
|
|
102
|
+
# Network security groups
|
|
103
|
+
az network nsg list --output json
|
|
104
|
+
|
|
105
|
+
# Storage account encryption
|
|
106
|
+
az storage account list --query "[].{name:name, encryption:encryption}" --output json
|
|
107
|
+
|
|
108
|
+
# Backup jobs
|
|
109
|
+
az backup job list --resource-group {rg} --vault-name {vault} --output json
|
|
110
|
+
|
|
111
|
+
# Key Vault access policies
|
|
112
|
+
az keyvault show --name {vault} --query "properties.accessPolicies" --output json
|
|
113
|
+
|
|
114
|
+
# Alert rules
|
|
115
|
+
az monitor alert list --output json
|
|
116
|
+
|
|
117
|
+
# Subscriptions (environment separation)
|
|
118
|
+
az account list --output json
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Google Workspace (GAM)
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# Users with MFA status
|
|
125
|
+
gam print users fields primaryEmail,name,isEnrolledIn2Sv,isEnforcedIn2Sv,lastLoginTime,creationTime,suspended
|
|
126
|
+
|
|
127
|
+
# Admin roles
|
|
128
|
+
gam print admins
|
|
129
|
+
|
|
130
|
+
# Mobile devices
|
|
131
|
+
gam print mobile fields email,deviceId,type,status,os
|
|
132
|
+
|
|
133
|
+
# Groups and membership
|
|
134
|
+
gam print groups fields email,name,directMembersCount
|
|
135
|
+
|
|
136
|
+
# OAuth tokens (third-party app access)
|
|
137
|
+
gam all users print tokens
|
|
138
|
+
|
|
139
|
+
# Login activity
|
|
140
|
+
gam report login user all start {date} end {date}
|
|
141
|
+
|
|
142
|
+
# Admin activity
|
|
143
|
+
gam report admin start {date} end {date}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## macOS Endpoint
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
# FileVault status
|
|
150
|
+
fdesetup status
|
|
151
|
+
|
|
152
|
+
# Hardware/software info
|
|
153
|
+
system_profiler SPHardwareDataType SPSoftwareDataType
|
|
154
|
+
|
|
155
|
+
# Configuration profiles (MDM policies)
|
|
156
|
+
profiles show -type configuration
|
|
157
|
+
|
|
158
|
+
# Firewall status
|
|
159
|
+
/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
|
|
160
|
+
|
|
161
|
+
# SIP (System Integrity Protection) status
|
|
162
|
+
csrutil status
|
|
163
|
+
|
|
164
|
+
# Gatekeeper status
|
|
165
|
+
spctl --status
|
|
166
|
+
|
|
167
|
+
# Software updates available
|
|
168
|
+
softwareupdate --list 2>&1
|
|
169
|
+
|
|
170
|
+
# Installed applications
|
|
171
|
+
system_profiler SPApplicationsDataType -json
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## General / Cross-Platform
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# TLS configuration check
|
|
178
|
+
openssl s_client -connect {host}:443 -tls1_2 < /dev/null 2>&1 | grep -E "Protocol|Cipher"
|
|
179
|
+
|
|
180
|
+
# DNS records (for domain ownership)
|
|
181
|
+
dig +short {domain} ANY
|
|
182
|
+
|
|
183
|
+
# SSL certificate details
|
|
184
|
+
echo | openssl s_client -connect {host}:443 2>/dev/null | openssl x509 -noout -dates -subject
|
|
185
|
+
|
|
186
|
+
# NTP sync status (Linux)
|
|
187
|
+
timedatectl status | grep -E "NTP|synchronized"
|
|
188
|
+
|
|
189
|
+
# NTP sync status (macOS)
|
|
190
|
+
sntp -d time.apple.com 2>&1 | head -5
|
|
191
|
+
```
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Evidence Types by Control Domain
|
|
2
|
+
|
|
3
|
+
Map of what evidence is expected for each control domain, with format requirements.
|
|
4
|
+
|
|
5
|
+
## Access Control Domain (A.5.15-A.5.18, A.8.2-A.8.5)
|
|
6
|
+
|
|
7
|
+
| Evidence | Format | Refresh | Controls |
|
|
8
|
+
|----------|--------|---------|----------|
|
|
9
|
+
| User access list (all systems) | JSON/CSV export from IdP | Quarterly | A.5.15, A.5.18 |
|
|
10
|
+
| Privileged user list | JSON export from IAM | Quarterly | A.8.2 |
|
|
11
|
+
| Access review records | Spreadsheet with reviewer decisions | Quarterly | A.5.15, A.5.18 |
|
|
12
|
+
| MFA enrollment report | CSV from IdP | Quarterly | A.5.17, A.8.5 |
|
|
13
|
+
| Terminated user access revocation | Cross-reference: HR list vs. active accounts | On termination | A.5.18 |
|
|
14
|
+
| Service account inventory | JSON from cloud IAM | Quarterly | A.5.16 |
|
|
15
|
+
| Access control policy | PDF/markdown (versioned) | Annual review | A.5.15 |
|
|
16
|
+
|
|
17
|
+
## Incident Response Domain (A.5.24-A.5.29, A.6.8)
|
|
18
|
+
|
|
19
|
+
| Evidence | Format | Refresh | Controls |
|
|
20
|
+
|----------|--------|---------|----------|
|
|
21
|
+
| Incident response plan | PDF/markdown (versioned) | Annual review | A.5.24 |
|
|
22
|
+
| Tabletop exercise records | Meeting notes with date, scenario, participants | Annual | A.5.24 |
|
|
23
|
+
| Incident log/register | Ticketing system export | Continuous | A.5.25, A.5.26 |
|
|
24
|
+
| Post-incident review reports | Document per incident | Per incident | A.5.27 |
|
|
25
|
+
| Incident communication records | Email/chat exports | Per incident | A.5.26 |
|
|
26
|
+
| Event reporting channel config | Screenshot of Slack channel / email alias | Annual | A.6.8 |
|
|
27
|
+
|
|
28
|
+
## Cryptographic Controls (A.8.24, A.8.10-A.8.12)
|
|
29
|
+
|
|
30
|
+
| Evidence | Format | Refresh | Controls |
|
|
31
|
+
|----------|--------|---------|----------|
|
|
32
|
+
| Encryption at rest configuration | JSON from cloud API | Quarterly | A.8.24 |
|
|
33
|
+
| TLS configuration scan | `openssl` output or SSL Labs report | Quarterly | A.8.24 |
|
|
34
|
+
| Key management policy | PDF/markdown | Annual | A.8.24 |
|
|
35
|
+
| Certificate inventory | Export from cert manager | Quarterly | A.8.24 |
|
|
36
|
+
| Data classification policy | PDF/markdown | Annual | A.8.10, A.8.12 |
|
|
37
|
+
| DLP tool configuration | Screenshot or config export | Annual | A.8.12 |
|
|
38
|
+
|
|
39
|
+
## Logging and Monitoring (A.8.15-A.8.17)
|
|
40
|
+
|
|
41
|
+
| Evidence | Format | Refresh | Controls |
|
|
42
|
+
|----------|--------|---------|----------|
|
|
43
|
+
| Audit log configuration | JSON from cloud API | Quarterly | A.8.15 |
|
|
44
|
+
| Log centralization (sink config) | JSON from cloud API | Quarterly | A.8.15 |
|
|
45
|
+
| Log retention settings | Screenshot or config export | Annual | A.8.15 |
|
|
46
|
+
| Alert configuration | JSON from monitoring tool | Quarterly | A.8.16 |
|
|
47
|
+
| Sample alert + response | Ticketing system export | Quarterly | A.8.16 |
|
|
48
|
+
| NTP sync evidence | CLI output from servers | Annual | A.8.17 |
|
|
49
|
+
|
|
50
|
+
## Change Management (A.8.25-A.8.34, A.8.9)
|
|
51
|
+
|
|
52
|
+
| Evidence | Format | Refresh | Controls |
|
|
53
|
+
|----------|--------|---------|----------|
|
|
54
|
+
| Change management policy | PDF/markdown | Annual | A.8.32 |
|
|
55
|
+
| Branch protection config | JSON from GitHub API | Quarterly | A.8.32 |
|
|
56
|
+
| Recent merged PRs with reviews | JSON from GitHub API | Quarterly | A.8.32 |
|
|
57
|
+
| CI/CD pipeline configuration | YAML file export | Quarterly | A.8.25 |
|
|
58
|
+
| Dependency scan results | JSON from Dependabot/Snyk | Monthly | A.8.8 |
|
|
59
|
+
| Code scanning results | JSON from CodeQL/SAST | Monthly | A.8.28 |
|
|
60
|
+
| Deployment history | JSON from deployment tool | Quarterly | A.8.32 |
|
|
61
|
+
| Configuration baseline | IaC files (Terraform, etc.) | On change | A.8.9 |
|
|
62
|
+
|
|
63
|
+
## Business Continuity (A.5.30, A.8.13-A.8.14)
|
|
64
|
+
|
|
65
|
+
| Evidence | Format | Refresh | Controls |
|
|
66
|
+
|----------|--------|---------|----------|
|
|
67
|
+
| Business continuity plan | PDF/markdown | Annual | A.5.30 |
|
|
68
|
+
| Business impact analysis | Spreadsheet with RTO/RPO | Annual | A.5.30 |
|
|
69
|
+
| DR test records | Document with date, results | Annual | A.5.30 |
|
|
70
|
+
| Backup configuration | JSON from cloud API | Quarterly | A.8.13 |
|
|
71
|
+
| Backup test/restore records | Document with restore time | Annual | A.8.13 |
|
|
72
|
+
| Redundancy architecture | Diagram + cloud resource export | Annual | A.8.14 |
|
|
73
|
+
|
|
74
|
+
## People Controls (A.6.1-A.6.8)
|
|
75
|
+
|
|
76
|
+
| Evidence | Format | Refresh | Controls |
|
|
77
|
+
|----------|--------|---------|----------|
|
|
78
|
+
| Background check records | HR system export (redacted) | Per hire | A.6.1 |
|
|
79
|
+
| Employment agreements | Signed documents (sample) | Per hire | A.6.2 |
|
|
80
|
+
| Training completion records | LMS export or spreadsheet | Annual | A.6.3 |
|
|
81
|
+
| Disciplinary policy | PDF/markdown (in handbook) | Annual | A.6.4 |
|
|
82
|
+
| Offboarding checklist records | HR system export | Per termination | A.6.5 |
|
|
83
|
+
| NDA/confidentiality agreements | Signed documents (sample) | Per hire/engagement | A.6.6 |
|
|
84
|
+
| Remote work policy | PDF/markdown | Annual | A.6.7 |
|
|
85
|
+
|
|
86
|
+
## Supplier Management (A.5.19-A.5.23)
|
|
87
|
+
|
|
88
|
+
| Evidence | Format | Refresh | Controls |
|
|
89
|
+
|----------|--------|---------|----------|
|
|
90
|
+
| Vendor inventory/register | Spreadsheet | Quarterly | A.5.19 |
|
|
91
|
+
| Vendor security assessments | Per-vendor questionnaire | Annual per vendor | A.5.22 |
|
|
92
|
+
| Vendor SOC 2 / ISO reports | PDF from vendor | Annual | A.5.22 |
|
|
93
|
+
| Vendor contracts (security clauses) | Signed agreements (sample) | Per engagement | A.5.20 |
|
|
94
|
+
| Vendor DPAs | Signed agreements | Per vendor handling PII | A.5.20 |
|
|
95
|
+
|
|
96
|
+
## ISMS Management (Clauses 4-10)
|
|
97
|
+
|
|
98
|
+
| Evidence | Format | Refresh | Controls |
|
|
99
|
+
|----------|--------|---------|----------|
|
|
100
|
+
| ISMS scope document | PDF/markdown | Annual | C.4.3 |
|
|
101
|
+
| Information security policy | Signed PDF | Annual | C.5.2 |
|
|
102
|
+
| Risk assessment | Spreadsheet/register | Annual | C.6.1.2, C.8.2 |
|
|
103
|
+
| Statement of Applicability | Spreadsheet | Annual | C.6.1.3 |
|
|
104
|
+
| Risk treatment plan | Document with status | Ongoing | C.6.1.3, C.8.3 |
|
|
105
|
+
| Management review minutes | Meeting notes | Annual minimum | C.9.3 |
|
|
106
|
+
| Internal audit report | Document with findings | Annual | C.9.2 |
|
|
107
|
+
| Corrective action log | Spreadsheet/tracker | Ongoing | C.10.2 |
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Screenshot Evidence Guide
|
|
2
|
+
|
|
3
|
+
When API exports are not available, screenshots are acceptable evidence — but they must meet specific requirements to be accepted by auditors.
|
|
4
|
+
|
|
5
|
+
## When to Use Screenshots
|
|
6
|
+
|
|
7
|
+
Screenshots are the evidence of LAST RESORT. Use them only when:
|
|
8
|
+
|
|
9
|
+
1. The system has no API or CLI export capability
|
|
10
|
+
2. You need to show a UI-specific configuration (e.g., portal settings page)
|
|
11
|
+
3. The API export doesn't capture what the auditor needs to see
|
|
12
|
+
4. You're documenting a process (step-by-step walkthrough)
|
|
13
|
+
|
|
14
|
+
**Always prefer API exports** — they're timestamped, machine-readable, and harder to forge.
|
|
15
|
+
|
|
16
|
+
## Requirements for Audit-Ready Screenshots
|
|
17
|
+
|
|
18
|
+
### Mandatory
|
|
19
|
+
- **System clock visible** — the macOS menu bar (top-right) or Windows taskbar (bottom-right) must show the current date and time
|
|
20
|
+
- **Full context** — show the complete page/panel, not a cropped section. Auditors need to verify WHAT system the screenshot is from
|
|
21
|
+
- **URL bar visible** — for web applications, the browser URL bar must be visible to confirm the system
|
|
22
|
+
- **User identity visible** — the logged-in user should be visible (top-right corner in most portals)
|
|
23
|
+
|
|
24
|
+
### Recommended
|
|
25
|
+
- **High resolution** — at least 1920x1080 to ensure text is readable
|
|
26
|
+
- **No annotations on the evidence copy** — annotated versions can be provided separately for reference
|
|
27
|
+
- **Dark mode off** — light backgrounds print more clearly for auditors who print evidence
|
|
28
|
+
|
|
29
|
+
## macOS Screenshot Commands
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# Full screen capture (includes menu bar with clock)
|
|
33
|
+
screencapture -x ~/evidence/{filename}.png
|
|
34
|
+
|
|
35
|
+
# Specific window capture (add -w flag, then click the window)
|
|
36
|
+
screencapture -xw ~/evidence/{filename}.png
|
|
37
|
+
|
|
38
|
+
# Timed capture (10 second delay — useful for capturing dropdown menus)
|
|
39
|
+
screencapture -xT 10 ~/evidence/{filename}.png
|
|
40
|
+
|
|
41
|
+
# Capture specific screen region (drag to select)
|
|
42
|
+
screencapture -xs ~/evidence/{filename}.png
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Tip**: The `-x` flag prevents the screenshot sound, which is less disruptive.
|
|
46
|
+
|
|
47
|
+
## Naming Convention
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
{control_id}_{system}_{description}_{YYYY-MM-DD}.png
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Examples:
|
|
54
|
+
- `A.5.17_google-workspace_mfa-enforcement_2026-02-28.png`
|
|
55
|
+
- `A.8.9_aws-console_security-group-config_2026-02-28.png`
|
|
56
|
+
- `A.8.32_github_branch-protection-settings_2026-02-28.png`
|
|
57
|
+
|
|
58
|
+
## Common Screenshot Evidence
|
|
59
|
+
|
|
60
|
+
| Control | What to Screenshot | System |
|
|
61
|
+
|---------|-------------------|--------|
|
|
62
|
+
| A.5.17 | MFA enforcement settings | Google Workspace Admin / Azure AD |
|
|
63
|
+
| A.8.5 | Password policy configuration | IdP settings page |
|
|
64
|
+
| A.8.9 | Security group / firewall rules | Cloud console (when CLI unavailable) |
|
|
65
|
+
| A.8.15 | Log retention settings | CloudWatch / Stackdriver / Azure Monitor |
|
|
66
|
+
| A.8.24 | Encryption at rest configuration | Database / storage settings |
|
|
67
|
+
| A.8.32 | Branch protection rules | GitHub repository settings |
|
|
68
|
+
|
|
69
|
+
## Rejection Reasons
|
|
70
|
+
|
|
71
|
+
Auditors commonly reject screenshots for:
|
|
72
|
+
|
|
73
|
+
1. **No timestamp** — "When was this taken?" → Include system clock
|
|
74
|
+
2. **Cropped too tightly** — "What system is this from?" → Show URL bar and surrounding context
|
|
75
|
+
3. **Edited or annotated** — "Is this authentic?" → Provide clean + annotated versions separately
|
|
76
|
+
4. **Wrong environment** — "Is this production?" → URL should show production hostname
|
|
77
|
+
5. **Stale** — "This is from 6 months ago" → Re-capture within the audit window
|