7 Urgent Steps for ISO 27001:2022 Transition
Context: With the October 31, 2025 transition deadline just days away, this ISO 27001:2022 transition remediation playbook focuses on fast, defensible action: triage the biggest pentest and control gaps, implement Annex A fixes, and generate audit-ready evidence your external auditor can trust.
Use this if you need to:
- Turn recent pentest findings into pass/fail-proof control changes.
- Produce screenshots, logs, change tickets, and config diffs—in 72 hours.
- Map everything to Annex A controls and your Statement of Applicability (SoA).
- Close the loop with a focused retest and a clean evidence trail.

⚠️ New guide: Don’t fall for the $30k “unlock code” trick. Read our full breakdown of the crypto smart contract unlock scam—how it works and the exact red flags to look for.
For deeper help after reading, see our ISO 27001 Risk Assessment Services and ISO 27001 Remediation Services.
The 72-Hour “Evidence Sprint” for ISO 27001:2022 Transition (Day 0–3)
Goal: For every fix, you’ll capture what changed and proof it’s enforced.
- Create an Evidence Vault (timestamped):
- Tickets: change request, CAB approvals, assignees, due dates.
- Configs: “before & after” diffs, PRs/commits, Ansible/Terraform runs.
- Logs: authentication, admin actions, IDS/WAF blocks, rotation events.
- Screenshots: admin UI settings, SoA updates, asset inventory view.
- Retest artifacts: short pentest/scan report referencing the fix.
Deliverable: A zip for each control:
A.<section>-<control>-<short_name>-YYYYMMDD.zipplaced in/evidence/ISO27001-2025/.
Starter script (Bash) to build the Evidence Vault):
#!/usr/bin/env bash
set -euo pipefail
TS=$(date +"%Y%m%d-%H%M%S")
ROOT="/evidence/ISO27001-2025/$TS"
mkdir -p "$ROOT"/{tickets,configs_before,configs_after,logs,screenshots,retest}
# Example ticket export (Jira Cloud) – replace JQL & auth
curl -s -H "Authorization: Bearer $JIRA_TOKEN" \
"https://your-domain.atlassian.net/rest/api/3/search?jql=project=ISO AND status=Done AND updated >= -3d" \
| jq '.' > "$ROOT/tickets/jira_export.json"
# Gather config snapshots
cp /etc/ssh/sshd_config "$ROOT/configs_after/sshd_config.after"
git show HEAD~1:/etc/ssh/sshd_config > "$ROOT/configs_before/sshd_config.before" || true
diff -u "$ROOT/configs_before/sshd_config.before" "$ROOT/configs_after/sshd_config.after" \
> "$ROOT/configs_after/sshd_config.diff" || true
# Logs (last 72h)
journalctl --since "72 hours ago" > "$ROOT/logs/systemd-72h.log"
grep -Ei "auth|sudo|pam|mfa|vpn" /var/log/auth.log | tail -n 2000 > "$ROOT/logs/auth-mfa.log"
# Package per-control (example for A.8.3 Secure Authentication)
tar -czf "/evidence/ISO27001-2025/A.8.3-secure-auth-$TS.tgz" -C "$ROOT" .
echo "Evidence packs ready in /evidence/ISO27001-2025"
Evidence naming tip: Match each zip to a SoA line so auditors can cross-reference instantly.
Triage: Prioritize High-Risk Gaps (Today)
Focus on the controls that most often create audit findings and real attacks:
- Risk Assessment (ISMS core) → ensure risk register, methodology, and SoA mapping are current.
- Asset Inventory & Ownership → make internet-facing & privileged-access assets crystal-clear.
- Access Control & MFA → enforce admin MFA and least privilege—now.
- Supplier Oversight → contracts + security clauses, plus evidence of monitoring.
If you want structured help to prioritize and assign owners with due dates, our Risk Assessment Services page shows how we turn this into a concrete plan.
Quick Wins You Can Ship Before Friday
1) Enforce MFA on Admin Access (A.8.3)
AWS IAM policy snippet denying risky actions unless MFA is present:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "DenyWithoutMFA",
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "false" } }
}]
}
Azure AD (Entra) conditional access outline (PowerShell):
# Requires Microsoft.Graph module and admin consent
Connect-MgGraph -Scopes "Policy.ReadWrite.ConditionalAccess","Directory.Read.All"
# Example: create a policy requiring MFA for Directory Roles (Admins)
# Pseudocode: use New-MgIdentityConditionalAccessPolicy with conditions
# IncludeRoles: "Global Administrator","Privileged Role Administrator"
# GrantControls: BuiltInControls "mfa"
Linux SSH hardening (/etc/ssh/sshd_config):
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
MaxAuthTries 3
AuthenticationMethods publickey,keyboard-interactive:pam
Restart SSH and capture a screenshot of the setting + the
systemctl status sshoutput for the evidence pack.
2) Lock Down Public Endpoints (A.8.20 / A.8.21)
Nginx allow-list for admin paths:
location /admin {
allow 10.8.0.0/24; # VPN CIDR
deny all;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
Security Group lockdown (AWS CLI example):
# Replace with your SG and VPN CIDR; close 22/3389 to public, restrict to VPN
aws ec2 revoke-security-group-ingress --group-id sg-123 --protocol tcp --port 22 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-id sg-123 --protocol tcp --port 22 --cidr 10.8.0.0/24
Quick validation script (nmap sweep):
#!/usr/bin/env bash
INPUT="assets_public.txt" # list of IPs/hosts
while read -r host; do
nmap -Pn -p 22,80,443,3389,5432,27017 --script=banner "$host" -oN "nmap-$host.txt"
done < "$INPUT"
3) Rotate Exposed or Stale Secrets (A.8.32)
GitHub Actions (nightly secret rotation – outline):
name: rotate-secrets
on:
schedule:
- cron: "0 2 * * *"
jobs:
rotate:
runs-on: ubuntu-latest
steps:
- name: Generate new token
run: ./scripts/rotate_token.sh > new_token.txt
- name: Set repo secret
run: gh secret set APP_TOKEN < new_token.txt
AWS Secrets Manager rotation hook (Python template):
# Lambda handler skeleton for rotating a DB password
def rotate_secret(event, context):
step = event["Step"]
if step == "createSecret":
# generate, store, and tag version as AWSPENDING
pass
elif step == "setSecret":
# apply pending secret to target DB
pass
elif step == "testSecret":
# attempt DB auth; raise on failure
pass
elif step == "finishSecret":
# promote AWSPENDING -> AWSCURRENT
pass
Evidence: ticket + commit showing rotation, screenshot of the new secret’s last rotated timestamp, and DB login test logs.
Validate Fixes with a Focused Retest (Today +2)
Run a small, targeted retest against the exact controls you changed. For a quick check on your public surface, use our Free Website Vulnerability Scanner to validate headers, TLS, and common exposures—then attach a screenshot of the summary and top findings to your evidence pack. (Link on your site’s navigation as “Run free website security check”.)
What to screenshot from the tool:
- Scan summary with target URL and timestamp
- Overall risk level and count of issues
- Top 5 findings with “how to fix”

Map Fixes to Annex A Controls (and Your SoA)
Use this evidence matrix to link requirement → fix → artifact:
| Annex A (2022) | Requirement (short) | Fix implemented | Artifact(s) | Owner | Date |
|---|---|---|---|---|---|
| A.5 Organizational | Supplier security in contracts | Added security clauses + right-to-audit | Contract_v3.pdf, ticket #ISO-127 | Legal | 2025-10-27 |
| A.6 People | Admin training | Role-based access training for new admins | LMS-Report-Oct.pdf, 8 completions | HR | 2025-10-27 |
| A.7 Physical | Server room access | Updated badge rules + quarterly review | Access-List.csv, screenshot | IT | 2025-10-26 |
| A.8 Technological | MFA for admin | Conditional Access + IAM deny-without-MFA | Policy JSON, CA screenshot, logs | SecOps | 2025-10-26 |
Auto-create the matrix CSV (Python):
import csv, datetime
rows = [
["A.5", "Supplier security in contracts", "Added security clauses + right-to-audit",
"Contract_v3.pdf; ticket ISO-127", "Legal", "2025-10-27"],
["A.6", "Admin training", "Role-based admin training in LMS",
"LMS-Report-Oct.pdf; screenshot", "HR", "2025-10-27"],
["A.7", "Server room access", "Badge rule updated; quarterly review",
"Access-List.csv; door-log.png", "IT", "2025-10-26"],
["A.8", "MFA for admin", "CA policy + IAM deny-without-MFA",
"policy.json; CA.png; cloudtrail.log", "SecOps", "2025-10-26"]
]
with open("iso27001-evidence-matrix.csv","w",newline="") as f:
writer = csv.writer(f)
writer.writerow(["Annex A (2022)","Requirement (short)","Fix implemented","Artifact(s)","Owner","Date"])
writer.writerows(rows)
print("Wrote iso27001-evidence-matrix.csv")
Close the Loop: Escalate Remaining Items into an ISO-Aligned Backlog
Not everything ships in a week. Push the rest into a time-boxed backlog mapped to ISO 27001 categories and your roadmap.
Sample Jira task (JSON) you can import via API):
{
"fields": {
"project": { "key": "ISO" },
"summary": "A.8.23: Web app hardening (WAF + headers + rate limits)",
"description": "Implement WAF ruleset + strict security headers; attach retest evidence.",
"issuetype": { "name": "Task" },
"labels": ["ISO27001-2022","AnnexA-A8","remediation"],
"duedate": "2025-11-15",
"assignee": { "name": "secops.lead" },
"customfield_soa": "A.8.23"
}
}
Backlog buckets to use right now:
- A.5 Organizational – policies, supplier agreements, roles & responsibilities
- A.6 People – awareness, onboarding, admin training
- A.7 Physical – access control, visitor management
- A.8 Technological – hardening, network security, identity, logging, backup
When you need hands-on help implementing and producing audit-proof artifacts, our ISO 27001 Remediation Services team steps in and drives the fixes with you.
Real-Time Fix Patterns (Copy/Paste)
Access Control: enumerate and clean local admins (Windows)
Get-LocalGroupMember -Group "Administrators" |
Where-Object {$_.ObjectClass -eq "User"} |
Select-Object Name, PrincipalSource |
Tee-Object -FilePath ".\admins-before.csv"
# Remove unexpected accounts
"corp\temp.admin","corp\legacy.svc" | ForEach-Object { Remove-LocalGroupMember Administrators $_ -ErrorAction SilentlyContinue }
Get-LocalGroupMember Administrators |
Select-Object Name, PrincipalSource |
Export-Csv ".\admins-after.csv" -NoTypeInformation
Logging: enable Linux auditd rules for admin actions
apt-get update && apt-get install -y auditd
cat <<'AUD' >/etc/audit/rules.d/admin.rules
-w /etc/sudoers -p wa -k sudoers
-w /etc/ssh/sshd_config -p wa -k sshd_config
-a always,exit -F arch=b64 -S execve -C uid!=euid -k suid_exec
AUD
augenrules --load && systemctl restart auditd
Web hardening: strict headers (Nginx)
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header Referrer-Policy "no-referrer" always;
add_header Permissions-Policy "geolocation=(), camera=()" always;
add_header Content-Security-Policy "default-src 'self'; frame-ancestors 'none'; object-src 'none';" always;
Backups: prove restorability (scripted test)
# Example: nightly DB dump + restore test in staging namespace
pg_dump "$PROD_DSN" > /backups/prod-$(date +%F).sql
createdb test_restore_$(date +%s)
psql test_restore_* < /backups/prod-$(date +%F).sql
echo "Restore test OK on $(date)" >> /evidence/backup-restore.log
Sample report from the tool to check Websiite Vulnerability

Internal Links You’ll Want Handy
- ISO 27001 Risk Assessment Services – formalize risk, SoA, and a prioritized plan.
- ISO 27001 Remediation Services – implement fixes and produce audit-ready artifacts.
- Recent how-to posts you can share with stakeholders while you work:
- ASVS 5.0 Remediation: 12 Battle-Tested Fixes (tech-heavy patterns you can reuse).
- PCI DSS 4.0: Your Post-March 31 Remediation Plan (great template for sprint planning).
Call to Action
If you want us to take the wheel for the final week, we can co-drive your sprint, produce the evidence packets, and sit with you through auditor Q&A.
- Start here: ISO 27001 Risk Assessment Services → prioritize and plot the sprint.
- Then: ISO 27001 Remediation Services → implement, evidence, retest.
- Or message us directly: [email protected].
🔐 Frequently Asked Questions (FAQs)
Find answers to commonly asked questions about ISO 27001:2022 Transition (Final-Week Edition).