# -*- 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"\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"\n{d['impl']}"] if d.get("impl_elev"): impl.append(f"{{{{#if FLAG_ELEVATED_PROTECTION}}}}\n\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\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)