Files
msolarczekandClaude Opus 4.8 eab16c861d 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>
2026-07-08 11:23:07 +02:00

174 lines
13 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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)