Montag, 24. Dezember 2012

Sicherheit in der GAE - Teil 3

Die Sandbox

Alle Anwendungen der GAE werden in einer Sandbox ausgeführt. Diese stellt Anwendungen einen eingeschränkten Interpreter für die jeweilige Sprache sowie eine API für alle von der GAE bereitgestellten Zusatzdienste bereit. Gleichzeitig erzwingt sie die Abgrenzung zwischen der Anwendung und der darunter liegenden Plattform.

Anwendungen werden beim Upload in der GAE in einen Anwendungscontainer zusammengefasst. Dieser enthält alle Anwendungsdateien und Ressourcen, jedoch nicht die Verzeichnisse, die über die Konfigurationsdateien direkt als statischeVerzeichnisse nach außen freigegeben sind. Der Anwendungscontainer ist read-only, d.h. es ist nicht möglich aus einer Anwendung heraus in das Dateisystem zu schreiben. Dies schützt die Anwendung im Falle einer Kompromittierung vor Manipulationen des Programmcodes und der in diesem Container mitgelieferten Ressourcen [1]. Bis Version 1.7.2 war die Anzahl der Dateien aus der die Anwendung bestehen kann (inkl. der statischen Dateien und Ressourcen) auf 10.000 und die Gesamtgröße dieses Containers auf 1Gb beschränkt [2].


Abschirmung der Plattform

Die Sandbox verhindert den Zugriff auf die darunterliegende Plattform und das Betriebsystem, indem verschiedene Funktionen des Interpreters abgeschaltet sind. Im Gegensatz zur Java-Version der GAE, bei der einzelne Klassen der Standardbibliothek freigeschaltet sind [3], sind bei Python fast alle Module, die in Python selbst geschrieben sind, verfügbar. Allerdings sind nahezu alle Erweiterungen, die in C geschrieben sind, entfernt. So sind neben dem ctypes-Modul, das Zugriff auf Funktionen von externen Librarys ermöglicht, auch das _socket Modul nicht verfügbar.

Abschirmung des Internets

Neben dem Schutz der Anwendung und der Plattform selbst sind auch Maßnahmen ergriffen, um andere Systeme und Netzwerke im Internet vor Angriffen aus der GAE heraus zu schützen. So besteht keine Möglichkeit aus der GAE eine direkte Verbindung zu anderen Systemen im Internet aufzubauen. Für das abrufen von URLs steht ein Proxy zur Verfügung, der verschiedene HTTP-Header in der ausgehenden Anfrage erzwingt [4]. Für den Versand und Empfang von E-Mails steht ebenfalls eine API zur Verfügung, die die E-Mails über einen Proxy leitet und so beispielsweise Missbrauch durch eine gefälschte Absenderkennung verhindert [5]. Allerdings wird die Möglichkeit, direkt ausgehende IP-Verbindungen zu erlauben z.Z. von Google getestet [6, App Engine 1.7.2 Released]. Damit könnten diese Beschränkungen in einer zukünftigen Version entfernt werden.

[1] Python Runtime Environment
https://developers.google.com/appengine/docs/python/runtime

[2] Google App Engine Python SDK Release Notes
http://code.google.com/p/googleappengine/wiki/SdkReleaseNotes

[3] The JRE Class White List
https://developers.google.com/appengine/docs/java/jrewhitelist

[4] URL Fetch Python API
https://developers.google.com/appengine/docs/python/urlfetch/overview

[5] Mail Python API
https://developers.google.com/appengine/docs/python/mail/overview

[6] News, Notes, tips and tricks from the Google App Engine Team
http://googleappengine.blogspot.de