[Django] Recht für Mediafiles

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

MoinMoin,

für ein aktuelles kleines Projekt (nur aus Spaß an der Freude, nichts wirklich großes), benötige ich Rechtevergabe für Statische Dateien in Django.

Szenario:
Ein Nutzer läd z.B. ein Bild hoch, und soll dann festlegen können, ob es a) öffentlich zu sehen seien soll, b) nur für eine bestimmte Nutzergruppe zugänglich ist, oder c) Privat ist, also das nur er/sie es sehen kann.

Die Frage ist jetzt: wie setzte ich das am besten um?
Ich habe bis jetzt folgende Möglichkeiten in die engere Auswahl genommen:

1) Ich lasse Django die Datei ausliefern, und schreibe dann view-Funktionen, die die Rechte checken und dann die Datei aus einem für den Webserver nicht zugänglichen Pfad laden und zurückgeben (PIL).
Vorteil: Sehr einfaches Handling der Rechte, sehr sicher, urls können weiter gegeben werden und bleiben immer gültig
Nachteil: Permormance geht in den Keller, skaliert scheiße.

2) Ich nutze mod_secdownload vom lighttpd und damit einen eigenen Webserver für die Dateien.
Vorteil: Skaliert besser, auch sicher
Nachteil: die url der Bilder ändert sich immer, können also nicht gebookmarkt werden und ich habe noch keinerlei Erfahrung mit dem lighttpd

Andere Möglichkeiten, die ich gefunden habe, sind direkt rausgeflogen:
- apache_auth: zu unflexibel
- nicht erratbare Dateinamen: zu unsicher (urls könnten weiter gegeben werden an jemanden, der nicht die Rechte hat).


So, und jetzt ihr: Wie würdet ihr das umsetzten? Welche Nach- oder Vorteile seht ihr? Gibt es noch andere Möglichkeiten?

Gruß,
r.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Die einfachste Möglichkeit ist IMHO, die Zugriffsrechte mit Django zu implementieren und alle Dateien über einen Django-View zu filtern (also dein "1)"). Da es "nichts wirklich großes" ist, sollte das doch von der Geschwindigkeit ausreichen. Und skalieren tut es auch mit der Anzahl der Python-Prozesse.

Ich vermute, secdownload funktioniert, indem kurzfristig gültige access token generiert und als Teil der URL verwendet werden. Diese lässt Lighttpd dann durch, andere nicht. Wer schnell ist, kann diese URL also weitergeben und so jemandem ohne das Zugriffsrecht den Zugriff erlauben. Ich vermute weiterhin, dass die access token nonces sind, d.h. nur einmal gültig sind. Das macht die Weitergabe zumindest unpraktikabel. Allerdings handelt es sich ja eh nur um Bilder, die kann man auch leicht außerdem deines Servers weitergeben.

Wenn du die Zugriffsrechte auch nach dem Download erwzingen willst - also den Anwender nicht traust, brauchst du eine DRM-Lösung. Wenn du ihnen traust, dass sie URLs nicht weitergeben, reichen auch nicht-ratbare URLs. Diese hätten den Vorteil, dass Python die Zugriffe nicht filtern muss.

DRM erfordert einen vertrauenswürdigen Client. Dies funktioniert eigentlich nur bei Geräten, an denen die Anwender nicht selbst fummeln, wie Spielkonsolen oder Handys. Für Handys gibt es wiederum den DRM-Standard OMA DRM 1.0 & 2.0 bzw. 2.1. Für deinen Fall reicht DRM 1.0, genauer gesagt ein Forward-Lock. Den erreichst du, indem du aus dem Bild eine sogenannte DRM-Message machst, die wiederum wie eine MIME-Nachricht aussieht und mit einem bestimmten Content-Type vom Server geschickt werden muss.

Stefan
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Interessant wäre mal zu checken, in wie weit es sich auf die Performance auswirkt, wenn Django die Statischen/Medien Dateien ausliefert, und eben nicht ein eigener Server.
Gibt es da einfach Tools für Last-Tests?
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mir fallen Apache Bench und JMeter ein.

Stefan
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Das sieht ja schon mal gut aus, da werde ich mal ein wenig mit rum spielen.
Danke!
Antworten