BaaS-Sicherheitshärtung ist ein Satz gestaffelter Kontrollen – CLPs, ACLs und Schlüsseldisziplin –, der die Lücken schließt, die ein Backend ab Werk mitbringt. Backends kommen absichtlich permissiv zur Welt: offene Klassen und vom Client beschreibbare Schemas machen Prototypen schnell. Härtung ist der bewusste Durchgang, der diese Standards vor dem Start umlegt – und sie ist eine kurze, bekannte Checkliste, kein Forschungsprojekt.
Das Wichtigste in Kürze
| Frage | Antwort |
|---|---|
| Was es ist | Der Durchgang vor dem Start, der Klassenberechtigungen, ACLs, Schlüssel und Schema verriegelt |
| Die Schichten | CLPs sichern die Klasse → ACLs sichern die Zeile → geschützte Felder sichern die Spalte |
| Das eine Absolute | Der Master Key umgeht alles – er verlässt den Server nie |
| Der privilegierte Pfad | Cloud-Code-Funktionen sind die geprüfte Tür für sensible Schreibzugriffe |
| Was Schlüssel nicht sind | App-IDs und Client-Schlüssel sind Kennungen, keine Geheimnisse – planen Sie entsprechend |
Der gehärtete Standard, in Code
Die Hälfte der Geschichte, die am Objekt hängt – eine auf den Eigentümer begrenzte ACL unter einer verriegelten Klasse:
// JavaScript / Node.js — Back4app JS SDK
// Per-object ACL: the owner reads and writes, a moderator role reads,
// the public gets nothing — layered under the class-level permissions
const note = new Parse.Object('Note');
note.set('body', 'quarterly numbers');
const acl = new Parse.ACL(Parse.User.current()); // owner: read + write
acl.setPublicReadAccess(false);
acl.setPublicWriteAccess(false);
acl.setRoleReadAccess('moderator', true); // role: read only
note.setACL(acl);
await note.save();
// The class gate above it is schema config, set in the dashboard:
// find/get: requiresAuthentication · create: authenticated · addField: nobody // Flutter / Dart — Back4app Flutter SDK
// Per-object ACL: owner read/write, moderator role read, public nothing
final note = ParseObject('Note')..set('body', 'quarterly numbers');
final acl = ParseACL(owner: await ParseUser.currentUser()); // owner: r+w
acl.setPublicReadAccess(allowed: false);
acl.setPublicWriteAccess(allowed: false);
acl.setReadAccess(userId: 'role:moderator', allowed: true); // role: read
note.setACL(acl);
await note.save();
// The class gate above it is schema config, set in the dashboard:
// find/get requiresAuthentication, create authenticated, addField off // iOS / Swift — Back4app Swift SDK
// Per-object ACL: owner read/write, moderator role read, public nothing
var note = Note()
note.body = "quarterly numbers"
var acl = ParseACL()
acl.publicRead = false
acl.publicWrite = false
if let user = User.current {
acl.setReadAccess(user: user, value: true) // owner: read
acl.setWriteAccess(user: user, value: true) // owner: write
}
acl.setReadAccess(roleName: "moderator", value: true) // role: read only
note.ACL = acl
note.save { result in
if case .failure(let error) = result { print(error) }
} // Android / Kotlin — Back4app Android SDK
// Per-object ACL: owner read/write, moderator role read, public nothing
val note = ParseObject("Note").apply { put("body", "quarterly numbers") }
val acl = ParseACL(ParseUser.getCurrentUser()) // owner: read + write
acl.publicReadAccess = false
acl.publicWriteAccess = false
acl.setRoleReadAccess("moderator", true) // role: read only
note.acl = acl
note.saveInBackground { e ->
if (e != null) Log.w("ACL", "save failed: ${e.code}")
}
// The class gate above it is schema config, set in the dashboard:
// find/get requiresAuthentication, create authenticated, addField off CLP vs. ACL vs. Master Key: welche Kontrolle was tut
| Kontrolle | Geltungsbereich | Wo eingestellt | Wie sie versagt |
|---|---|---|---|
| Klassenberechtigung | Ganze Klasse, pro Operation | Schema (Dashboard) | Auf permissiven Standards belassen |
| ACL | Ein Objekt | An jeder Zeile, beim Speichern | Bei neuen Objekten vergessen |
| Geschützte Felder | Eine Spalte | Schema | Sensible Spalten für andere lesbar |
| Master Key | Umgeht alles Obige | Nur Serverumgebung | In einem Client-Binary ausgeliefert |
Die ersten drei fügen sich zu einer Leiter der Berechtigungen, die jede Anfrage erklimmen muss. Die vierte ist der Notausstieg dieser Leiter – serverseitig unverzichtbar, überall sonst katastrophal. Und die Kennungen, die Apps tatsächlich ausliefern – die App-ID und die Client-API-Schlüssel – gehören in eine völlig andere gedankliche Kategorie: Sie lassen sich aus jedem Binary extrahieren, also identifizieren sie die App, statt sie zu schützen. Gehen Sie davon aus, dass sie öffentlich sind, und lassen Sie die Datenschicht die Durchsetzung übernehmen.
Wo eine feindliche Anfrage stirbt
Das Diagramm ist zugleich das Prüfskript: Fragen Sie an jeder Schranke, was passiert, wenn ein Angreifer mit Ihren öffentlichen Schlüsseln als anonymer Benutzer, als angemeldeter Benutzer und als Benutzer eines anderen Tenants ankommt. Jedes “erlaubt”, das Sie überrascht, ist der Befund.
So härten Sie ein BaaS-Backend
| Schritt | Maßnahme | Was sie schließt |
|---|---|---|
| 1 | CLPs jeder Klasse setzen: mindestens requiresAuthentication, Schreibzugriffe auf Rollen begrenzt | Der klassische anonyme Komplettabzug einer Tabelle |
| 2 | addField auf allen Klassen und die Klassenerzeugung durch Clients abschalten | Schema-Drift und das Einschleusen von Müllklassen |
| 3 | Standard-ACL auf benutzereigenen Objekten: Eigentümer lesen/schreiben, öffentlich nichts | Lese- und Schreibzugriffe über Benutzergrenzen hinweg |
| 4 | Sensible Spalten (E-Mail, Tokens, Punktestände) mit Regeln auf Feldebene schützen | Andere Benutzer, die private Attribute lesen |
| 5 | Master Key auf Serverumgebungen beschränken; planmäßig und bei jeder Offenlegung rotieren | Die Offenlegung durch die Totalumgehung |
| 6 | Sensible Schreibzugriffe über Cloud-Code-Funktionen leiten, mit verriegelten Klassen dahinter | Verstöße gegen Geschäftsregeln und Manipulation |
| 7 | Auth-Endpoints und teure Abfragen mit Rate Limits versehen | Credential Stuffing und massenhaftes Scraping |
| 8 | Aus einem echten Client mit nur öffentlichen Schlüsseln erneut testen; Nutzung des Master Keys protokollieren und durchsehen | Unbemerkte Konfigurationsdrift |
Die Schritte 1 bis 4 sind Durchsetzung auf der Datenschicht – deklarativ, auf jedem Pfad geprüft. Die Schritte 5 bis 8 sind operative Disziplin. Beide Hälften sind nötig; keine allein genügt.
Disziplin beim Master Key und der privilegierte Pfad
Den Master Key gibt es, weil jemand Legitimes – Migrationen, Admin-Werkzeuge, geplante Jobs – die Schranken ignorieren können muss. Disziplin heißt, ihn wie das Root-Credential zu behandeln, das er ist: als Konfiguration in Serverumgebungen eingespeist, nie committet, nie protokolliert, nie in etwas eingebettet, das ein Benutzer herunterlädt, und pro Operation eingesetzt statt als sitzungsweiter Standard gehalten. Die Rotation ist die unterschätzte Hälfte – Schlüssel sickern still in CI-Protokolle und alte Laptops, also deckelt planmäßiges Rotieren (und sofortiges bei jedem Verdacht) den Schadensradius einer Offenlegung, die Sie nie bemerken.
Cloud Code ist das Muster, das strenge Regeln auf der Datenschicht lebbar macht. Verriegeln Sie eine Klasse vollständig – gar keine Schreibzugriffe von Clients – und stellen Sie eine Serverless-Funktion als einzige Tür bereit. Die Funktion validiert die Eingabe, setzt Geschäftsregeln durch, die das Schema nicht ausdrücken kann (“nur bevor die Bestellung das Lager verlässt”), schreibt mit erhöhten Rechten und hinterlässt eine Prüfspur. Die Schranke der Klasse garantiert, dass der Engpass nicht umgangen werden kann; der Engpass hält die Logik an einer Stelle prüfbar.
Typische Anwendungsfälle
- Die Verriegelung vor dem Start. Die vollständige Checkliste von oben, einmal ausgeführt, bevor echte Benutzer ankommen – die wirkungsvollste Sicherheitsstunde, die ein kleines Team investiert.
- Multi-Tenant-Datenisolation. Auf den Eigentümer begrenzte ACLs plus CLPs, die Authentifizierung verlangen, sodass Tenant A niemals Tenant B abfragen kann – durchgesetzt unterhalb des Anwendungscodes.
- Zahlungen und Bestände. Klassen ohne jeden Schreibzugriff von Clients, mit Cloud-Code-Funktionen als geprüftem Pfad für alles, was Geld oder Lagerbestand berührt.
- Reaktion auf Vorfälle. Ein offengelegter Schlüssel oder eine Überraschung in den Protokollen löst Rotation, eine Zugriffsüberprüfung und einen erneuten Berechtigungstest von außen aus.
- Compliance-Nachweise. Eine versionierte Berechtigungsmatrix und Protokolle zur Nutzung des Master Keys machen aus “wir nehmen Sicherheit ernst” ein Artefakt, das ein Prüfer lesen kann.
Sollten Sie auf der Datenschicht oder im Anwendungscode härten? Entscheidungsmatrix
| Auf der Datenschicht durchsetzen (CLPs + ACLs), wenn… | Im Anwendungscode durchsetzen (Cloud Code), wenn… |
|---|---|
| Die Regel Identität und Eigentum betrifft | Die Regel Geschäftslogik oder Zustand über mehrere Objekte braucht |
| Sie auf jedem Pfad halten muss, auch für künftige Clients | Ein einziger geprüfter Engpass die Anforderung ist |
| Ein Schalter im Dashboard die ganze Spezifikation ist | Validierung, Anreicherung oder Nebenwirkungen mitfahren |
| Sie Sicherheit wollen, die App-Neuschreibungen überlebt | Die Regel sich schneller ändert, als das Schema es sollte |
| Das Vergessen katastrophale Folgen hätte | Das Vergessen einen Geschäftsfehler erzeugt, keinen Einbruch |
In der Praxis ist die Antwort gestaffelt statt entweder-oder: Regeln auf der Datenschicht als Boden, der immer hält, Funktionen auf der Anwendungsschicht für alles Bedingte – dieselbe Anfrage durchläuft beides.
Grenzen und Trade-offs
- Härtung ist Konfiguration, und Konfiguration driftet. Neue Klassen kommen mit permissiven Standards; ohne die Gewohnheit, erneut zu prüfen, erodiert die Verriegelung vom letzten Jahr geräuschlos.
- Deklarative Regeln können keine Logik ausdrücken. “Nur Eigentümer” ist ein Schalter; “nur innerhalb von 30 Tagen erstattungsfähig” ist Code – wer sich zu sehr auf die Datenschicht verlässt, verbiegt Schemas, statt eine Funktion zu schreiben.
- Strenge geht zulasten der Developer Experience. Verriegelte Klassen und eingefrorene Schemas bremsen das Prototyping, weshalb die Disziplin gestuft ist: offen in der Entwicklung, verriegelt zum Start.
- Rate Limits und Prüfungen brauchen Feinjustierung. Zu enge Limits drosseln legitime Lastspitzen; ungelesene Protokolle sind Dekoration. Beides braucht einen Verantwortlichen, nicht nur einen Einrichtungs-Commit.
- Die Schichten schützen Daten, nicht alles. Schwachstellen in Abhängigkeiten, geleakte Benutzerpasswörter und Social Engineering liegen außerhalb dieses Modells – die Datenschicht zu härten ist nötig, nicht hinreichend, wie der Katalog OWASP API Security Top 10 unmissverständlich zeigt.
BaaS-Sicherheitshärtung mit Back4app
Back4app ist eine Open-Source-Plattform für Backend as a Service (BaaS), die eine verwaltete Datenbank, automatisch generierte REST- und GraphQL-APIs, Authentifizierung, Dateispeicher und Serverless-Funktionen mit Cloud Code kombiniert. Die Checkliste dieses Artikels bildet sich fast eins zu eins auf ihr Dashboard ab: Klassenberechtigungen und geschützte Felder sind Checkboxen pro Klasse, ACLs werden bei jeder Anfrage serverseitig durchgesetzt – über SDKs, REST und GraphQL –, und der Master Key bleibt in der Serverkonfiguration, wo Cloud Code als privilegierter Pfad ihn pro Operation verwenden kann. Die Sicherheitsrichtlinien gehen denselben Durchgang Schritt für Schritt durch, sodass das Härten eines Backends ein Nachmittag voller Schalter plus ein ehrlicher Test von außen ist.
Häufige Fragen
Was ist BaaS-Sicherheitshärtung?
Der Durchgang vor dem Start, der ein permissives Entwicklungs-Backend in ein verriegeltes Produktions-Backend verwandelt: Klassenberechtigungen pro Operation eingeschränkt, ACLs pro Objekt auf Benutzerdaten, der Master Key auf Servercode beschränkt, Schemaänderungen eingefroren, Rate Limits gesetzt und die Konfiguration aus einem echten Client heraus geprüft. Jede Kontrolle deckt eine andere Schicht ab, und die Schichten werden bei jeder Anfrage der Reihe nach geprüft.
Ist die Application ID ein Geheimnis?
Nein – behandeln Sie sie als öffentlich. Client-Schlüssel und App-IDs werden in jedem Mobile-Binary und auf jeder Seite JavaScript ausgeliefert, wo jeder sie extrahieren kann. Sie identifizieren die App; sie authentifizieren den Aufrufer nicht. Echter Schutz entsteht aus dem, was das Backend nach der Identifikation durchsetzt: Klassenberechtigungen, ACLs und Authentifizierung – die Schichten, die halten, auch wenn jeder clientseitige Schlüssel bekannt ist.
Warum darf der Master Key nie in einer Client-App ausgeliefert werden?
Weil er jede Schranke umgeht: Klassenberechtigungen, ACLs, geschützte Felder und Authentifizierungsprüfungen sind für Anfragen mit dem Master Key allesamt wirkungslos. Ein in ein Client-Binary eingebetteter Schlüssel lässt sich von jedem extrahieren, der den Download hat – und Ihre gesamte Datenbank wird öffentlich les- und schreibbar. Der Master Key gehört ausschließlich in serverseitigen Code: pro Operation eingesetzt, nie dort gespeichert, wo ein Client ihn erreicht.
Was ist der Unterschied zwischen CLPs und ACLs?
Der Geltungsbereich. Eine Klassenberechtigung ist eine Regel am Schema und beantwortet "wer darf diese Operation auf dieser Klasse überhaupt ausführen"; eine ACL sind Daten an jedem Objekt und beantworten "wer darf diese Zeile anfassen". Anfragen passieren zuerst die Schranke der Klasse, dann die des Objekts, und beide können verweigern. Härtung nutzt beides: grobe Striche am Schema, feines Korn an den Zeilen.
Wie rotiert man einen offengelegten Master Key?
Sofort einen neuen Schlüssel im Dashboard der Plattform erzeugen, jeden serverseitigen Konsumenten aktualisieren – Cloud Code, Jobs, Admin-Skripte, CI – und den alten Schlüssel widerrufen. Danach prüfen, was der offengelegte Schlüssel in seiner Gültigkeitszeit berührt haben kann. Rotation sollte außerdem Routine sein, nicht nur Reaktion auf einen Vorfall: Schlüssel altern in Protokolle, Backups und alte Laptops hinein, also planen Sie die Rotation wie eine Zertifikatserneuerung.
Wann sollten Schreibzugriffe über Cloud Code statt über das SDK laufen?
Immer dann, wenn die Regel Logik braucht und nicht nur Identität: Invarianten über mehrere Objekte, Preisbildung, Bestandsführung, alles rund um Geld oder Kontingente. Das gehärtete Muster verriegelt die Klasse, sodass Clients nicht direkt schreiben können, und stellt eine Cloud-Code-Funktion als einzige Tür bereit – Validierung, Anreicherung und Audit-Protokollierung fahren mit, und die Schranke der Klasse garantiert, dass niemand um den Engpass herumkommt.
Gehören Rate Limits in ein BaaS-Sicherheitskonzept?
Ja – Berechtigungen entscheiden, wer einen Endpoint aufrufen darf; Rate Limits entscheiden, wie oft. Ohne sie werden gültige Zugangsdaten zum Werkzeug für Scraping oder Brute Force: Anmelde-Endpoints geraten unter Credential Stuffing, offene Abfragen werden mit Leitungsgeschwindigkeit abgeerntet. Setzen Sie strengere Limits auf Authentifizierungsrouten und teure Abfragen und koppeln Sie sie an Alarmierung, damit ein auffälliger Lastanstieg die Rufbereitschaft alarmiert und keine Überraschungsrechnung erzeugt.
Wie prüft man eine BaaS-Sicherheitskonfiguration?
Testen Sie von außen, wie ein Angreifer es täte: Versuchen Sie allein mit den öffentlichen Client-Schlüsseln, jede Klasse zu lesen und zu beschreiben – als anonymer Benutzer, als authentifizierter Benutzer und als Benutzer eines anderen Tenants. Alles, was gelingt und nicht gelingen sollte, ist ein Befund. Wiederholen Sie das nach Schemaänderungen, halten Sie die Berechtigungsmatrix in versionierter Dokumentation und sehen Sie die Protokolle auf Nutzungsmuster des Master Keys durch, die es nicht geben dürfte.