---
title: 'Настроить защищенный доступ к контенту'
sidebar_label: 'Настроить защищенный доступ'
description: 'Как настроить защищенный доступ к контенту по кодовому слову или собственному скрипту'
sidebar_position: 9
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import {CustomTable} from '@selectel/docux/components'
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
import {TabItemLabel} from '@selectel/docux/components'

# Настроить защищенный доступ к контенту

По умолчанию любой пользователь может получить доступ к вашему контенту.

Вы можете [настроить доступ по кодовому слову](#configure-access-by-code-word) или [собственному скрипту](#configure-access-by-own-script).

## Настроить доступ по кодовому слову \{#configure-access-by-code-word}

Настройка доступа по кодовому слову (Tokenized URL) позволяет сделать ссылки на контент временными и ограничить доступ к контенту по IP-адресу.

К ссылкам на сайте добавляется токен вида `md5(kymJ2w55VH4LUMSKGb6ZqA,1704067200)`. Токен формируется:

* из кодового слова, которое вы придумали;
* пути к файлу на источнике;
* опционально: срока действия ссылки в формате POSIX-времени;
* опционально: разрешенного IP-адреса.

В результате ссылка с токеном будет такого вида:

```bash
https://cdn.example.com/md5(kymJ2w55VH4LUMSKGb6ZqA,1704067200)/path/to/file.png.
```

Когда пользователь переходит по ссылке, CDN-серверы проверяют токен в запросе. Если токен совпадает и время жизни ссылки не истекло, то серверы отдают контент. При этом сами CDN-серверы получают контент от источника независимо от наличия кодового слова.

1. В [панели управления](https://my.selectel.ru/cdn-v3) в верхнем меню нажмите **Продукты** и выберите **CDN**.

2. В разделе **CDN-ресурсы** откройте страницу CDN-ресурса → вкладка **Ограничения**.

3. В блоке **Авторизация** выберите **По кодовому слову**.

4. Введите кодовое слово размером от 6 до 32 символов. Можно использовать латинские буквы и цифры.

5. Опционально: чтобы не указывать время действия ссылки, отметьте чекбокс **Не ограничивать по времени**.

6. Опционально: чтобы не ограничивать доступ к контенту только определенным IP-адресам, отметьте чекбокс **Не учитывать IP**.

7. Нажмите **Применить**. Во время применения настроек CDN-ресурс будет находиться в статусе `PROCESSING`. В это время применение других настроек недоступно. Настройки применятся, когда CDN-ресурс перейдет в статус `ACTIVE`.

8. Настройте генерацию ссылки с токеном на сервере-источнике с помощью скрипта. Посмотреть примеры скриптов можно в подразделе [Примеры скрипта для генерации токена](#examples-of-link-generating-script).

### Примеры скрипта для генерации защищенной ссылки \{#examples-of-link-generating-script}

:::info

Это примеры скрипта для генерации токена с учетом ограничений по IP-адресу и времени действия ссылки.

:::

<Tabs queryString="example-of-token-generating-script">
  <TabItem value="php" default>
    <TabItemLabel>
      PHP-скрипт
    </TabItemLabel>

    ```php
    <?php
    $secret = '<code_word>';
    $ip = '<ip_address>';
    $path = '<file_path>';
    $lifetime = <link_lifetime>;
    $expires = time() + $lifetime;
    $link = "$secret$path$ip$expires";
    $md5 = md5($link, true);
    $md5 = base64_encode($md5);
    $md5 = strtr($md5, '+/', '-_');
    $md5 = str_replace('=', '', $md5);
    $domain = '<domain>';
    $url = "$domain/md5($md5,$expires)$path";
    echo $url;
    echo "\n";
    ```

    Укажите:

    * `<code_word>` — кодовое слово, которое указали при [настройке доступа к контенту по кодовому слову](#configure-access-by-code-word);

    * `<ip_address>` — IP-адрес, которому вы разрешаете получить контент;

    * `<file_path>` — относительный путь к файлу или префикс пути на источнике. Например, есть относительный путь к файлу: `/path/to/file.jpg`. Чтобы дать доступ:

      * к конкретному файлу укажите: `/path/to/file.jpg`;
      * ко всем файлам, которые начинаются с `/path/to/`, включая подпапки, укажите: `/path/to`;
      * ко всем файлам в `/path/` и его подпапках укажите: `/path`;

    * `<link_lifetime>` — время жизни ссылки в секундах;

    * `<cdn_domain>` — домен CDN-ресурса с указанием протокола. Посмотреть домен CDN-ресурса можно в [панели управления](https://my.selectel.ru/cdn-v3/resources): в верхнем меню нажмите **Продукты** → **CDN** → **CDN-ресурсы** → строка CDN-ресурса.
  </TabItem>

  <TabItem value="python">
    <TabItemLabel>
      Python-скрипт
    </TabItemLabel>

    ```python
    import base64
    from hashlib import md5
    from time import time

    secret = "<code_word>"
    ip = "<ip_address>"
    path = "<file_path>"
    lifetime = <link_lifetime>
    domain = "<cdn_domain>"

    expires = int(time()) + lifetime

    token_byte = base64.encodebytes(
        md5(f"{secret}{path}{ip}{expires}".encode("utf-8")).digest()
    )
    token = (
        token_byte
        .decode("utf-8")
        .replace("\n", "")
        .replace("+", "-")
        .replace("/", "_")
        .replace("=", "")
    )
    secured_url = f"{domain}/md5({token},{expires}){path}"
    print(secured_url)
    ```

    Укажите:

    * `<code_word>` — кодовое слово, которое указали при [настройке доступа к контенту по кодовому слову](#configure-access-by-code-word);

    * `<ip_address>` — IP-адрес, которому вы разрешаете получить контент;

    * `<file_path>` — относительный путь к файлу или префикс пути на источнике. Например, есть относительный путь к файлу: `/path/to/file.jpg`. Чтобы дать доступ:

      * к конкретному файлу укажите: `/path/to/file.jpg`;
      * ко всем файлам, которые начинаются с `/path/to/`, включая подпапки, укажите: `/path/to`;
      * ко всем файлам в `/path/` и его подпапках укажите: `/path`;

    * `<link_lifetime>` — время жизни ссылки в секундах;

    * `<cdn_domain>` — домен CDN-ресурса с указанием протокола. Посмотреть домен CDN-ресурса можно в [панели управления](https://my.selectel.ru/cdn-v3/resources): в верхнем меню нажмите **Продукты** → **CDN** → **CDN-ресурсы** → строка CDN-ресурса.
  </TabItem>

  <TabItem value="openssl">
    <TabItemLabel>
      OpenSSL-скрипт
    </TabItemLabel>

    ```bash
    SECRET="<code_word>"
    IP="<ip_address>"
    PATH="<file_path>"
    LIFETIME=<link_lifetime>
    DOMAIN="<cdn_domain>"

    EXPIRES=$(($(date +%s) + LIFETIME))

    HASH_STRING="${SECRET}${PATH}${IP}${EXPIRES}"

    TOKEN=$(echo -n "$HASH_STRING" | openssl md5 -binary | openssl base64 | tr '+/' '-_' | tr -d '=')

    SECURED_URL="${DOMAIN}/md5(${TOKEN},${EXPIRES})${PATH}"

    echo "$SECURED_URL"
    ```

    Укажите:

    * `<code_word>` — кодовое слово, которое указали при [настройке доступа к контенту по кодовому слову](#configure-access-by-code-word);

    * `<ip_address>` — IP-адрес, которому вы разрешаете получить контент;

    * `<file_path>` — относительный путь к файлу или префикс пути на источнике. Например, есть относительный путь к файлу: `/path/to/file.jpg`. Чтобы дать доступ:

      * к конкретному файлу укажите: `/path/to/file.jpg`;
      * ко всем файлам, которые начинаются с `/path/to/`, включая подпапки, укажите: `/path/to`;
      * ко всем файлам в `/path/` и его подпапках укажите: `/path`;

    * `<link_lifetime>` — время жизни ссылки в секундах;

    * `<cdn_domain>` — домен CDN-ресурса с указанием протокола. Посмотреть домен CDN-ресурса можно в [панели управления](https://my.selectel.ru/cdn-v3/resources): в верхнем меню нажмите **Продукты** → **CDN** → **CDN-ресурсы** → строка CDN-ресурса.
  </TabItem>
</Tabs>

## Настроить доступ по собственному скрипту \{#configure-access-by-own-script}

Вы можете добавить собственный скрипт для авторизации пользователей.

Когда пользователь переходит по ссылке, решение о доступе контента принимается на основе ответа от скрипта.

В скрипте нужно передать заголовки:

* `Host` — имя домена, для которого предназначен запрос;
* `X-Request-URI` — URI запрашиваемого CDN-ресурса;
* `X-Forwarded-For` — реальный IP-адрес пользователя, который запрашивает CDN-ресурс;
* `X-Remote-Addr` — IP-адрес пользователя, который запрашивает CDN-ресурс, или IP-адрес прокси-сервера.

1. В [панели управления](https://my.selectel.ru/cdn-v3) в верхнем меню нажмите **Продукты** и выберите **CDN**.

2. В разделе **CDN-ресурсы** откройте страницу CDN-ресурса → вкладка **Ограничения**.

3. В блоке **Авторизация** выберите **По внешнему скрипту**.

4. Вставьте ссылку на ваш скрипт.

5. Нажмите **Применить**. Во время применения настроек CDN-ресурс будет находиться в статусе `PROCESSING`. В это время применение других настроек недоступно. Настройки применятся, когда CDN-ресурс перейдет в статус `ACTIVE`.

<Formbricks />
