Zum Hauptinhalt springen

Sicherheitsarchitektur

Das Sicherheitsmodell von Exportelier beruht auf einer bewussten Aufteilung in zwei Apps, sodass die App, die Ihre Vorgangsdaten verarbeitet, keine Möglichkeit hat, sie irgendwohin zu senden.

Haupt-App: kein Fetch, keine Webtrigger

Die Haupt-App deklariert in ihrem Forge-Manifest keinen externen Fetch und keine Webtrigger. PDFs werden vollständig auf Forge gerendert, ohne Headless-Browser und ohne Drittanbieter-Server. Das wird von der Plattform von Atlassian erzwungen — es ist eine Architektur-Garantie, kein Richtlinien-Versprechen.

Zwei-App-Architekturdiagramm Ein Diagramm: die Haupt-App (kein Egress, rendert auf Forge) neben der Automation-App (gesamter Egress, isoliert).

Automation-App: isolierter Egress

Alles, was Daten nach außen senden muss — E-Mail, Slack Incoming Webhooks, Microsoft Teams Workflows und API — lebt in der separaten Exportelier Automation-App. Sie trägt den gesamten ausgehenden Verkehr, mit SSRF-Schutz und anbieterspezifischen geheimen URLs.

Reports lesen Jira als die exportierende Person

Jeder Jira-Lesevorgang eines Reports — Saved Filters auflisten, sie im Preflight prüfen und sie beim Export durchsuchen — läuft als die Person, die ihn gestartet hat, über die asUser-Identität von Forge. Die App weicht nie auf ihre eigene App-Identität aus, um einen eingereihten Export gelingen zu lassen.

Daraus folgen direkt zwei Eigenschaften:

  • Site-Admin-Status in Exportelier erweitert die Jira-Sichtbarkeit nie. Ein Admin kann einen Report aus Filtern bauen, die er sieht; das gewährt niemandem sonst Zugriff darauf. Ist eine Quelle für die exportierende Person nicht verfügbar, scheitert der Export und benennt sie, statt eine Datenquelle stillschweigend wegzulassen.
  • Es wird nie eine Abfrage gespeichert oder aus Ihrem Text zusammengesetzt. Exportelier hält die numerische ID eines Saved Filters und bildet genau ein streng numerisches Prädikat, filter = <id>. Filter-JQL wird nie gelesen, gespeichert, protokolliert oder konkateniert — es gibt also keine JQL-Injection-Fläche und keine veraltete Kopie Ihrer Abfrage.

Report-Ausgaben sind temporär und werden nach dem Download gelöscht — siehe Datenaufbewahrung & GDPR.

Der Dashboard-Import nutzt ausschließlich dokumentierte APIs

Der Dashboard-Import liest Jira ausschließlich über Atlassians dokumentierte Jira-Cloud-Dashboard-REST-API, und zwar als die importierende Person. Er parst keine Jira-Webseiten, liest keine Gadget-Iframes, erstellt keine Screenshots, nutzt keine undokumentierten Gadget-Preference-Endpunkte und sendet nichts außerhalb von Forge. Ein neuer Berechtigungs-Scope war dafür nicht nötig.

Was gelesen wird, ist bewusst eng gefasst. Gadget-Konfigurationswerte werden gegen eine Allowlist pro Gadget validiert, deutlich unterhalb von Jiras eigenem Maximum größenbegrenzt und niemals geloggt, in Fehlermeldungen wiedergegeben oder in Audit-Events geschrieben. JQL wird nie gespeichert, auch dann nicht, wenn eine Gadget-Property zufällig welches enthält — ein importierter Report behält dieselbe numerische Filter-ID wie jeder andere Report.

Eine der beteiligten Operationen, Get gadgets, ist von Atlassian als Experimental gekennzeichnet. Entspricht ihre Antwort nicht mehr dem, was Exportelier gegen eine echte Jira-Site geprüft hat, schlägt der Importpfad kontrolliert fehl und die Funktion schaltet sich ab, statt auf einer fehlgelesenen Antwort zu handeln. Bestehende Reports und Exporte sind davon nicht betroffen.

Audit-Events halten fest, dass ein Importdatensatz geprüft oder gelöscht wurde. Sie enthalten keine Gadget-Konfiguration, kein JQL und keine Vorgangsdaten.

Warum die Aufteilung

Verbietet Ihre Richtlinie ausgehenden Verkehr, installieren Sie nur die Haupt-App und haben eine harte Garantie, dass nichts Atlassian verlässt. Teams, die Zustellung brauchen, fügen die Automation-App bewusst hinzu.

Siehe auch Datenresidenz und die Seite Beschaffung & Anbietersicherheit.