2010-10-27 3 views
5

Um Hot-Linking, S3-Bandbreiten-Leeching usw. zu vermeiden, möchte ich meinen Bucket privat machen und die Dateien über eine Rails-App bereitstellen. Das Konzept klingt im Allgemeinen sehr einfach, aber ich bin mir nicht ganz sicher, welcher Ansatz für die Situation am besten ist.Wie Proxy-Dateien von S3 durch Rails-Anwendung, um Leeching zu vermeiden?

Ich benutze Büroklammer für allgemeine Vermögensverwaltung. Gibt es einen eingebauten Weg, um diese Art von Proxy zu erreichen?

Im Allgemeinen kann ich die URLs von der Büroklammer leicht analysieren und sie auf meine eigene Steuerung verweisen. Was soll von diesem Punkt an geschehen? Soll ich das Image einfach mit Net :: HTTP herunterladen und dann mit send_data bereitstellen? Zwischendurch will ich Referer protokollieren und richtige Control-Cache-Header setzen, da ich einen Reverse-Proxy vor der App habe. Ist Net :: HTTP + send_data in diesem Fall sinnvoll?

Vielleicht sind ganze Ideen wirklich schlecht, aus bestimmten Gründen bin ich mir in diesem Moment nicht bewusst? Ich glaube ich allgemein, dass die direkte S3 Anbindung an den öffentlichen Eimer schwelgt gefährlich ist und die Ausbeute in einigen ernsthaften Problemen bei leeching/hot-Linking ...

Update:

Wenn Sie andere Ideen haben, wo reduziere die S3-Rechnung und verhindere das Hot-Linking-Leeching in jedem Fall bitte, auch wenn sie nicht direkt mit Rails in Verbindung stehen.

+0

Haben Sie zur Zeit ein Problem mit dem Leeching? Ich würde nur ungern etwas tun, das meine Bewerbung dramatisch verlangsamen würde, nur um ein Problem zu lösen, das ich in der Zukunft haben könnte. – mikerobi

+0

Es geht nicht nur darum, ein potenzielles Problem zu lösen. Ich möchte einfach nicht mit einer überwältigenden S3-Rechnung aufwachen, die ich mir nicht leisten kann ... Ich bin mir nicht sicher, ob das die Anwendung "dramatisch" verlangsamen wird, wenn die Vermögenswerte in Memcache/Reverse gehalten werden Proxy. – mdrozdziel

Antwort

1

Ich würde wahrscheinlich vermeiden, dies zu tun - zumindest bis ich keine andere Wahl hätte.

Sie müssen berücksichtigen, dass Sie wahrscheinlich auch die Bandbreite Rechnung hinzufügen, wenn Sie das Bild jedes Mal herunterladen. Wenn Sie jedes Bild über ein Skript verarbeiten, benötigen Sie außerdem mehr CPU und RAM, um dies zu erreichen. Nicht die größte Aussicht - IMHO.

Ich würde wahrscheinlich enable the access logs für Amazon S3 und schreibe ein Werkzeug klein, um die Nutzung zu analysieren und die Berechtigungen für den Eimer/Objekt zu ändern, falls die Nutzung das Dach geht. Führen Sie dies als ein Cronjob alle 10 Minuten oder so, und Sie sollten sicher sein?

Sie könnten auch s3stat verwenden. Sie bieten auch einen kostenlosen Plan an.

Bearbeiten: Gemäß meiner Empfehlung für Varnish, ich bin ein Link zu a blog entry about preventing hotlinking using Varnish hinzufügen.

+1

Ich kenne natürlich die Schattenseiten, deshalb frage ich nach einer Lösungsidee. Im Allgemeinen ist es nicht so schlimm. Beachten Sie, dass Bilder in den meisten Fällen ausgiebig eingelöst werden können. Bei einigen Recherchen kam ich zu der Überzeugung, dass der Reverse-Proxy vor S3 am effektivsten wäre, anstatt ihn zu benutzen. Ich kann auch alles dort machen - prüfe den Referer, mache eine ausführliche Log-Analyse. Ein solches Frontend würde die S3-Rechnung dramatisch verbessern und die Performance sollte am Ende nicht geringer sein. – mdrozdziel

+0

Ja, das klingt gut - ich würde Lack empfehlen. :) Denken Sie daran, dass, obwohl die Bilder zwischengespeichert werden, Sie auch ein _komplizierter_ Setup ausführen, indem Sie einen anderen Dienst hinzufügen. Und benötigen möglicherweise auch mehr Verarbeitungsleistung (z. B. eine Instanz oder zumindest Ressourcen) für den Proxy. – Till

4

Verwenden Sie (private | private Dateien) und verwenden Sie signierte URLs für die in S3 gespeicherten Dateien.

Die Signatur enthält eine Ablaufzeit (z. B. 10 Minuten von jetzt an, was immer Sie festlegen möchten) sowie einen kryptografischen Hashwert. S3 verweigert die Zustellung von Dateien, wenn die Signatur ungültig ist oder wenn die Ablaufzeit abgelaufen ist.

Dies ist nützlich, da nur Sie gültige URLs für Ihre privaten Dateien in S3 erstellen können und Sie steuern können, wie lange die URLs gültig bleiben. Dies verhindert Leeching, da Leachers ihre eigenen URLs nicht signieren können. Wenn sie eine von Ihnen signierte URL erhalten, läuft diese URL sehr kurz ab und kann danach nicht mehr verwendet werden.

5

Da oben keine Schrauben und Muttern zu finden waren, hier ein kleines Codebeispiel zum Streamen einer Datei, die in S3 gespeichert ist.

render :text => proc { |response, output| 
    AWS::S3::S3Object.stream(path, bucket) do |segment| 
    output.write segment 
    output.flush # not sure if this is needed 
    end 
} 

Abhängig von Ihrem Webserver kann dies (nicht reinrassig) oder auch nicht (webrick) arbeiten, so nicht zu sehr frustriert, wenn sie nicht in der Entwicklung nicht streamen.

1

eine vorübergehende Pre-signierten URLs:

def show 
     redirect_to Aws::S3::Presigner.new.presigned_url(
     :get_object, 
     bucket: 'mybucket', 
     key: '/folder/file.pdf' 
     expires_in: 60) 
    end 

S3 verteilt noch den Inhalt, so dass Sie die Arbeit von Rails-Offload (die es sehr langsam ist), behandelt HTTP-Caching, HEAD Operationen und verwendet Amazon CDN .

Verwandte Themen