Sicherheit
Wie CostPulse mit deinem AWS-Account umgeht
Vertrauen ist die Grundlage unseres Dienstes. Du gibst uns Zugriff auf Kostendaten in deinem AWS-Account — hier erklären wir transparent, was genau in deinem Account passiert, welche Berechtigungen wir haben und welche nicht.
Was CostPulse in deinem AWS-Account anlegt
Wenn du einen AWS-Account verbindest, deployst du einen CloudFormation-Stack (CostPulse-Client-Roles-{hash}) in einer AWS-Region deiner Wahl (Standard: eu-central-1). Der Stack erstellt ausschließlich folgende Ressourcen:
4 IAM-Rollen — jede mit eigener, eng gefasster Berechtigung:
| Rolle | Zweck |
|---|---|
| Cost Reader | Liest deine Kostendaten (ce:GetCostAndUsage) — sonst nichts. |
| Anomaly Detection | Erstellt und verwaltet Kostenanomalien-Monitore. Kann nur Ressourcen ändern/löschen, die mit ManagedBy=costpulse getaggt sind. |
| Budgets Manager | Liest alle Budgets. Kann nur Budgets erstellen, ändern oder löschen, deren Name mit costpulse-{hash}- beginnt. |
| Stack Cleanup | Dient ausschließlich dazu, den CostPulse-Stack beim Offboarding zu löschen. Kann nur die eigenen CostPulse-Ressourcen entfernen. |
1 SNS Topic (costpulse-{hash}-alerts) — empfängt Budget-Alarme und Anomalie-Erkennungen von AWS und leitet sie an CostPulse weiter, damit du Push-Benachrichtigungen erhältst. Nur die AWS-Dienste budgets.amazonaws.com und costalerts.amazonaws.com dürfen auf dieses Topic publizieren, eingeschränkt auf deine eigene Account-ID.
Sonst nichts. Keine Lambda-Funktionen, keine EC2-Instanzen, kein Datenspeicher, keine Netzwerk-Ressourcen.
{hash} ist ein deterministischer 8-Zeichen-Hex-String, der aus deiner ExternalId abgeleitet wird. Er stellt sicher, dass Ressourcen-Namen über mehrere Mandanten im selben AWS-Account hinweg isoliert sind.
Kein Zugriff auf Zugangsdaten
CostPulse speichert niemals langfristige AWS-Credentials (Access Keys oder Secret Keys). Der gesamte Zugriff erfolgt über temporäre AWS STS Sessions:
- CostPulse ruft
sts:AssumeRole für die jeweilige Rolle in deinem Account auf. - Jeder Aufruf erfordert die korrekte ExternalId — eine UUID, die beim Onboarding generiert wurde. Ohne diese ID schlägt der Zugriff fehl, selbst wenn jemand unsere Account-ID und den Rollen-ARN kennt (Schutz vor dem Confused Deputy Problem).
- AWS STS liefert temporäre Credentials, die nach 15 Minuten ablaufen.
- Innerhalb einer einzelnen Lambda-Ausführung werden Credentials aus Performance-Gründen im Arbeitsspeicher gecacht (nicht persistiert). Der Cache-Schlüssel enthält die authentifizierte Cognito-User-ID — ein warmes Lambda kann niemals Credentials eines anderen Nutzers zurückgeben. Cache-Einträge werden proaktiv verworfen, wenn weniger als 60 Sekunden Gültigkeit verbleiben. Selbst wenn ein veralteter Eintrag noch im Cache vorhanden wäre, lehnt AWS jeden API-Aufruf mit abgelaufenen Credentials ab — sie sind kryptographisch zeitgebunden und nach Ablauf unbrauchbar, unabhängig vom Caching.
Jede STS-Session erhält einen beschreibenden Namen (z.B. costpulse-cost-explorer, costpulse-anomaly-cleanup), der in deinen CloudTrail-Logs erscheint. Du kannst jederzeit prüfen, welche CostPulse-Operation welchen API-Aufruf ausgelöst hat.
Was CostPulse nicht kann
- Keinen Zugriff auf AWS-Dienste außerhalb der 4 IAM-Rollen (kein S3, EC2, RDS oder andere Dienste).
- Keine IAM-User oder Policies erstellen oder ändern (außer den eigenen Stack-Cleanup-Berechtigungen).
- Keine Budgets außerhalb des
costpulse-{hash}--Namens-Präfix erstellen. - Keine Anomalie-Monitore oder -Subscriptions löschen, die nicht mit
ManagedBy=costpulse getaggt sind. - Keine Änderungen an deiner Infrastruktur vornehmen.
Account löschen — was passiert
Wenn du einen AWS-Account aus CostPulse entfernst, läuft das Offboarding automatisch ab:
- Anomalie-Cleanup: CostPulse löscht die erstellte Anomalie-Subscription. Der Anomalie-Monitor selbst (eine kostenlose, geteilte Ressource pro AWS-Account) wird nicht gelöscht.
- Account als gelöscht markiert in der CostPulse-Datenbank.
- Trust Policy deaktiviert: CostPulse setzt die Trust Policy der Stack-Cleanup-Rolle auf eine unmatchbare Bedingung (
sts:ExternalId = "DISABLED"). Ab diesem Moment ist die Rolle dauerhaft unbrauchbar. - Stack-Löschung: Mit der noch gültigen Session wird
cloudformation:DeleteStack aufgerufen. CloudFormation löscht alle Ressourcen: die 3 operativen IAM-Rollen, das SNS Topic (inkl. aller Subscriptions) und die Custom Resource. - Alle CostPulse-seitigen Daten (Kostendaten, Account-Informationen, SQS-Queue, Datenbank-Einträge) werden gelöscht.
Was übrig bleibt: Eine einzige verwaiste IAM-Rolle (costpulse-{hash}-stack-cleanup) mit deaktivierter Trust Policy. CostPulse kann diese Rolle nicht mehr annehmen und sie hat keine nutzbaren Berechtigungen. Du kannst sie gefahrlos manuell in der IAM-Konsole löschen.
Falls die automatische Löschung fehlschlägt, stellt CostPulse einen direkten Link zur CloudFormation-Konsole bereit, über den du den Stack mit einem Klick selbst löschen kannst.
Datenübertragung und Speicherung
- Alle Kommunikation zwischen der App, unserem Backend und AWS erfolgt verschlüsselt über TLS.
- Abgerufene Kostendaten werden in unserem Backend temporär zwischengespeichert (maximal 24 Stunden) zur Reduzierung von API-Aufrufen. Alarm-Datensätze werden 90 Tage aufbewahrt.
- Unser Backend läuft auf AWS (Serverless-Architektur).
- Wir verkaufen oder teilen deine Daten nicht mit Dritten.
- Wir nutzen deine Kostendaten nicht für eigene Analysen oder Benchmarks.
Region
Beim Setup wählst du die AWS-Region, in der der CloudFormation-Stack deployt wird (Standard: eu-central-1). Die vom Stack erstellten IAM-Rollen sind globale AWS-Ressourcen und funktionieren unabhängig von der gewählten Region. Das SNS Topic zur Alarm-Weiterleitung wird in der gewählten Region erstellt.
Sicherheitsbedenken oder Fragen?
Wenn du eine Sicherheitslücke findest oder Fragen zu unserem Sicherheitskonzept hast, kontaktiere uns unter: me@till-it-works.de