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:
2026-07-08 11:23:07 +02:00
co-authored by Claude Opus 4.8
parent 222046a362
commit eab16c861d
35 changed files with 6169 additions and 1404 deletions
+173
View File
@@ -0,0 +1,173 @@
# -*- coding: utf-8 -*-
"""Generator v3: Richtlinien R01-R14 mit VOLLSTAENDIGEN ISA-Anforderungen
(must/should/high/vhigh, 1:1), Schutzbedarf-Flags, gebuendelte Umsetzung, Mapping, Matrix."""
import os, json, importlib.util, collections
BASE=os.path.dirname(__file__)
RDIR=os.path.join(BASE,"richtlinien")
spec=importlib.util.spec_from_file_location("isa_de", os.path.join(BASE,"_isa_de.py"))
m=importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
DATA=m.DATA; CUSTOM=m.CUSTOM
POLICY_META={
"R01":dict(title="ISMS-Organisation und Rollen", owner="{{ROLE_ISB}}",
purpose="Diese Richtlinie regelt Aufbau, Steuerung und Verantwortlichkeiten des ISMS der {{ORG_NAME}} sowie die Berücksichtigung der Informationssicherheit in Projekten.",
roles=[("{{ROLE_MANAGEMENT}}","Beauftragung, Gesamtverantwortung, Managementbewertung"),("{{ROLE_ISB}}","Operative Steuerung des ISMS"),("{{ROLE_IT_LEAD}}","Technische Umsetzung")], related=["L00","R03","R13"]),
"R02":dict(title="Asset- und Klassifizierungsrichtlinie", owner="{{ROLE_IT_LEAD}}",
purpose="Diese Richtlinie regelt Identifikation, Klassifizierung und geschützten Umgang mit Informationswerten sowie die Zulassung von Hard- und Software.",
roles=[("{{ROLE_IT_LEAD}}","Asset-Inventar, Zulassung Hard-/Software"),("{{ROLE_ISB}}","Klassifizierungsschema"),("Asset Owner","Pflege einzelner Assets")], related=["R01","R08","R11"]),
"R03":dict(title="Risikomanagement- und Auditrichtlinie", owner="{{ROLE_ISB}}",
purpose="Diese Richtlinie regelt Identifikation, Bewertung und Behandlung von Informationssicherheitsrisiken sowie interne und unabhängige Überprüfungen.",
roles=[("{{ROLE_ISB}}","Risikomanagement, Audits"),("{{ROLE_MANAGEMENT}}","Risikoakzeptanz")], related=["R01","R04"]),
"R04":dict(title="Incident-, Notfall- und Kontinuitätsrichtlinie", owner="{{ROLE_ISB}}",
purpose="Diese Richtlinie regelt Meldung und Behandlung von Sicherheitsereignissen, Krisenmanagement sowie Notfall- und Kontinuitätsplanung.",
roles=[("{{ROLE_ISB}}","Vorfallskoordination"),("{{ROLE_IT_LEAD}}","Notfall-/Wiederanlaufplanung"),("{{ROLE_MANAGEMENT}}","Krisenstab")], related=["R03","R10"]),
"R05":dict(title="Personalsicherheit und Awareness", owner="{{ROLE_HR_LEAD}}",
purpose="Diese Richtlinie regelt Eignung, vertragliche Verpflichtung sowie Schulung und Sensibilisierung des Personals.",
roles=[("{{ROLE_HR_LEAD}}","Verpflichtung, Eignung"),("{{ROLE_ISB}}","Awareness/Schulung")], related=["R01","R06"]),
"R06":dict(title="Mobiles Arbeiten und mobile Geräte", owner="{{ROLE_ISB}}",
purpose="Diese Richtlinie regelt mobiles Arbeiten sowie den Umgang mit mobilen IT-Geräten und Datenträgern.",
roles=[("{{ROLE_ISB}}","Sicherheitsanforderungen"),("{{ROLE_IT_LEAD}}","Technische Umsetzung")], related=["R05","R07","R08"]),
"R07":dict(title="Physische Sicherheit", owner="{{ROLE_IT_LEAD}}",
purpose="Diese Richtlinie regelt physischen Schutz durch Sicherheitszonen, Zutrittsschutz und den Umgang mit unterstützenden Betriebsmitteln.",
roles=[("{{ROLE_IT_LEAD}}","Zonen, Zutritt, Betriebsmittel"),("{{ROLE_ISB}}","Vorgaben")], related=["R02","R06"]),
"R08":dict(title="Identitäts- und Zugriffsmanagement", owner="{{ROLE_IT_LEAD}}",
purpose="Diese Richtlinie regelt Identifikationsmittel, sichere Anmeldung, Kontenverwaltung sowie Vergabe und Kontrolle von Zugriffsrechten.",
roles=[("{{ROLE_IT_LEAD}}","Technische Umsetzung IAM"),("Fachbereiche","Freigabe von Berechtigungen"),("{{ROLE_ISB}}","Überwachung")], related=["R02","R05","R10"]),
"R09":dict(title="Kryptografie- und Übertragungsrichtlinie", owner="{{ROLE_IT_LEAD}}",
purpose="Diese Richtlinie regelt kryptografische Verfahren, Schlüsselverwaltung und Schutz bei der Informationsübertragung.",
roles=[("{{ROLE_IT_LEAD}}","Verfahren/Schlüssel"),("{{ROLE_ISB}}","Zulässige Algorithmen")], related=["R08","R10","R12"]),
"R10":dict(title="Betriebssicherheit", owner="{{ROLE_IT_LEAD}}",
purpose="Diese Richtlinie regelt den sicheren IT-Betrieb: Change, Umgebungstrennung, Malware-Schutz, Protokollierung, Schwachstellen, technische Prüfung, Netzwerksicherheit sowie Datensicherung.",
roles=[("{{ROLE_IT_LEAD}}","Sicherer IT-Betrieb"),("{{ROLE_ISB}}","Überwachung")], related=["R04","R08","R11"]),
"R11":dict(title="Sichere Systembeschaffung und Entwicklung", owner="{{ROLE_IT_LEAD}}",
purpose="Diese Richtlinie regelt Informationssicherheit bei Beschaffung und Entwicklung, Anforderungen an Netzdienste sowie Rückgabe und sichere Löschung.",
roles=[("{{ROLE_IT_LEAD}}","Beschaffung/Entwicklung"),("{{ROLE_ISB}}","Sicherheitsanforderungen")], related=["R02","R10","R12"]),
"R12":dict(title="Cloud-, KI- und externe IT-Dienste", owner="{{ROLE_ISB}}",
purpose="Diese Richtlinie regelt den Schutz in ausgelagerten/geteilten externen IT-Diensten (Cloud) sowie beim Einsatz von KI-/GenAI-Diensten.",
roles=[("{{ROLE_ISB}}","Freigabe/Steuerung"),("{{ROLE_IT_LEAD}}","Technische Absicherung"),("Fachbereiche","Nutzung freigegebener Dienste")], related=["R09","R11","R13"]),
"R13":dict(title="Lieferanten- und Dienstleistersteuerung", owner="{{ROLE_ISB}}",
purpose="Diese Richtlinie regelt Sicherstellung der Informationssicherheit bei Lieferanten, Vertraulichkeitsvereinbarungen und Abgrenzung der Verantwortlichkeiten.",
roles=[("{{ROLE_ISB}}","Lieferantensteuerung"),("Einkauf","Vertragliche Einbindung")], related=["R01","R12"]),
"R14":dict(title="Compliance und Datenschutz", owner="{{ROLE_ISB}}",
purpose="Diese Richtlinie regelt die Einhaltung regulatorischer/vertraglicher Vorgaben sowie den Schutz personenbezogener Daten.",
roles=[("{{ROLE_ISB}}","Compliance-Register"),("{{ROLE_DPO}}","Datenschutz")], related=["L00","R03"]),
}
TAG={"must":"[MUSS]","should":"[SOLL]","high":"[HOCH]","vhigh":"[SEHR HOCH]"}
LETTER={"must":"M","should":"S","high":"H","vhigh":"V"}
COND={"must":None,"should":"FLAG_INCLUDE_SHOULD","high":"FLAG_HIGH_PROTECTION","vhigh":"FLAG_VERY_HIGH_PROTECTION"}
# Reihenfolge der Controls je Policy aus DATA-Insertionsreihenfolge (L00 raus, CUSTOM ans Ende der jeweiligen Policy)
order_by_pol=collections.OrderedDict()
for ctrl,d in DATA.items():
if d["policy"]=="L00": continue
order_by_pol.setdefault(d["policy"],[]).append((ctrl,d,True))
for ctrl,d in CUSTOM.items():
order_by_pol.setdefault(d["policy"],[]).append((ctrl,d,False))
mapping={"meta":{"paket":"ISMS-Vorlagenpaket v2","standard":"VDA ISA 2027 (Information Security)",
"hinweis":"Anforderungen 1:1 aus ISA; Umsetzung gebuendelt je Control. is_isa=false = kundenspezifische Ergaenzung (z.B. KI)."},
"anforderungen":[]}
def render_reqs(ctrl, d):
"""liefert (anforderung_block, impl_block, mapping_entries)"""
entries=[]; lines_req=[];
for lvl in ["must","should","high","vhigh"]:
items=d.get(lvl,[]) or []
cnt=0
for text in items:
cnt+=1
rid=f"{ctrl}-{LETTER[lvl]}{cnt}"
block=f"<!-- REQ {rid} -->\n- **{TAG[lvl]}** {text}"
if COND[lvl]:
block=f"{{{{#if {COND[lvl]}}}}}\n{block}\n{{{{/if}}}}"
lines_req.append(block)
has_elev=bool(d.get("impl_elev"))
impl_anchor = f"IMPL {ctrl}-elev" if (lvl in ("high","vhigh") and has_elev) else f"IMPL {ctrl}"
entries.append({"id":rid,"policy":d["policy"],"control":ctrl,"level":lvl,
"type":{"must":"MUSS","should":"SOLL","high":"HOCH","vhigh":"SEHR HOCH"}[lvl],
"is_isa": ctrl in DATA,
"req_anchor":f"REQ {rid}","impl_anchor":impl_anchor,"condition":COND[lvl],
"requirement":text,
"link":f"{{{{LINK:{d['policy']}#{ctrl}}}}}","nachweis_link":"{{LINK:NACHWEISREGISTER}}"})
# Umsetzung
impl=[f"<!-- IMPL {ctrl} -->\n{d['impl']}"]
if d.get("impl_elev"):
impl.append(f"{{{{#if FLAG_ELEVATED_PROTECTION}}}}\n<!-- IMPL {ctrl}-elev -->\n{d['impl_elev']}\n{{{{/if}}}}")
return "\n".join(lines_req), "\n\n".join(impl), entries
META_HEAD="""# Richtlinie {title}
| Dokumenteninformation | Wert |
|-----------------------|------|
| Dokumententyp | Richtlinie |
| Geltungsbereich | {{{{ISMS_SCOPE}}}} |
| Organisation | {{{{ORG_NAME}}}} |
| Verantwortlich | {owner} |
| Freigabe durch | {{{{ROLE_MANAGEMENT}}}} |
| Version | {{{{DOC_VERSION}}}} |
| Datum | {{{{DOC_DATE}}}} |
| Status | {{{{DOC_STATUS}}}} |
"""
FN={"R01":"R01_ISMS-Organisation-und-Rollen","R02":"R02_Asset-und-Klassifizierungsrichtlinie",
"R03":"R03_Risikomanagement-und-Auditrichtlinie","R04":"R04_Incident-Notfall-und-Kontinuitaetsrichtlinie",
"R05":"R05_Personalsicherheit-und-Awareness","R06":"R06_Mobiles-Arbeiten-und-mobile-Geraete",
"R07":"R07_Physische-Sicherheit","R08":"R08_Identitaets-und-Zugriffsmanagement",
"R09":"R09_Kryptografie-und-Uebertragungsrichtlinie","R10":"R10_Betriebssicherheit",
"R11":"R11_Sichere-Systembeschaffung-und-Entwicklung","R12":"R12_Cloud-KI-und-externe-IT-Dienste",
"R13":"R13_Lieferanten-und-Dienstleistersteuerung","R14":"R14_Compliance-und-Datenschutz"}
for pol, controls in order_by_pol.items():
meta=POLICY_META[pol]
body=[META_HEAD.format(title=meta["title"], owner=meta["owner"])]
body.append("\n## 1. Zweck\n\n"+meta["purpose"]+" Sie konkretisiert die Informationssicherheitsleitlinie ({{LINK:L00}}) und dient der Erfüllung der Anforderungen des VDA ISA 2027.\n")
body.append("## 2. Geltungsbereich\n\nDiese Richtlinie gilt innerhalb des definierten ISMS-Geltungsbereichs ({{ISMS_SCOPE_DESCRIPTION}}).\n")
body.append("## 3. Anforderungen und Umsetzung\n\n> Aufbau je Abschnitt: **Anforderung** (1:1 aus VDA ISA; [MUSS]/[SOLL] und bei entsprechendem Schutzbedarf [HOCH]/[SEHR HOCH]) und **Umsetzung bei {{ORG_NAME}}** (gebündelt, anzupassen wo erforderlich).\n")
sec=0
for ctrl,d,is_isa in controls:
sec+=1
req_block, impl_block, entries=render_reqs(ctrl,d)
mapping["anforderungen"].extend(entries)
isa_label = f"ISA {ctrl}" if is_isa else f"Ergänzung {pol}, nicht ISA"
head=f"### 3.{sec} {d['title']} ({isa_label})\n"
sect = head + "\n**Anforderung**\n\n" + req_block + "\n\n**Umsetzung bei {{ORG_NAME}}**\n\n" + impl_block + "\n"
if d.get("flag"):
sect=f"{{{{#if {d['flag']}}}}}\n{sect}\n{{{{/if}}}}"
body.append(sect)
body.append("## 4. Verbindlichkeit\n\nDiese Richtlinie ist für alle betroffenen Rollen im Geltungsbereich verbindlich. Die Einhaltung wird durch "+meta["owner"]+" überwacht.\n")
roles="\n".join("| %s | %s |"%(r,v) for r,v in meta["roles"])
body.append("## 5. Rollen und Verantwortlichkeiten\n\n| Rolle | Verantwortung in dieser Richtlinie |\n|-------|-------------------------------------|\n"+roles+"\n")
body.append("## 6. Überprüfung und Aktualisierung\n\nDiese Richtlinie wird mindestens {{REVIEW_CYCLE}} sowie anlassbezogen durch "+meta["owner"]+" überprüft und durch {{ROLE_MANAGEMENT}} freigegeben.\n")
body.append("## 7. Nachweise\n\nDie Nachweise werden nicht in diesem Dokument geführt, sondern zentral im Nachweisregister ({{LINK:NACHWEISREGISTER}}) sowie in den zugehörigen Einträgen des ISMS-Tools ({{TOOL_NAME}}).\n")
rel=", ".join("{{LINK:%s}}"%x for x in meta["related"])
body.append("## 8. Verwandte Dokumente\n\n- Technische Sicherheits-Baseline: {{LINK:BASELINE}}\n- ISA-Mapping-Matrix: {{LINK:ISA_MAPPING}}\n- Nachweisregister: {{LINK:NACHWEISREGISTER}}\n- Weitere: "+rel+"\n\n<!-- Anforderungen 1:1 aus VDA ISA 2027; Mapping (REQ/IMPL) in mapping.json ueber Hidden-Anker. Im Lesemodus nicht sichtbar. -->\n")
open(os.path.join(RDIR,FN[pol]+".md"),"w",encoding="utf-8").write("\n".join(body))
# ---- L00 / 1.1.1 Mapping-Eintraege (Leitlinie, kombiniert) ----
d11=DATA["1.1.1"]
for lvl in ["must","should"]:
for i,text in enumerate(d11[lvl],1):
rid=f"1.1.1-{LETTER[lvl]}{i}"
mapping["anforderungen"].insert(0 if lvl=="must" else len(mapping["anforderungen"]), {
"id":rid,"policy":"L00","control":"1.1.1","level":lvl,
"type":{"must":"MUSS","should":"SOLL"}[lvl],"is_isa":True,
"req_anchor":f"REQ {rid}","impl_anchor":f"REQ {rid}","condition":COND[lvl],
"requirement":text,"link":"{{LINK:L00#1.1.1}}","nachweis_link":"{{LINK:NACHWEISREGISTER}}"})
# stabil sortieren nach Control dann Level dann Nummer fuer Lesbarkeit
lvlord={"must":0,"should":1,"high":2,"vhigh":3}
def ctrlkey(c):
base=c.replace("-KI","")
parts=base.split(".")
return tuple(int(p) for p in parts)+ (1 if "-KI" in c else 0,)
mapping["anforderungen"].sort(key=lambda a:(ctrlkey(a["control"]), lvlord[a["level"]], a["id"]))
json.dump(mapping, open(os.path.join(BASE,"mapping.json"),"w",encoding="utf-8"), ensure_ascii=False, indent=1)
cnt=collections.Counter(a["level"] for a in mapping["anforderungen"] if a["is_isa"])
custom=sum(1 for a in mapping["anforderungen"] if not a["is_isa"])
print("Richtlinien R01-R14 neu generiert.")
print("ISA-Anforderungen im Mapping:", dict(cnt), "Summe", sum(cnt.values()))
print("Kundenspezifische (KI) Zusatz:", custom)