Richtlinien-Update: 316 Anforderungen/45 Controls + Schutzbedarf-/TISAX-Schalter
Delta-Update des VDA-ISA-2027-Vorlagenpakets eingepflegt: - Aktualisiertes Seed-Paket (ersetzt bisherigen Stand): 316 Anforderungen (122 MUSS · 132 SOLL · 43 HOCH · 19 SEHR HOCH) über 45 Controls; VA-01/VA-05 jetzt enthalten (13 Verfahren vollständig). Beschädigte RACI-Tokens (VA-05/08/09/ 10/12/13) repariert. Importer: Umsetzungstext aus den .md-IMPL-Ankern extrahiert (mapping.json führt ihn nicht mehr), neue Obligation-Typen HOCH/SEHR HOCH. - Neue Schutzbedarf-Flags (variables.schema): FLAG_HIGH_PROTECTION, FLAG_VERY_HIGH_PROTECTION, FLAG_ELEVATED_PROTECTION (abgeleitet). Render-Helper applyProtection: HIGH stets an, VERY_HIGH aus Global/Override, ELEVATED = HIGH||VH (nie manuell) — angewandt in Lese-, Bearbeiten-, Handbuch- und Coverage-Rendering. - TISAX-Level-Schalter (AL2/AL3) zentral auf der Bibliothek (setGlobalTisaxLevel); AL2 = MUSS/SOLL/HOCH, AL3 = zusätzlich SEHR HOCH. Override je Richtlinie im Bearbeitungsmodus (setProtectionOverride, Feld protection_override); effektiver Wert = Dokument-Override sonst global. - KPIs zeigen 316 Anforderungen mit Aufschlüsselung; Coverage/Badges für HOCH/SEHR HOCH; Control-Titel-Fallback. Verifiziert: Import 316/45; Rendering rückstandsfrei über AL2/AL3 × Flag-Kombis; Override R04→AL3 zeigt SEHR-HOCH-Inhalt, R02 (global AL2) nicht; global bleibt AL2. Architektur-Hinweis: applyProtection kapselt das Level→Flags-Mapping, sodass die globale Ebene später ohne Umbau zur TISAX-AL2/AL3-Auswahl wird (bereits so gebaut). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -2,29 +2,35 @@
|
||||
import json, collections, os
|
||||
BASE=os.path.dirname(__file__)
|
||||
d=json.load(open(os.path.join(BASE,"mapping.json"),encoding="utf-8"))
|
||||
POLTITLE={"L00":"Informationssicherheitsleitlinie","R01":"ISMS-Organisation und Rollen","R02":"Asset- und Klassifizierung","R03":"Risikomanagement und Audit","R04":"Incident, Notfall und Kontinuitaet","R05":"Personalsicherheit und Awareness","R06":"Mobiles Arbeiten und mobile Geraete","R07":"Physische Sicherheit","R08":"Identitaets- und Zugriffsmanagement","R09":"Kryptografie und Uebertragung","R10":"Betriebssicherheit","R11":"Sichere Beschaffung und Entwicklung","R12":"Cloud-, KI- und externe IT-Dienste","R13":"Lieferanten- und Dienstleistersteuerung","R14":"Compliance und Datenschutz"}
|
||||
POLTITLE={"L00":"Informationssicherheitsleitlinie","R01":"ISMS-Organisation und Rollen","R02":"Asset- und Klassifizierung","R03":"Risikomanagement und Audit","R04":"Incident, Notfall und Kontinuität","R05":"Personalsicherheit und Awareness","R06":"Mobiles Arbeiten und mobile Geräte","R07":"Physische Sicherheit","R08":"Identitäts- und Zugriffsmanagement","R09":"Kryptografie und Übertragung","R10":"Betriebssicherheit","R11":"Sichere Beschaffung und Entwicklung","R12":"Cloud-, KI- und externe IT-Dienste","R13":"Lieferanten- und Dienstleistersteuerung","R14":"Compliance und Datenschutz"}
|
||||
by=collections.OrderedDict()
|
||||
for a in d["anforderungen"]:
|
||||
by.setdefault(a["control"],[]).append(a)
|
||||
def cnt(items,t): return sum(1 for x in items if x["type"]==t)
|
||||
L=[]
|
||||
L.append("# ISA-Mapping-Matrix - VDA ISA 2027 (Information Security)\n")
|
||||
L.append("Zentrale Zuordnung: **ISA-Control -> Richtlinie -> einzelne Anforderungen (MUSS/SOLL)**. Ersetzt den frueheren Abschnitt 'Bezug zu VDA ISA' in den einzelnen Richtlinien. Das Tool verlinkt von jeder Anforderung (Hidden-Anker, siehe `mapping.json`) auf diese Matrix und auf das Nachweisregister ({{LINK:NACHWEISREGISTER}}).\n")
|
||||
L.append("| ISA | Richtlinie | MUSS | SOLL | Anforderungs-IDs |")
|
||||
L.append("|-----|-----------|------|------|------------------|")
|
||||
L.append("Zentrale Zuordnung **ISA-Control -> Richtlinie -> Einzelanforderungen** über alle Schutzbedarf-Ebenen (MUSS/SOLL/HOCH/SEHR HOCH). Anforderungen 1:1 aus der ISA übernommen; Kopplung über `mapping.json` und Hidden-Anker. Verweise: {{LINK:NACHWEISREGISTER}}, {{LINK:BASELINE}}.\n")
|
||||
L.append("| ISA | Richtlinie | MUSS | SOLL | HOCH | SEHR HOCH | Verfahren |")
|
||||
L.append("|-----|-----------|------|------|------|-----------|-----------|")
|
||||
va_by_ctrl=collections.defaultdict(set)
|
||||
for v in d.get("verfahren",[]):
|
||||
for f in v["fulfills"]:
|
||||
ctrl=f.rsplit("-",1)[0]
|
||||
va_by_ctrl[ctrl].add(v["id"])
|
||||
for ctrl,items in by.items():
|
||||
pol=items[0]["policy"]
|
||||
m=sum(1 for x in items if x["type"]=="MUSS"); s=len(items)-m
|
||||
ids=", ".join(x["id"].split("-",1)[1] for x in items)
|
||||
L.append(f"| {ctrl} | {{{{LINK:{pol}}}}} {POLTITLE.get(pol,pol)} | {m} | {s} | {ids} |")
|
||||
cnt=collections.Counter(a["type"] for a in d["anforderungen"])
|
||||
L.append(f"\n**Summe:** {len(d['anforderungen'])} Anforderungen (MUSS {cnt['MUSS']}, SOLL {cnt['SOLL']}) ueber {len(by)} Controls und {len(set(a['policy'] for a in d['anforderungen']))} Dokumente.\n")
|
||||
L.append("> Hinweis zu 3.1.2: In der ISA 2027 als 'Superseded by 1.6.3, 5.2.8 und 5.2.9' entfallen - abgedeckt ueber {{LINK:R04}} und {{LINK:R10}}.\n")
|
||||
va=", ".join(sorted(va_by_ctrl.get(ctrl,[]))) or "-"
|
||||
L.append(f"| {ctrl} | {{{{LINK:{pol}}}}} {POLTITLE.get(pol,pol)} | {cnt(items,'MUSS')} | {cnt(items,'SOLL')} | {cnt(items,'HOCH')} | {cnt(items,'SEHR HOCH')} | {va} |")
|
||||
tot=collections.Counter(a["type"] for a in d["anforderungen"])
|
||||
isa=sum(1 for a in d["anforderungen"] if a.get("is_isa"))
|
||||
cust=sum(1 for a in d["anforderungen"] if not a.get("is_isa"))
|
||||
L.append(f"\n**Summe:** {len(d['anforderungen'])} Anforderungen (MUSS {tot['MUSS']}, SOLL {tot['SOLL']}, HOCH {tot['HOCH']}, SEHR HOCH {tot['SEHR HOCH']}) — davon {isa} 1:1 aus VDA ISA und {cust} kundenspezifische Ergänzung (KI). Controls: {len(by)}.\n")
|
||||
L.append("> 3.1.2 in ISA 2027 als 'Superseded by 1.6.3, 5.2.8 und 5.2.9' entfallen - abgedeckt über {{LINK:R04}} und {{LINK:R10}}.\n")
|
||||
L.append("## Detailzuordnung je Anforderung\n")
|
||||
L.append("| ID | Typ | Richtlinie | Anforderung (Kurz) | Bedingung |")
|
||||
L.append("|----|-----|-----------|--------------------|-----------|")
|
||||
L.append("| ID | Ebene | Richtlinie | Anforderung (Kurz) | Bedingung |")
|
||||
L.append("|----|-------|-----------|--------------------|-----------|")
|
||||
for a in d["anforderungen"]:
|
||||
req=a["requirement"].replace("|","/")
|
||||
req=(req[:80]+"...") if len(req)>80 else req
|
||||
req=a["requirement"].replace("|","/"); req=(req[:90]+"...") if len(req)>90 else req
|
||||
L.append(f"| {a['id']} | {a['type']} | {a['policy']} | {req} | {a['condition'] or '-'} |")
|
||||
open(os.path.join(BASE,"ISA-Mapping-Matrix.md"),"w",encoding="utf-8").write("\n".join(L))
|
||||
print("Matrix ok, Controls:",len(by),"Anforderungen:",len(d["anforderungen"]))
|
||||
print("Matrix ok. Anforderungen:",len(d["anforderungen"]),"Controls:",len(by))
|
||||
|
||||
Reference in New Issue
Block a user