Lighttpd Hotlinking Protection mit mod_secdownload

Will man seinen mit Lighttpd angebotenen Content vor Direktverlinkung (Hotlinking) schützen, hat man mehrere Möglichkeiten. Die wohl einfachste ist ein Referercheck der ggf. den Aufruf umleitet oder ablehnt. Leider sendet aber nicht jeder Browser/jedes Plugin einen Referer und das kann problematisch werden. Eine weitere Lösung ist der Einsatz von mod_trigger_b4_dl. Mit diesem Modul kann man den Download nur bestimmten IP Adressen erlauben. Die erlaubten IP Adressen speichert man bevor man den User zum Download leitet in einer gdbm Datenbank oder in einer memcache Instanz. Ist die User IP in der Datenbank vorhanden startet der Download. Ist sie nicht vorhanden wird der User auf eine andere Seite umgeleitet. Nach einer bestimmten Zeit werden die IP Adressen wieder aus dem Zwischenspeicher entfernt.
Die Lösung die ich in diesem Artikel beschreiben möchte sind temporäre Links, die nach einer definierten Zeit nicht mehr gültig sind und damit nicht weitergegeben werden können oder auf fremden Seiten eingebunden werden können. Das Lighttpd Modul dafür heißt mod_secdownload und gehört zum Standardpaket des Webservers. Mit mod_secdownload werden per Passphrase verschlüsselte Links erstellt die nur für eine bestimmte Zeit gültig sind. Nach dieser Zeit wird die Anfrage des Links abgelehnt und der User bekommt eine "HTTP 410 Gone" Error Meldung. Wenn ein User die URL von Hand bearbeitet, bekommt er eine 403 Forbidden Meldung angezeigt. Ein weiterer Vorteil dieses Moduls ist das man seinen Content außerhalb der Document Root des Webservers aufbewahren kann/muss und ihn nur über die geschützten Links zur Verfügung stellen kann.
In dieser Anleitung wird von einem Debian Lenny mit Lighttpd 1.4.19 ausgegangen. Alle Einstellungen für mod_secdownload kann man entweder für den ganzen Lighttpd Webserver definieren oder für einzelne Vhosts.
Installation und Konfiguration von mod_secdownload
Wie schon erwähnt ist das Modul Standardmäßig beim Lighttpd dabei. Man muss es also nur noch in der lighttpd.conf aktivieren und konfigurieren.
$ nano /etc/lighttpd/lighttpd.conf
Setzt man ein Streaming Modul ein wie mod_h264_streaming oder mod_flv_streaming und möchte den darüber ausgelieferten Content per mod_secdownload schützen, dann muss mod_secdownload vor den Streaming Modulen geladen werden, also in der Auflistung vor ihnen stehen!
server.modules = (
...
"mod_secdownload",
...
)
secdownload.secret = "Sichere-Passphrase"
secdownload.document-root = "/pfad/zum/download/content/"
secdownload.uri-prefix = "/download/"
secdownload.timeout = 3600
- secdownload.secret: Ist das sichere Passwort was zum verschlüsseln des Links benutzt wird. Es ist nur dem Content auslieferden Webserver und dem Linkanbietenden Server bekannt.
- secdownload.document-root: Der Pfad zu dem zu schützenden Content. Der Ordner muss außerhalb der Webroot / Document Root des Servers/Vhosts liegen!
- secdownload.uri-prefix: Ein URL Prefix der vor die geschützte URL gesetzt wird. Default = /
- secdownload.timeout: Zeitangabe in Sekunden nach der der Link nicht mehr funktionieren soll. Default = 60
$ /etc/init.d/lighttpd restart
mod_secdownload URL Format
Der Aufbau eines mod_secdownload Links ist immer gleich:
http://host-oder-ip/uri-prefix/mp5token/hex-timestamp/datei
Zum Beispiel so:
http://www.debianroot.de/download/ed076287532e86365e841e92bfc50d8c/1451ds451/test.mp4
Der Prefix wird in der Config definiert. Der Token ist ein md5 Hash auf die Secret Passphrase + datei + hex-timestamp. Der hex-timestamp ist der aktuelle UNIX Timestamp in Hex. Der Dateipfad fängt immer mit einem Slash (/) an! Es ist der relative Pfad beginnend mit einem / ab dem in secdownload.document-root definierten Pfad. Hier ein PHP Code Beispiel:
<?php
$url = 'http://www.debianroot.de';
$secret = 'Sichere-Passphrase';
$prefix = '/download/';
$time = time();
$timehex = sprintf("%08x", $time);
# fängt immer mit einem Slash an!
# ist der relative Pfad unter /pfad/zum/download/content/
$datei = '/test.mp4';
# md5 token generieren
$token = md5($secret . $datei . $timehex);
# link zusammen bauen
echo '<a href="' . $url . $prefix . $token . '/' . $timehex . $datei . '">download</a>';
?>
Weitere Beispiele in Ruby, Python und C# gibt es hier.
Related Links
- Anleitung zur Einrichtung von mod_secdownload (englisch)
- Lighttpd Wiki Eintrag zu mod_secdownload (englisch)
- How to fight Deep Linking (englisch)
2 Kommentare
dirk
schrieb am 25.04.2010 um 17:22 Uhr
vielen dank für die super erklärung! hat mir sehr geholfen.