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>
174 lines
13 KiB
Python
174 lines
13 KiB
Python
# -*- 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)
|