Azure Websites Verzeichnis schützen

Microsoft hat ein Geschenk für uns. Azure Websites erlauben das gratis Hosting einer Web Anwendung. Einzig eine Microsoft ID wird benötigt und schon kann man zehn Websites mit bis zu 1GB Speicherplatz nutzen. Bis zu 165MB Datentransfer täglich sind ebenfalls gratis inkludiert. Allerdings ist der Umstieg von einem eigenen IIS zu Azure Websites nicht ganz barrierefrei.

Zu den typischen Aufgaben einer Website gehört der Upload von Dateien durch den Benutzer. In der Regel schreibt der ASP.NET Entwickler einen http Handler (Erweiterung axd) um den Uploadstream entgegen zu nehmen und auf dem Web Server zu speichern. So behält man volle Kontrolle über Größe, Format, Namen und Speicherort. Bisher hat man diese Dateien in einem Verzeichnis der Website gespeichert und möchte das auch weiter so lösen. Alternativ dient dazu auch der Azure Blob Storage.

Fileupload in ein Web Verzeichnis kann ein potentielles Sicherheitsproblem sein. Ein Benutzer kann eine ausführbare Datei (z.B. ASPX) hochladen und somit Code einschleusen. Das Upload Verzeichnis muss also vor ausführbaren Programmcode geschützt werden. Einige ASP.NET Directorys werden out of the box mit besonderen Rechten versehen. So ist alles was in APP_DATA existiert automatisch und zwingend vor Download geschützt. In der Praxis legt man dort seine Datenbanken ab.

Wer einen dedizierten Server mit IIS betreibt hat volle Kontrolle über das NTFS Dateisystem und kann die Rechte dort passend pro User (appool) einstellen.

Beim Publish auf Azure stehen diese Möglichkeiten nicht offen. Man behilft sich mit einer Ausnahmeregel in der Web.config. Sämtliche Datei Handler werden entfernt und mit dem Static File Handler ersetzt so das man nach wie vor Images, Videos oder auch HTML anzeigen bzw. Downloaden kann. Die Ausführung von Code in einer ASPX Datei wird mit einer 404er Fehlermeldung beantwortet.

 

   1:  <location path="app_upload">
   2:      <system.webServer>
   3:        <handlers>
   4:          <clear />
   5:          <add name="StaticFile" path="*" verb="*" 
modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule"
   6:  resourceType="Either" requireAccess="Read" />
   7:        </handlers>
   8:      </system.webServer>
   9:    </location>
  10:  </configuration>
Kommentare sind geschlossen