# Diagramme in VorgabenUI Diese Anleitung beschreibt, wie Diagramme in Textabschnitten verwendet werden können. VorgabenUI nutzt [Kroki](https://kroki.io/) zur Generierung von Diagrammen aus Textbeschreibungen. ## Übersicht Der Abschnitttyp **"diagramm"** ermöglicht es, verschiedene Diagrammtypen direkt in Vorgaben, Einleitungen und Geltungsbereichen einzubinden. Die Diagramme werden aus Textbeschreibungen automatisch als SVG-Grafiken generiert und gecacht. ## Grundlegende Verwendung ### Format ``` [Diagrammtyp] option: [HTML-Attribute] (optional) [Diagramm-Code] ``` **Zeile 1:** Diagrammtyp (z.B. `plantuml`, `mermaid`, `graphviz`) **Zeile 2 (optional):** `option:` gefolgt von HTML-Attributen für die Bildgrösse **Zeile 3+:** Der eigentliche Diagramm-Quellcode ### Standard-Einstellungen Wenn keine `option:`-Zeile angegeben wird, wird das Diagramm mit `width="100%"` dargestellt. ### Grösse anpassen Um die Grösse des Diagramms anzupassen, verwenden Sie die `option:`-Zeile: ``` plantuml option: width="50%" @startuml ... @enduml ``` Weitere Beispiele für Optionen: ``` option: width="800px" option: width="60%" style="max-width: 600px;" option: height="400px" option: width="100%" class="img-fluid" ``` ## Unterstützte Diagrammtypen Kroki unterstützt über 20 verschiedene Diagrammtypen. Die wichtigsten sind: | Typ | Beschreibung | Verwendung | |-----|--------------|------------| | `plantuml` | UML-Diagramme, Sequenzdiagramme, Aktivitätsdiagramme | Prozesse, Architekturen | | `mermaid` | Flussdiagramme, Sequenzdiagramme, Gantt-Charts | Prozessabläufe, Zeitpläne | | `graphviz` | Gerichtete/ungerichtete Graphen | Abhängigkeiten, Netzwerke | | `blockdiag` | Block-Diagramme | Systemübersichten | | `nwdiag` | Netzwerk-Diagramme | Netzwerktopologien | | `seqdiag` | Sequenz-Diagramme | Kommunikationsabläufe | | `c4plantuml` | C4-Modell Diagramme | Software-Architektur | | `ditaa` | ASCII-Art zu Diagrammen | Einfache Skizzen | | `excalidraw` | Hand-gezeichnete Diagramme | Präsentationen | | `bpmn` | Business Process Model Notation | Geschäftsprozesse | Vollständige Liste: https://kroki.io/ ## Beispiele ### PlantUML: Sequenzdiagramm ``` plantuml option: width="80%" @startuml Alice -> Bob: Authentifizierungsanfrage Bob --> Alice: Authentifizierungsantwort Alice -> Bob: Weitere Anfrage Alice <-- Bob: Weitere Antwort @enduml ``` **Verwendung:** Darstellung von Kommunikationsabläufen, API-Interaktionen ### PlantUML: Aktivitätsdiagramm ``` plantuml @startuml start :Sicherheitsrichtlinie prüfen; if (Richtlinie erfüllt?) then (ja) :Zugriff gewähren; else (nein) :Zugriff verweigern; :Incident loggen; endif stop @enduml ``` **Verwendung:** Prozesse, Entscheidungsabläufe, Workflows ### PlantUML: Komponentendiagramm ``` plantuml option: width="70%" @startuml package "Web-Tier" { [Web-Server] [Load Balancer] } package "App-Tier" { [Application Server] [Cache] } package "Data-Tier" { [Datenbank] } [Load Balancer] --> [Web-Server] [Web-Server] --> [Application Server] [Application Server] --> [Cache] [Application Server] --> [Datenbank] @enduml ``` **Verwendung:** System-Architekturen, Komponenten-Übersicht ### Mermaid: Flussdiagramm ``` mermaid option: width="75%" flowchart TD Start[Log-Event empfangen] --> Check{Schweregrad?} Check -->|CRITICAL| Alert[Alert auslösen] Check -->|WARNING| Log[In Log-System speichern] Check -->|INFO| Archive[Archivieren] Alert --> SIEM[An SIEM weiterleiten] Log --> SIEM SIEM --> End[Fertig] Archive --> End ``` **Verwendung:** Prozessabläufe, Entscheidungsbäume ### Mermaid: Sequenzdiagramm ``` mermaid sequenceDiagram participant Benutzer participant Firewall participant Server Benutzer->>Firewall: Verbindungsanfrage Firewall->>Firewall: Regel-Prüfung alt Regel erlaubt Firewall->>Server: Weiterleitung Server-->>Firewall: Antwort Firewall-->>Benutzer: Antwort else Regel blockiert Firewall-->>Benutzer: Verbindung abgelehnt end ``` **Verwendung:** Kommunikationsabläufe mit Bedingungen ### GraphViz: Abhängigkeitsgraph ``` graphviz digraph G { rankdir=LR; node [shape=box, style=rounded]; "R0066\nLogging" -> "R0009\nServersysteme"; "R0066\nLogging" -> "R0126\nNetzwerksicherheit"; "R0009\nServersysteme" -> "R0135\nInformationssicherheit"; "R0126\nNetzwerksicherheit" -> "R0135\nInformationssicherheit"; "R0135\nInformationssicherheit" [style="rounded,filled", fillcolor=lightblue]; } ``` **Verwendung:** Abhängigkeiten zwischen Dokumenten/Standards ### GraphViz: Netzwerk-Topologie ``` graphviz option: width="100%" graph G { layout=neato; Internet [shape=cloud]; Firewall [shape=box, style=filled, fillcolor=red]; DMZ [shape=box, style=filled, fillcolor=yellow]; LAN [shape=box, style=filled, fillcolor=green]; Internet -- Firewall [label="WAN"]; Firewall -- DMZ [label="DMZ-Segment"]; Firewall -- LAN [label="Internes Netz"]; } ``` **Verwendung:** Netzwerk-Segmentierung, Zonen-Modelle ### BlockDiag: System-Übersicht ``` blockdiag blockdiag { orientation = portrait; Client -> "Load Balancer" -> "Web-Server 1", "Web-Server 2"; "Web-Server 1", "Web-Server 2" -> "App-Server"; "App-Server" -> "Datenbank Primary"; "Datenbank Primary" -> "Datenbank Replica"; "Load Balancer" [color = "lightblue"]; "App-Server" [color = "lightgreen"]; "Datenbank Primary" [color = "pink"]; } ``` **Verwendung:** Einfache System-Diagramme, Datenflüsse ### NwDiag: Netzwerk-Diagramm ``` nwdiag nwdiag { network dmz { address = "192.168.1.0/24"; web01 [address = "192.168.1.10"]; web02 [address = "192.168.1.11"]; } network internal { address = "10.0.0.0/8"; web01 [address = "10.0.1.10"]; web02 [address = "10.0.1.11"]; app01 [address = "10.0.2.10"]; db01 [address = "10.0.3.10"]; } } ``` **Verwendung:** Netzwerk-Topologien mit IP-Adressen ### SeqDiag: Authentifizierungsablauf ``` seqdiag seqdiag { Benutzer -> System: Benutzername + Passwort; System -> LDAP: Authentifizierung prüfen; LDAP --> System: Erfolgreich; System -> 2FA: 2FA-Code anfordern; 2FA --> Benutzer: Code per SMS; Benutzer -> System: 2FA-Code eingeben; System --> Benutzer: Zugriff gewährt; } ``` **Verwendung:** Authentifizierungs- und Autorisierungsabläufe ### C4 PlantUML: System-Kontext ``` c4plantuml @startuml !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml Person(admin, "Administrator", "BIT System-Administrator") System(vorgaben, "VorgabenUI", "IT-Sicherheits-Vorgaben Portal") System_Ext(ldap, "LDAP", "Authentifizierung") Rel(admin, vorgaben, "Verwaltet Vorgaben") Rel(vorgaben, ldap, "Authentifiziert über") @enduml ``` **Verwendung:** Software-Architektur nach C4-Modell ## Best Practices ### 1. Diagramm-Grösse anpassen Verwenden Sie die `option:`-Zeile, um die Grösse für bessere Lesbarkeit anzupassen: ``` plantuml option: width="60%" ... ``` Für sehr detaillierte Diagramme: ``` plantuml option: width="100%" style="max-width: 1200px;" ... ``` ### 2. Einfachheit bevorzugen Halten Sie Diagramme einfach und fokussiert. Zu komplexe Diagramme sind schwer zu lesen. **Gut:** ``` mermaid flowchart LR A[Start] --> B{Prüfung} B -->|OK| C[Weiter] B -->|Fehler| D[Abbruch] ``` **Zu komplex:** Vermeiden Sie Diagramme mit mehr als 15-20 Elementen. ### 3. Konsistente Stil-Wahl Verwenden Sie für ähnliche Konzepte den gleichen Diagrammtyp: - **Prozesse:** Mermaid Flowchart oder PlantUML Activity - **Kommunikation:** Mermaid/PlantUML Sequence - **Architektur:** PlantUML Component oder C4 - **Netzwerke:** NwDiag oder GraphViz ### 4. Beschriftungen auf Deutsch Verwenden Sie deutsche Beschriftungen für bessere Verständlichkeit: ``` mermaid flowchart TD Start[Anfrage empfangen] --> Prüfung{Berechtigung?} Prüfung -->|Ja| Zugriff[Zugriff gewähren] Prüfung -->|Nein| Ablehnung[Zugriff verweigern] ``` ### 5. Farben sparsam einsetzen Nutzen Sie Farben zur Hervorhebung wichtiger Elemente: ``` graphviz digraph { node [shape=box]; Kritisch [style=filled, fillcolor=red, fontcolor=white]; Wichtig [style=filled, fillcolor=orange]; Normal [style=filled, fillcolor=lightgreen]; Kritisch -> Wichtig -> Normal; } ``` ### 6. Lesbarkeit testen Nach dem Speichern prüfen, ob das Diagramm in der Webansicht gut lesbar ist. Bei Bedarf: - Grösse anpassen (`option: width="..."`) - Diagramm vereinfachen - Anderen Diagrammtyp wählen ## Fehlerbehandlung ### Diagramm wird nicht angezeigt **Mögliche Ursachen:** 1. **Syntaxfehler im Diagramm-Code** - Prüfen Sie die Syntax gemäss Dokumentation des Diagrammtyps - Testen Sie den Code auf https://kroki.io/ 2. **Falscher Diagrammtyp** - Erste Zeile muss genau dem Kroki-Typ entsprechen - Beispiel: `plantuml` (nicht `PlantUML` oder `plant-uml`) 3. **Kroki-Server nicht erreichbar** - Bei Fehlermeldung "Error generating diagram" Server prüfen ### Fehlersuche 1. **Code auf kroki.io testen:** ``` https://kroki.io/ ``` Geben Sie dort den Code ein und testen Sie die Generierung. 2. **Diagramm-Cache leeren:** ```bash python manage.py clear_diagram_cache ``` 3. **Logs prüfen:** Fehler werden im Application-Log ausgegeben. ## Häufig verwendete Diagramm-Szenarien ### IT-Sicherheit: Bedrohungsmodell ``` mermaid flowchart TB Asset[Schützenswertes Asset] Threat[Bedrohung] Vuln[Schwachstelle] Control[Sicherheitsmassnahme] Threat -->|nutzt aus| Vuln Vuln -->|betrifft| Asset Control -->|schliesst| Vuln Control -->|schützt| Asset ``` ### Netzwerk-Segmentierung ``` nwdiag nwdiag { network internet { address = "Internet"; internet [shape = cloud]; } network dmz { address = "DMZ (192.168.1.0/24)"; fw [address = "192.168.1.1"]; web [address = "192.168.1.10"]; } network internal { address = "Intern (10.0.0.0/8)"; fw [address = "10.0.0.1"]; app [address = "10.0.1.10"]; db [address = "10.0.2.10"]; } internet -- fw; } ``` ### Patch-Management Prozess ``` plantuml @startuml start :Patch-Benachrichtigung empfangen; :Schweregrad bewerten; if (Kritischer Patch?) then (ja) :Sofort in Test-Umgebung testen; if (Test erfolgreich?) then (ja) :Notfall-Change erstellen; :In Produktion ausrollen; else (nein) :Vendor kontaktieren; endif else (nein) :In regulären Patch-Zyklus einplanen; :Testen im Change-Window; :Reguläres Rollout; endif :Dokumentation aktualisieren; stop @enduml ``` ### Zugriffskontrolle ``` plantuml @startuml skinparam actorStyle awesome actor Benutzer actor Administrator actor "Security Team" as ST rectangle "VorgabenUI" { usecase "Vorgaben lesen" as UC1 usecase "Vorgaben bearbeiten" as UC2 usecase "Vorgaben publizieren" as UC3 usecase "Sicherheitsreview" as UC4 } Benutzer --> UC1 Administrator --> UC1 Administrator --> UC2 ST --> UC4 UC2 .> UC4 : <> UC4 --> UC3 @enduml ``` ## Weiterführende Ressourcen - **Kroki Dokumentation:** https://kroki.io/ - **PlantUML Dokumentation:** https://plantuml.com/ - **Mermaid Dokumentation:** https://mermaid.js.org/ - **GraphViz Dokumentation:** https://graphviz.org/ - **Live-Editor zum Testen:** https://kroki.io/ ## Tipps für spezifische Diagrammtypen ### PlantUML Tipps ``` @startuml ' Kommentare mit Apostroph skinparam backgroundColor transparent skinparam defaultFontName Arial @enduml ``` ### Mermaid Tipps ``` %%{ init: { 'theme': 'base' } }%% flowchart LR %% Kommentare mit doppeltem Prozent ``` ### GraphViz Tipps ``` digraph { // Kommentare mit doppeltem Slash rankdir=LR; // Links nach Rechts // rankdir=TB; // Top nach Bottom } ``` ## Support Bei Fragen oder Problemen mit Diagrammen: 1. Code auf https://kroki.io/ testen 2. Syntax-Dokumentation des jeweiligen Diagrammtyps konsultieren 3. (Nur mit Shell-Zugriff auf Kubernetes-Pod möglich): Diagramm-Cache leeren: `python manage.py clear_diagram_cache` 4. Bei technischen Problemen: Information Security Management BIT kontaktieren