Iteration Teil D: Lieferantenmanagement (VDA-ISA 2027 Kap. 6 + NIS2)
Datenmodell (Prisma, RLS): Supplier + SupplierAsset, SupplierAssessment, Contract, Nda, SupplierEvidence, ServiceResponsibility, Subcontractor, ManagementDecision, SupplierControl (globaler Katalog) + SupplierControlMaturity. - VDA-ISA-2027-Kap.-6-Mini-Katalog (Controls 6.1.1–6.1.3) mit Zielbild, Muss/Soll, Anforderungen für hoch/sehr hoch, Simplified Group Assessment, Ziel-Reifegrad 3 und Cross-Referenzen (ISO/NIST/BSI); im Seed befüllt - Lieferantenverzeichnis mit KPIs (gesamt, NIS2-relevant, ablaufend, Reviews fällig), Kritikalität, NIS2-Flag, Review-Fristen - Detail-Popup: Stammdaten (Sektor/Leistung/Datenkategorien/CIA), betroffene Assets, VDA-ISA-Reifegrade je Control (Ziel 3, farbige Balken), Nachweise (Angemessenheit + Ablauf), Assessments, Verträge (AV/DPA, Flow-down, Fristen), NDAs (Fristen), Shared-Responsibility- Matrix, Subunternehmer, Managemententscheidungen - Bearbeiten-Popup: Stammdaten (ein Speichern), Reifegrad je Control, Add/Delete für alle Kind-Entitäten, Löschen im ⋯-Menü - Regel 6.1.1: fehlt geprüfter Audit-/TISAX-Nachweis → Warnung, dass eine dokumentierte risikobasierte Managemententscheidung nötig ist - Server-Actions mit Zod/RBAC/Audit-Log; Seed mit Demo-Lieferant (TISAX-Label, AV/DPA, NDA, Assessment, RACI, Reifegrade) - Menüpunkt „Lieferanten" aktiv; Lieferant ↔ Asset verknüpft (Graph) Verifiziert: Register/Detail/Bearbeiten dunkel & vollständig, Reifegrad- Save (6.1.2→4 mit Audit), Managemententscheidungs-Logik. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
18bd82e54a
commit
32ab91efbf
+164
@@ -452,6 +452,170 @@ async function main() {
|
||||
}
|
||||
console.log(`✔ ${measures.length} Beispiel-Maßnahmen angelegt, Rest-Risiken berechnet`);
|
||||
}
|
||||
|
||||
// 8. VDA-ISA 2027 Kapitel 6 — Supplier Relationships (globaler Katalog)
|
||||
const controls = [
|
||||
{
|
||||
ref: "6.1.1",
|
||||
title:
|
||||
"To what extent is information security ensured among contractors and cooperation partners?",
|
||||
objective:
|
||||
"Ein angemessenes Informationssicherheitsniveau wird auch bei der Zusammenarbeit mit Partnern und Auftragnehmern aufrechterhalten.",
|
||||
mustReq:
|
||||
"Auftragnehmer/Partner werden einer Sicherheitsrisikobewertung unterzogen; angemessenes Niveau vertraglich sichergestellt; Kundenanforderungen ggf. weitergegeben.",
|
||||
shouldReq:
|
||||
"Vertragliche Verpflichtung zur Weitergabe an Subunternehmer; Prüfung von Service-Reports/Dokumenten.",
|
||||
highReq:
|
||||
"Nachweis eines angemessenen Sicherheitsniveaus (geprüfter Fragebogen/Self-Assessment, Attest, Zertifikat, Lieferantenaudit) (C,I,A); Compliance dokumentiert, regelmäßig & anlassbezogen überwacht.",
|
||||
veryHighReq:
|
||||
"Nachweis durch Third-Party-Audit (adäquates TISAX-Label o. Ä.) oder Lieferantenaudit; ohne Audit: risikobasierte Managemententscheidung mit Protokoll (C,I,A); Transparenzpflichten gegenüber Kunden erfüllt.",
|
||||
targetMaturity: 3,
|
||||
simplifiedGroupAssessment: true,
|
||||
references:
|
||||
"ISO 27001:2022 A.5.19–A.5.22 · NIST CSF 2.0 GV.SC-02..06 · BSI OPS.2.1/OPS.2.2/OPS.3.1/ORP.2 · NIST SP800-53r5 MA-4, CA-3, CA-6, PM-16, PM-30, SR-2, SR-3, SR-6, SR-7, SR-8",
|
||||
},
|
||||
{
|
||||
ref: "6.1.2",
|
||||
title:
|
||||
"To what extent is non-disclosure regarding the exchange of information contractually agreed?",
|
||||
objective:
|
||||
"Geheimhaltungsvereinbarungen schützen den Informationsaustausch über Organisationsgrenzen hinweg rechtlich.",
|
||||
mustReq:
|
||||
"Geheimhaltungsanforderungen bestimmt und erfüllt; allen Beteiligten bekannt; gültige NDAs vor Weitergabe sensibler Infos; regelmäßige Überprüfung.",
|
||||
shouldReq:
|
||||
"Geprüfte NDA-Vorlagen; NDAs mit Parteien, Informationsart, Gegenstand, Gültigkeit, Pflichten; Nachweis-/Auditrechte; Prozess zur Fristenüberwachung und rechtzeitigen Verlängerung.",
|
||||
highReq: null,
|
||||
veryHighReq: null,
|
||||
targetMaturity: 3,
|
||||
simplifiedGroupAssessment: true,
|
||||
references: "ISO 27001:2022 A.5.14, A.6.6 · BSI OPS.2.1/OPS.2.2/OPS.3.1/ORP.5/CON.2",
|
||||
},
|
||||
{
|
||||
ref: "6.1.3",
|
||||
title:
|
||||
"To what extent are the responsibilities between external IT service providers and the own organization defined?",
|
||||
objective:
|
||||
"Gemeinsames Verständnis der Verantwortungsteilung; alle Sicherheitsanforderungen umgesetzt und nachweislich dokumentiert.",
|
||||
mustReq:
|
||||
"Betroffene IT-Services identifiziert; Anforderungen bestimmt; verantwortliche Organisation je Anforderung definiert; Mechanismen für geteilte Verantwortung umgesetzt.",
|
||||
shouldReq:
|
||||
"Konfiguration konzeptioniert/umgesetzt/dokumentiert; zuständiges Personal geschult.",
|
||||
highReq:
|
||||
"Liste der IT-Services und Provider (C,I,A); ISA-Control-Anwendbarkeit bewertet; regelmäßige Security-Assessments; Nachweis der Pflichterfüllung; Integration in lokale Schutzmaßnahmen dokumentiert.",
|
||||
veryHighReq: null,
|
||||
targetMaturity: 3,
|
||||
simplifiedGroupAssessment: false,
|
||||
references:
|
||||
"ISO 27001:2022 A.5.23, A.8.9 · ISO 27017 CLD.6.3.1 · IEC 62443-2-1 6.2.3 · NIST CSF 2.0 GV.OC-05, GV.SC-01/02 · BSI 200-2, OPS.2.1/OPS.2.2/OPS.3.1/ORP.2 · NIST SP800-53r5 MA-4, PT-1, PL-2",
|
||||
},
|
||||
];
|
||||
for (const c of controls) {
|
||||
await prisma.supplierControl.upsert({ where: { ref: c.ref }, update: c, create: c });
|
||||
}
|
||||
console.log(`✔ VDA-ISA 2027 Kap. 6: ${controls.length} Supplier-Controls`);
|
||||
|
||||
// 9. Demo-Lieferant mit Nachweisen/Verträgen (nur wenn noch keiner existiert)
|
||||
const supplierCount = await prisma.supplier.count({ where: { tenantId: tenant.id } });
|
||||
if (supplierCount === 0) {
|
||||
const hoster = await prisma.asset.findFirst({
|
||||
where: { tenantId: tenant.id, name: "Cloud-Hoster (IaaS)" },
|
||||
});
|
||||
const sup = await prisma.supplier.create({
|
||||
data: {
|
||||
tenantId: tenant.id,
|
||||
refNo: 1,
|
||||
name: "Cloud-Hoster GmbH",
|
||||
sector: "IT-Dienstleistung / IaaS",
|
||||
services: "Rechenzentrum, Virtualisierung, Backup für ERP & CRM",
|
||||
criticality: 4,
|
||||
dataCategories: ["Kundendaten", "Auftragsdaten"],
|
||||
confidentiality: 3,
|
||||
integrity: 3,
|
||||
availability: 4,
|
||||
nis2Relevant: true,
|
||||
status: "ACTIVE",
|
||||
contact: "security@cloud-hoster.example",
|
||||
nextReview: new Date(Date.now() + 90 * 24 * 3600 * 1000),
|
||||
},
|
||||
});
|
||||
if (hoster) {
|
||||
await prisma.supplierAsset.create({
|
||||
data: { tenantId: tenant.id, supplierId: sup.id, assetId: hoster.id },
|
||||
});
|
||||
}
|
||||
await prisma.supplierEvidence.create({
|
||||
data: {
|
||||
tenantId: tenant.id,
|
||||
supplierId: sup.id,
|
||||
kind: "TISAX_LABEL",
|
||||
name: "TISAX AL3 (info high)",
|
||||
protectsCia: "C,I,A",
|
||||
validTo: new Date(Date.now() + 200 * 24 * 3600 * 1000),
|
||||
adequacyChecked: true,
|
||||
},
|
||||
});
|
||||
await prisma.contract.create({
|
||||
data: {
|
||||
tenantId: tenant.id,
|
||||
supplierId: sup.id,
|
||||
type: "av_dpa",
|
||||
avDpa: true,
|
||||
securityClauses: true,
|
||||
flowdown: true,
|
||||
customerTransparency: false,
|
||||
validFrom: new Date(Date.now() - 300 * 24 * 3600 * 1000),
|
||||
validTo: new Date(Date.now() + 400 * 24 * 3600 * 1000),
|
||||
reference: "AV-2025-014",
|
||||
},
|
||||
});
|
||||
await prisma.nda.create({
|
||||
data: {
|
||||
tenantId: tenant.id,
|
||||
supplierId: sup.id,
|
||||
parties: "Demo GmbH ↔ Cloud-Hoster GmbH",
|
||||
infoScope: "Betriebs- und Kundendaten",
|
||||
subject: "Betrieb der ERP-/CRM-Infrastruktur",
|
||||
validFrom: new Date(Date.now() - 300 * 24 * 3600 * 1000),
|
||||
validTo: new Date(Date.now() + 60 * 24 * 3600 * 1000),
|
||||
extensionStatus: "offen",
|
||||
},
|
||||
});
|
||||
await prisma.supplierAssessment.create({
|
||||
data: {
|
||||
tenantId: tenant.id,
|
||||
supplierId: sup.id,
|
||||
type: "SELF_ASSESSMENT",
|
||||
status: "EVALUATED",
|
||||
score: 82,
|
||||
date: new Date(Date.now() - 120 * 24 * 3600 * 1000),
|
||||
nextReview: new Date(Date.now() + 245 * 24 * 3600 * 1000),
|
||||
result: "angemessen",
|
||||
},
|
||||
});
|
||||
await prisma.serviceResponsibility.create({
|
||||
data: {
|
||||
tenantId: tenant.id,
|
||||
supplierId: sup.id,
|
||||
itService: "IaaS-Plattform",
|
||||
requirement: "Patch-Management der Hypervisor-Ebene",
|
||||
responsibleParty: "SUPPLIER",
|
||||
isaApplicability: "5.x IT/Cyber Security",
|
||||
integratedLocalControls: "Sichere Authentisierung, Monitoring beim Kunden",
|
||||
},
|
||||
});
|
||||
const dbControls = await prisma.supplierControl.findMany();
|
||||
for (const c of dbControls) {
|
||||
await prisma.supplierControlMaturity.create({
|
||||
data: {
|
||||
tenantId: tenant.id,
|
||||
supplierId: sup.id,
|
||||
controlId: c.id,
|
||||
maturity: c.ref === "6.1.2" ? 2 : 3,
|
||||
},
|
||||
});
|
||||
}
|
||||
console.log("✔ Demo-Lieferant mit Nachweisen/Vertrag/NDA/Assessment angelegt");
|
||||
}
|
||||
}
|
||||
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user