Эта статья является 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 для веб-ускорителя!