Normalerweise kann auf Dateien unter:
zugegriffen werdenIch möchte den Pfadnamen (/cats/cat1.zip) verschlüsseln / verschlüsseln, so dass die Verbindung normalerweise nicht zugänglich ist, aber zugänglich ist, nachdem der Pfadname verschlüsselt / codiert wurde:
Ich verwende die base64-Codierung zur Vereinfachung, würde aber eine Verschlüsselung bevorzugen. Wie mache ich das? Muss ich ein benutzerdefiniertes Modul schreiben?
Wenn Sie nur den Zugriff auf bestimmte URLs einschränken möchten, können Sie sich diesen Beitrag zum Sichern von URLs mit dem Secure Link-Modul in Nginx .
Es bietet eine recht einfache Methode zum Sichern Ihrer Dateien - die einfachste und einfachste Möglichkeit zum Verschlüsseln Ihrer URLs besteht in der Verwendung der secure_link_secret
-Direktive:
Die URL für den Zugriff auf die cat1.zip
-Datei wird http://example.com/cats/80e2dfecb5f54513ad4e2e6217d36fd4/cat1.zip
sein, wobei 80e2dfecb5f54513ad4e2e6217d36fd4
der MD5-Hash ist, der für eine Textzeichenfolge berechnet wird, die zwei Elemente verkettet:
cat1.zip
secure_link_secret
-Direktive, in diesem Fall yoursecretkey
Das obige Beispiel geht davon aus, dass die über die verschlüsselten URLs zugänglichen Dateien im Verzeichnis /path/to/secret/files/secure
gespeichert sind.
Zusätzlich gibt es eine flexiblere, aber auch komplexere Methode, um URLs mit ngx_http_secure_link_module
-Modul zu sichern, indem Sie die Direktiven secure_link
und secure_link_md5
verwenden, um den URL-Zugriff nach IP-Adresse zu begrenzen, Ablaufzeit von definieren die URLs usw.
Wenn Sie Ihre URLs vollständig verdecken müssen (einschließlich des cat1.zip -Teils), müssen Sie eine Entscheidung treffen zwischen:
Beide Ansätze haben Vor-und Nachteile, aber IMO letzteres ist einfacher und flexibler - sobald Sie Ihren Proxy eingerichtet haben, müssen Sie sich nicht viel Gedanken über Nginx machen, noch müssen Sie es mit einigen speziellen Voraussetzungen kompilieren; Es ist nicht erforderlich, Code in einer anderen Sprache zu schreiben oder zu kompilieren, als Sie bereits in Ihrer Anwendung geschrieben haben (es sei denn, Ihre Anwendung enthält Code in C, Lua oder Perl).
Hier sehen Sie ein Beispiel für eine einfache Nginx / Express-Anwendung, in der Sie die Entschlüsselung in Ihrer Anwendung durchführen. Die Nginx-Konfiguration könnte wie folgt aussehen:
%Vor%und auf der Seite der Anwendung (Node.js / Express) haben Sie vielleicht etwas wie:
%Vor% Im obigen Beispiel wird davon ausgegangen, dass sich die gesicherten Dateien im Verzeichnis /path/to/secured/files
befinden. Außerdem wird davon ausgegangen, dass Sie die Dateien zum Herunterladen senden, wenn die URL zugänglich ist (richtig verschlüsselt), aber die gleiche Logik würde gelten, wenn Sie etwas anderes tun müssen.
Am einfachsten wäre es, ein einfaches Backend zu schreiben (mit Schnittstellen zum Beispiel über proxy_pass
), das den Code entschlüsseln würde Dateiname aus $uri
und liefert die Ergebnisse innerhalb des Headers X-Accel-Redirect
response (der proxy_ignore_headers
in nginx unterliegt ), die anschließend einer internal
Weiterleitung innerhalb von nginx (an einen Ort, auf den nicht zugegriffen werden kann, ohne das Backend zu durchlaufen) unterliegen zuerst), und diente mit allen Optimierungen, die bereits Teil von Nginx sind.
Der obige Ansatz folgt der "Microservices" -Architektur, da die einzige Aufgabe Ihres Entschlüsselungsdienstes darin besteht, die Entschlüsselung und Zugriffskontrolle durchzuführen und es nginx zu überlassen, um sicherzustellen, dass die Dateien korrekt und auf die effizienteste Weise durch die Verwendung von der interne speziell behandelte X-Accel-Redirect
HTTP-Antwortheader.
Sie können eine Nginx-Rewrite-Regel verwenden, die die URL umschreibt (von encodiert zu uncoded) . Und um Ihre Codierungslogik anzuwenden, können Sie eine benutzerdefinierte Funktion verwenden (ich habe es mit dem Modul perl ).
Könnte so etwas sein:
%Vor%Tags und Links configuration nginx encryption