libvmod-secdown icon indicating copy to clipboard operation
libvmod-secdown copied to clipboard

Hash/time based protection for download links

============ vmod_secdown


Varnish Secure Download Module

:Author: Aurelien Guillaume :Date: 2011-08-08 :Version: 1.1 :Manual section: 3

SYNOPSIS

import secdown

DESCRIPTION

For specific purposes, i had to imagine a way to use Varnish as a cache for various files that should be protected against hotlinking/mass downloading. Protection by the referer was not enough, so unique downloads links had to be generated, but I still wanted the files to be cached by Varnish.

So, this module is freely inspired from the functionnality described at http://wiki.nginx.org/HttpSecureDownload and it should be compatible with this implementation.

At this stage, this module is mostly a proof-of-concept; it has only received minimal testing and we have never used it in production. I will update this file if/when it reaches a more usable status.

So far the module builds and runs on Linux--on other platforms, you are on your own.

Patches are welcome.

FUNCTIONS

vmod_secdown implements the following calls:

check_url

Prototype check_url(STRING protected_url, STRING secret, STRING expired_url, STRING error_url)

Return value STRING (URL that the user should be directed to)

Description Checks the validity of a protected URL. A protected URL looks like this:::

	http://hostname/path/to/protected/file/<md5_hash>/<expiration_timestamp>

Optionnally, the check can be relaxed to a prefix instead of a full path:::

	http://hostname/path/to/protected/file/<md5_hash>/<expiration_timestamp>x<prefix_len>

Since Varnish already does some processing on the URL, **req.url**, which does not contain
the `http://hostname` part is probably a good candidate in your VCL scripts.

**expiration_timestamp** is a 8-digit unix_timestamp (seconds since beginning of 1970) in hexadecimal format.

**prefix_len** is a 4-digit hexadecimal number representing the maximal path len to consider for inclusion
in MD5 hashs.

**md5_hash** is a MD5 hash generated out of the following string, by your application:::

	/path/to/protected/file/<secret>/<expiration_timestamp>

if **prefix_len** is set, the path will be cut to this number of bytes, and "x<prefix_len>" will be
added to the string to be hashed. 

The **secret** is some secret string of your choice, known only of your application,
which will serve to generate the expiring links.

The function **check_url** will return a string, which will be either:
	* **expired_url**, when the hash is valid, but the timestamp is in the past..
	* **error_url** if there's been another error (bad hash, bad url scheme, other internal errors)

Examples Protection of the /protected/ directory.::

	if (req.url ~ "^/protected/")
	{
		set req.url = secdown.check_url(req.url, "h4ckme", "/expired.html", "/error.html") 
	}

SEE ALSO

  • vcl(7)
  • varnishd(1)

COPYRIGHT

This document is licensed under the same licence as Varnish itself. See LICENCE for details.

  • Copyright (c) 2011 Aurelien Guillaume