Защита контента с помощью веб-ускорителя

Эта статья является 13-й статьей на Advent Calendar 2020 от Sakura Internet.

Защита контента с помощью одностороннего URL

Если вы хотите распространять контент для строго ограниченной аудитории, вам, вероятно, потребуется загружать его после аутентификации по паролю.

Однако, если вы используете это вместе с CDN, может оказаться, что основной аутентификации нельзя будет использовать, или, если изменить URL, кэш будет обрабатываться отдельно, и вы не сможете использовать CDN.

В веб-ускорителе есть функция одностороннего URL, поэтому я хочу представить вам защиту контента с помощью неё.

Что такое односторонний URL?

Односторонний URL — это функция, позволяющая выдавать URL с установленным сроком действия.

  • Вы можете создать URL, доступный до определенного времени
  • По истечении срока действия он становится недоступным (403 Forbidden)

Как это использовать?

Мы публикуем это в следующем руководстве, но я объясню на практике, настраивая его.

Шаг 1. Добавьте секрет к ответам на закрытый контент

Настройте так, чтобы контент, доступный только через действующий односторонний URL, возвращал секрета (секретный ключ).

На этот раз я использую арендуемый сервер Sakura, поскольку мне неудобно настраивать веб-сервер, но с Apache это можно сделать аналогично.

У меня такая структура директорий:

www
├── index.html
└── secret
    ├── .htaccess ← здесь
    ├── himitsu.jpeg
    └── himitsu.mp4

Контент в директории secret должен быть закрытым, поэтому я пишу в .htaccess в директории secret, чтобы возвращать заголовок секрета.

Если я хочу, чтобы контент, находящийся в директории secret, кэшировался на 1 час (3600 секунд), я настрою это с помощью Cache-Control.

Header set X-WebAccel-Secret "Himi2NoSecret!"
Header set Cache-Control "s-maxage=3600"

Секрет, возвращаемый в ответе, должен представлять собой строку, которую нельзя угадать.

В index.html под www не будет заголовка X-WebAccel-Secret и он будет доступен как обычно.

Если вы думаете: “Но если к нему получить доступ, он будет раскрыт! Если я напрямую обращусь к арендуемому серверу, то увижу контент!”, вы правы, но мы объясним это позже.

Шаг 2. Настройте веб-ускоритель

Создайте сайт в веб-ускорителе и зарегистрируйте его.

Поскольку мы просто тестируем односторонний URL, мы регистрируем его на поддомене.

Убедитесь, что зарегистрированный сайт активирован и находится в следующем состоянии.

Шаг 3. Попробуйте получить доступ через веб-ускоритель

Давайте попробуем получить доступ с помощью публичного доменного имени: https://xxxxxxx.user.webaccel.jp/

Вероятно, отображается то, что находится в www/index.html.
Поскольку здесь не добавляется X-WebAccel-Secret, он отображается как обычно.

Шаг 4. Попробуйте получить доступ к /secret/himitsu.jpg

Когда вы попытаетесь получить доступ к http://xxxxxxx.user.webaccel.jp/secret/himitsu.jpeg,

вы получите 403 Forbidden и не сможете получить доступ.

Сгенерируем URL, используя секрет, который мы установили в X-WebAccel-Secret.
Вот PHP-скрипт для генерации URL.

<?php
$base_url="http://xxxxxxx.user.webaccel.jp";
$file_path="/secret/himitsu.jpeg";
$secret = "Himi2NoSecret!";
$limit_time = sprintf("%08x", time()+600);  // Действительно в течение 10 минут (600s)

echo generateURL($base_url, $file_path, $secret, $limit_time) . "\n";

function generateURL($base_url, $file_path, $secret, $limit_time) {
    $md5 = md5("/" . $file_path . "/" . $secret . "/" . $limit_time ."/" );
    $url = $base_url . $file_path . "?webaccel_secure_time=" . $limit_time . "&webaccel_secure_hash=" . $md5;
    return $url;
}

Таким образом, должен быть сгенерирован URL, который поможет вам попробовать получить доступ к следующему.

http://xxxxxxx.user.webaccel.jp/secret/himitsu.jpeg?webaccel_secure_time=5fbdf873&webaccel_secure_hash=a82e1a55b2ec4da163a542e2354269f7

Контент успешно отобразился.

Поскольку URL был сгенерирован с действительным сроком 10 минут, через 10 минут…

он стал доступен как Forbidden, и доступ был закрыт.

Таким образом, используя временно действительный URL (односторонний URL), возможно передавать один и тот же контент пользователям, кэшируя его через веб-ускоритель.

Однако, если получить доступ напрямую к арендуемому серверу…

Конечно, вы все равно сможете получить доступ.
Необходимо заблокировать все подключения, кроме как от веб-ускорителя.
Существует способ разрешить только IP-адреса подключений от веб-ускорителя, но также предлагается функция под названием Origin Guard, которую мы будем использовать.

Шаг 5. Настройте Origin Guard

Используйте токен Origin Guard в настройках сайта веб-ускорителя.

Когда вы нажмете кнопку выдачи токена, будет выдан случайный токен.

Этот токен будет прикреплен к запросам к Origin, поэтому нужно настроить доступ только тогда, когда он есть на запросе.

Давайте перепишем .htaccess вот так:

RewriteEngine On
RewriteCond %{HTTP:X-WebAccel-Guard} !^T0VAn64Kt8QD8crDEFPGqg$
RewriteRule ^(.*)$ - [F,L]
Header set X-WebAccel-Secret "Himi2NoSecret!"
Header set Cache-Control "s-maxage=3600"

Теперь доступ стал невозможным.

В заключение

Комбинируя функции одностороннего URL и Origin Guard веб-ускорителя, вы можете создать временно доступный URL.

Обязательно используйте это для распределения платного контента и целевого распространения для ограниченного круга людей.

В конце

Ожидайте, что в конце января будет выпущена функция автоматической выдачи и обновления SSL-сертификатов с использованием Let’s Encrypt для веб-ускорителя!