Организация защищенного доступа к контенту в Cloud CDN с помощью консоли управления, CLI или API
- Подготовьте облако к работе
- Создайте виртуальную машину с веб-сервером
- Создайте и настройте публичную зону DNS
- Добавьте TLS-сертификат в Yandex Certificate Manager
- Подготовьте бакет-источник для CDN-ресурса
- Создайте CDN-ресурс
- Создайте ресурсную запись CNAME для CDN-ресурса
- Опубликуйте сайт на веб-сервере
- Проверьте работу защищенного доступа к файлам
- Как удалить созданные ресурсы
Чтобы настроить защищенный доступ к контенту в Cloud CDN:
- Подготовьте облако к работе.
- Создайте виртуальную машину с веб-сервером.
- Создайте и настройте публичную зону DNS.
- Добавьте TLS-сертификат в Yandex Certificate Manager.
- Подготовьте бакет-источник для CDN-ресурса.
- Создайте CDN-ресурс.
- Создайте ресурсную запись CNAME для CDN-ресурса.
- Опубликуйте сайт на веб-сервере.
- Проверьте работу защищенного доступа к файлам.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры для организации защищенного доступа к контенту в Cloud CDN входят:
- плата за использование публичного IP-адреса (см. тарифы Yandex Virtual Private Cloud);
- плата за вычислительные ресурсы и диски ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование публичной DNS-зоны и публичные DNS-запросы (см. тарифы Yandex Cloud DNS);
- плата за хранение данных в Object Storage, операции с ними и исходящий трафик (см. тарифы Object Storage);
- плата за исходящий трафик с CDN-серверов (см. тарифы Cloud CDN).
Создайте облачную сеть и подсеть
- В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. - В списке сервисов выберите Virtual Private Cloud.
- Справа сверху нажмите Создать сеть.
- В поле Имя укажите
webserver-network. - В поле Дополнительно отключите опцию Создать подсети.
- Нажмите Создать сеть.
- На панели слева выберите
Подсети. - Справа сверху нажмите Создать подсеть.
- В поле Имя укажите
webserver-subnet-ru-central1-b. - В поле Зона доступности выберите зону доступности
ru-central1-b. - В поле Сеть выберите облачную сеть
webserver-network. - В поле CIDR укажите
192.168.1.0/24. - Нажмите Создать подсеть.
-
Создайте сеть
webserver-network:yc vpc network create webserver-networkРезультат:
id: enp1gg8kr3pv******** folder_id: b1gt6g8ht345******** created_at: "2023-12-20T20:08:11Z" name: webserver-network default_security_group_id: enppne4l2eg5********Подробнее о команде
yc vpc network createчитайте в справочнике CLI. -
Создайте подсеть в зоне доступности
ru-central1-b:yc vpc subnet create webserver-subnet-ru-central1-b \ --zone ru-central1-b \ --network-name webserver-network \ --range 192.168.1.0/24Результат:
id: e2li9tcgi7ii******** folder_id: b1gt6g8ht345******** created_at: "2023-12-20T20:11:16Z" name: webserver-subnet-ru-central1-b network_id: enp1gg8kr3pv******** zone_id: ru-central1-b v4_cidr_blocks: - 192.168.1.0/24Подробнее о команде
yc vpc subnet createчитайте в справочнике CLI.
-
Чтобы создать сеть, воспользуйтесь методом REST API create для ресурса Network или вызовом gRPC API NetworkService/Create.
-
Чтобы создать подсеть, воспользуйтесь методом REST API create для ресурса Subnet или вызовом gRPC API SubnetService/Create.
Создайте группу безопасности
Создайте группу безопасности, разрешающую входящий TCP-трафик для портов 22, 80 и 443, а также любой исходящий трафик.
-
В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. -
В списке сервисов выберите Virtual Private Cloud.
-
На панели слева выберите
Группы безопасности. -
Нажмите Создать группу безопасности.
-
В поле Имя укажите имя
webserver-sg. -
В поле Сеть выберите созданную ранее сеть
webserver-network. -
В блоке Правила создайте следующие правила для управления трафиком:
Направление
трафикаОписание Диапазон портов Протокол Источник /
НазначениеCIDR блоки Входящий http80TCPCIDR0.0.0.0/0Входящий https443TCPCIDR0.0.0.0/0Входящий ssh22TCPCIDR0.0.0.0/0Исходящий anyВесьЛюбойCIDR0.0.0.0/0 -
Нажмите Создать.
Выполните команду:
yc vpc security-group create \
--name webserver-sg \
--rule "description=http,direction=ingress,port=80,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
--rule "description=https,direction=ingress,port=443,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
--rule "description=ssh,direction=ingress,port=22,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
--rule "description=any,direction=egress,port=any,protocol=any,v4-cidrs=[0.0.0.0/0]" \
--network-name webserver-network
Результат:
id: enp4htsnl1sa********
folder_id: b1gt6g8ht345********
created_at: "2023-12-23T19:07:03Z"
name: webserver-sg
network_id: enp37qpnksl2********
status: ACTIVE
rules:
- id: enpdu0t8san9********
description: http
direction: INGRESS
ports:
from_port: "80"
to_port: "80"
protocol_name: TCP
protocol_number: "6"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
- id: enpr7oirpff5********
description: https
direction: INGRESS
ports:
from_port: "443"
to_port: "443"
protocol_name: TCP
protocol_number: "6"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
- id: enp0bgk6dkdd********
description: ssh
direction: INGRESS
ports:
from_port: "22"
to_port: "22"
protocol_name: TCP
protocol_number: "6"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
- id: enpspns0tfml********
description: any
direction: EGRESS
protocol_name: ANY
protocol_number: "-1"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
Подробнее о команде yc vpc security-group create читайте в справочнике CLI.
Сохраните полученный идентификатор (id) группы безопасности — он понадобится при создании ВМ.
Чтобы создать группу безопасности, воспользуйтесь методом REST API create для ресурса SecurityGroup или вызовом gRPC API SecurityGroupService/Create.
Подготовьте файлы для загрузки в бакет
-
Сохраните любое изображение в формате JPEG в файл
content.jpg. -
Создайте файл
index.html:<html> <body> </body> </html>
Создайте виртуальную машину с веб-сервером
Перед тем как приступать к созданию ВМ, подготовьте пару ключей (открытый и закрытый) для доступа к ВМ по SSH.
-
На странице каталога в консоли управления
нажмите кнопку Создать ресурс и выберитеВиртуальная машина. -
Выберите вариант Расширенная настройка.
-
В блоке Образ загрузочного диска в поле Поиск продукта введите
LAMPи выберите образ LAMP. -
В блоке Расположение выберите зону доступности
ru-central1-b. -
В блоке Сетевые настройки:
- В поле Подсеть выберите созданную ранее подсеть
webserver-subnet-ru-central1-b. - В поле Публичный IP-адрес выберите
Автоматически. - В поле Группы безопасности выберите созданную ранее группу безопасности
webserver-sg.
- В поле Подсеть выберите созданную ранее подсеть
-
В блоке Доступ выберите вариант SSH-ключ и укажите данные для доступа на ВМ:
- В поле Логин введите имя пользователя:
yc-user. -
В поле SSH-ключ выберите SSH-ключ, сохраненный в вашем профиле пользователя организации.
Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
-
Нажмите кнопку Добавить ключ.
-
Задайте имя SSH-ключа.
-
Выберите вариант:
-
Ввести вручную— вставьте содержимое открытого SSH-ключа. Пару SSH-ключей необходимо создать самостоятельно. -
Загрузить из файла— загрузите открытую часть SSH-ключа. Пару SSH-ключей необходимо создать самостоятельно. -
Сгенерировать ключ— автоматическое создание пары SSH-ключей.При добавлении сгенерированного SSH-ключа будет создан и загружен архив с парой ключей. В ОС на базе Linux или macOS распакуйте архив в папку
/home/<имя_пользователя>/.ssh. В ОС Windows распакуйте архив в папкуC:\Users\<имя_пользователя>/.ssh. Дополнительно вводить открытый ключ в консоли управления не требуется.
-
-
Нажмите кнопку Добавить.
SSH-ключ будет добавлен в ваш профиль пользователя организации. Если в организации отключена возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя внутри создаваемого ресурса.
-
- В поле Логин введите имя пользователя:
-
В блоке Общая информация задайте имя ВМ:
mywebserver. -
Нажмите кнопку Создать ВМ.
Выполните команду:
yc compute instance create \
--name mywebserver \
--zone ru-central1-b \
--network-interface subnet-name=webserver-subnet-ru-central1-b,nat-ip-version=ipv4,security-group-ids=<идентификатор_группы_безопасности> \
--create-boot-disk image-folder-id=standard-images,image-id=fd8jtn9i7e9ha5q25niu \
--ssh-key ~/.ssh/id_ed25519.pub
Где:
<идентификатор_группы_безопасности>— сохраненный ранее идентификатор группы безопасности.--ssh-key— путь к файлу с открытым SSH-ключом. Например:~/.ssh/id_ed25519.pub.
Результат:
done (32s)
id: fhmaq4shfrcm********
folder_id: b1gt6g8ht345********
created_at: "2023-12-23T05:36:34Z"
name: mywebserver
zone_id: ru-central1-b
platform_id: standard-v2
resources:
memory: "2147483648"
cores: "2"
core_fraction: "100"
status: RUNNING
metadata_options:
gce_http_endpoint: ENABLED
aws_v1_http_endpoint: ENABLED
gce_http_token: ENABLED
aws_v1_http_token: DISABLED
boot_disk:
mode: READ_WRITE
device_name: fhmprher1d0q********
auto_delete: true
disk_id: fhmprher1d0q********
network_interfaces:
- index: "0"
mac_address: d0:0d:ad:13:91:7e
subnet_id: e9bk1m87r4m4********
primary_v4_address:
address: 192.168.1.11
one_to_one_nat:
address: 158.160.***.***
ip_version: IPV4
security_group_ids:
- enpa5j0mrgm4********
gpu_settings: {}
fqdn: fhmaq4shfrcm********.auto.internal
scheduling_policy: {}
network_settings:
type: STANDARD
placement_policy: {}
Подробнее о команде yc compute instance create читайте в справочнике CLI.
Чтобы создать ВМ, воспользуйтесь методом REST API create для ресурса Instance или вызовом gRPC API InstanceService/Create.
В вашем каталоге будет создана ВМ mywebserver. Чтобы подключиться к ней по SSH, используйте логин yc-user и публичный IP-адрес этой ВМ. Если вы планируете пользоваться созданным веб-сервером длительное время, сделайте публичный IP-адрес этой ВМ статическим.
Создайте и настройте публичную зону DNS
-
Создайте публичную зону DNS в Yandex Cloud DNS.
Консоль управленияYandex Cloud CLIAPI-
В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. -
Выберите сервис Cloud DNS.
-
Нажмите Создать зону.
-
Задайте настройки зоны, соответствующие вашему домену:
- Зона — доменная зона. Название зоны должно заканчиваться точкой. Например, название доменной зоны
example.com.соответствует доменуexample.com. Чтобы создать доменную зону с нелатинскими символами, используйте кодировку Punycode . - Тип —
Публичная. - Имя —
my-domain-zone.
- Зона — доменная зона. Название зоны должно заканчиваться точкой. Например, название доменной зоны
-
Нажмите Создать.
Выполните команду:
yc dns zone create \ --name my-domain-zone \ --zone <имя_домена> \ --public-visibilityГде
--zone— имя вашего домена, напримерexample.com.. Значение параметра--zoneдолжно заканчиваться точкой. Например, название доменной зоныexample.com.соответствует доменуexample.com.Результат:
id: dns39gihj0ef******** folder_id: b1gt6g8ht345******** created_at: "2023-12-21T16:43:37.883Z" name: my-domain-zone zone: example.com. public_visibility: {}Подробнее о команде
yc dns zone createчитайте в справочнике CLI.Чтобы создать публичную зону DNS, воспользуйтесь методом REST API create для ресурса DnsZone или вызовом gRPC API DnsZoneService/Create.
-
-
Делегируйте ваш домен сервису Cloud DNS. Для этого в личном кабинете вашего регистратора домена укажите в настройках домена адреса DNS-серверов
ns1.yandexcloud.netиns2.yandexcloud.net. -
Создайте в вашей зоне DNS ресурсную A-запись, указывающую на публичный IP-адрес созданной ранее ВМ с веб-сервером:
Консоль управленияYandex Cloud CLIAPI-
В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. -
Выберите сервис Cloud DNS.
-
Выберите созданную ранее DNS-зону.
-
Нажмите Создать запись.
-
Задайте параметры записи:
-
В поле Имя выберите
Совпадает с именем зоны (@). -
В поле Тип выберите тип записи
A. -
В поле Значение укажите публичный IP-адрес созданной ранее ВМ с веб-сервером.
Узнать IP-адрес ВМ можно в консоли управления
на странице ВМ в блоке Сеть или с помощью команды CLIyc compute instance get mywebserver.
-
-
Нажмите Создать.
Выполните команду:
yc dns zone add-records \ --name my-domain-zone \ --record "@ 600 A <IP-адрес_ВМ>"Где
<IP-адрес_ВМ>— публичный IP-адрес созданной ранее ВМ с веб-сервером.Узнать IP-адрес ВМ можно в консоли управления
на странице ВМ в блоке Сеть или с помощью команды CLIyc compute instance get mywebserver.Результат:
+--------+--------------+------+---------------+-----+ | ACTION | NAME | TYPE | DATA | TTL | +--------+--------------+------+---------------+-----+ | + | example.com. | A | 51.250.**.*** | 600 | +--------+--------------+------+---------------+-----+Подробнее о команде
yc dns zone add-recordsчитайте в справочнике CLI.Чтобы создать ресурсную запись в зоне DNS, воспользуйтесь методом REST API updateRecordSets для ресурса DnsZone или вызовом gRPC API DnsZoneService/UpdateRecordSets.
-
Добавьте TLS-сертификат в Yandex Certificate Manager
-
Добавьте в сервис Certificate Manager сертификат от Let's Encrypt® для ваших доменов, которые будут использоваться веб-сервером и CDN-ресурсом.
Консоль управленияYandex Cloud CLIAPI-
В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. -
В списке сервисов выберите Certificate Manager.
-
Нажмите Добавить сертификат и выберите Сертификат от Let's Encrypt.
-
В открывшемся окне в поле Имя укажите
mymanagedcert. -
В поле Домены укажите имя вашего домена, например
example.com.В этом же поле укажите с новой строки имя поддомена, который будет использоваться для CDN-ресурса, например
cdn.example.com. -
Выберите тип проверки прав на домен
DNS. -
Нажмите Создать.
Выполните команду:
yc certificate-manager certificate request \ --name mymanagedcert \ --challenge dns \ --domains <имя_домена>,<имя_поддомена>Где:
<имя_домена>— имя вашего домена для веб-сервера. Например:example.com.<имя_поддомена>— имя поддомена, который будет использоваться CDN-ресурсом. Например:cdn.example.com.
Результат:
id: fpqbs12t6ion******** folder_id: b1gt6g8ht345******** created_at: "2023-12-24T14:36:39.299844798Z" name: mymanagedcert type: MANAGED domains: - example.com - cdn.example.com status: VALIDATING updated_at: "2023-12-24T14:36:39.299844798Z"Подробнее о команде
yc certificate-manager certificate requestчитайте в справочнике CLI.Сохраните идентификатор (
id) созданного сертификата: он пригодится при создании CDN-ресурса.Чтобы добавить сертификат, воспользуйтесь методом REST API requestNew для ресурса Certificate или вызовом gRPC API CertificateService/RequestNew.
В списке сертификатов появится новый сертификат со статусом
Validating. Этот статус означает, что запрос на выпуск сертификата от Let's Encrypt® создан, и для его успешной обработки вам необходимо пройти процедуру проверки прав на домены. -
-
Для успешного выпуска сертификата пройдите проверку прав на домены:
Консоль управленияYandex Cloud CLIAPI- В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. - В списке сервисов выберите Certificate Manager.
- В списке сертификатов выберите
mymanagedcert. - В открывшемся окне в блоке Проверка прав на домены выберите
CNAME-запись. - В секции первого домена ниже нажмите Создать запись и в открывшемся окне нажмите Создать.
- Повторите предыдущее действие для второго домена.
Проверка прав на домены может занять от нескольких минут до нескольких дней — дождитесь ее успешного завершения. В результате сертификат будет выпущен и перейдет в статус
Issued.-
Получите значения ресурсных записей, необходимых для прохождения проверки:
yc certificate-manager certificate get \ --name mymanagedcert \ --fullРезультат:
id: fpq2gpi42teg******** folder_id: b1gt6g8ht345******** created_at: "2023-12-24T18:13:45.960Z" name: mymanagedcert type: MANAGED domains: - example.com - cdn.example.com status: VALIDATING updated_at: "2023-12-24T18:13:45.960Z" challenges: - domain: cdn.example.com type: DNS created_at: "2023-12-24T18:13:45.960Z" updated_at: "2023-12-24T18:13:49.280Z" status: PENDING message: Create a record in your DNS provider. dns_challenge: name: _acme-challenge.cdn.example.com. type: CNAME value: fpq2gpi42teg********.cm.yandexcloud.net. - domain: cdn.example.com type: DNS created_at: "2023-12-24T18:13:45.960Z" updated_at: "2023-12-24T18:13:49.280Z" status: PENDING message: Create a record in your DNS provider. dns_challenge: name: _acme-challenge.cdn.example.com. type: TXT value: d9RzZH8WZucSY8mXs9cEg1wNteaaNqbxZK7******** - domain: example.com type: DNS created_at: "2023-12-24T18:13:45.960Z" updated_at: "2023-12-24T18:13:49.280Z" status: PENDING message: Create a record in your DNS provider. dns_challenge: name: _acme-challenge.example.com type: CNAME value: fpq2gpi42teg********.cm.yandexcloud.net. - domain: example.com type: DNS created_at: "2023-12-24T18:13:45.960Z" updated_at: "2023-12-24T18:13:49.280Z" status: PENDING message: Create a record in your DNS provider. dns_challenge: name: _acme-challenge.example.com. type: TXT value: iiyJJJlsaFIqQ7DMUzira0OKU3iXuaqiN7U********Подробнее о команде
yc certificate-manager certificate getчитайте в справочнике CLI.Сохраните значения полей
valueиз разделов с типомCNAMEв блокахchallenges.dns_challengeдля обоих доменных имен. Эти значения понадобятся на следующем шаге. -
Создайте ресурсные записи CNAME для прохождения проверки ваших прав на домены:
yc dns zone add-records \ --name my-domain-zone \ --record "_acme-challenge 600 CNAME <значение_dns_challenge>" \ --record "_acme-challenge.<поддомен> 600 CNAME <значение_dns_challenge>"Где:
<значение_dns_challenge>— сохраненное на предыдущем шаге значение, необходимое для проверки прав на соответствующий домен с помощью CNAME-записи.<поддомен>— имя, которое вы присвоили поддомену CDN-ресурса. Например:cdn, в этом случае запись будет выглядеть как_acme-challenge.cdn 600 CNAME fpq2gpi42teg********.cm.yandexcloud.net.
Результат:
+--------+----------------------------------+-------+------------------------------------------+-----+ | ACTION | NAME | TYPE | DATA | TTL | +--------+----------------------------------+-------+------------------------------------------+-----+ | + | _acme-challenge.cdn.example.com. | CNAME | fpq2gpi42teg********.cm.yandexcloud.net. | 600 | | + | _acme-challenge.example.com. | CNAME | fpq2gpi42teg********.cm.yandexcloud.net. | 600 | +--------+----------------------------------+-------+------------------------------------------+-----+Подробнее о команде
yc dns zone add-recordsчитайте в справочнике CLI.Проверка прав на домены может занять от нескольких минут до нескольких дней — дождитесь ее успешного завершения. В результате сертификат будет выпущен и перейдет в статус
Issued. -
Убедитесь, что статус сертификата изменился на
Issued:yc certificate-manager certificate get \ --name mymanagedcertРезультат:
id: fpqr2j0sdb1n******** folder_id: b1gt6g8ht345******** created_at: "2023-12-24T16:38:02.206Z" name: mymanagedcert type: MANAGED domains: - cdn.example.com - example.com status: ISSUED issuer: CN=R3,O=Let's Encrypt,C=US subject: CN=cdn.example.com serial: 4b7d7f0968097ae1a7707854a80******** updated_at: "2023-12-24T16:46:03.578Z" issued_at: "2023-12-24T16:46:03.578Z" not_after: "2024-03-23T15:44:59Z" not_before: "2023-12-24T15:45:00Z"
Для получения информации, необходимой для прохождения процедуры проверки прав на домены, воспользуйтесь методом REST API get для ресурса Certificate или вызовом gRPC API CertificateService/Get с флагом
view=FULL.Чтобы создать ресурсную запись CNAME в зоне DNS, воспользуйтесь методом REST API updateRecordSets для ресурса DnsZone или вызовом gRPC API DnsZoneService/UpdateRecordSets.
Примечание
Чтобы DNS-проверка прав на домен по записи
CNAMEпрошла успешно, для поддомена_acme-challengeпроверяемого доменного имени не должно быть других ресурсных записей, кромеCNAME. Например, для имени_acme-challenge.example.com.должна существовать только CNAME-запись и не должно быть TXT-записи. - В консоли управления
Подготовьте бакет-источник для CDN-ресурса
-
Создайте бакет Object Storage, который будет использоваться в качестве источника для CDN-ресурса. Имя бакета должно быть уникальным.
Консоль управленияYandex Cloud CLIAWS CLIAPI- В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. - В списке сервисов выберите Object Storage.
- Справа сверху нажмите Создать бакет.
- В поле Имя укажите имя бакета, например
cdn-source-bucket. - В поле Макс. размер укажите
1 ГБ. - В полях Чтение объектов и Чтение списка объектов выберите
Для всех. - Нажмите Создать бакет.
- На странице со списком бакетов выберите созданный бакет.
- На панели слева выберите Настройки.
- На вкладке Веб-сайт:
- Выберите
Хостинг. - В поле Главная страница укажите
index.html.
- Выберите
- Нажмите Сохранить.
-
Создайте бакет:
yc storage bucket create \ --name <имя_бакета> \ --default-storage-class standard \ --max-size 1073741824 \ --public-read \ --public-listГде
--name— имя бакета, уникальное для всего сервиса Object Storage. Например:cdn-source-bucket.Результат:
name: cdn-source-bucket folder_id: b1gt6g8ht345******** anonymous_access_flags: read: false list: false default_storage_class: STANDARD versioning: VERSIONING_DISABLED max_size: "1073741824" acl: {} created_at: "2023-12-22T18:11:23.028836Z"Подробнее о команде
yc storage bucket createчитайте в справочнике CLI. -
Включите в бакете хостинг статического сайта:
yc storage bucket update \ --name <имя_бакета> \ --website-settings '{"index": "index.html"}'Результат:
name: cdn-source-bucket folder_id: b1gt6g8ht345******** default_storage_class: STANDARD versioning: VERSIONING_DISABLED max_size: "1073741824" acl: {} created_at: "2023-12-23T09:56:58.249721Z" website_settings: redirect_all_requests: {}Подробнее о команде
yc storage bucket updateчитайте в справочнике CLI.
Если у вас еще нет интерфейса командной строки AWS CLI, установите и сконфигурируйте его.
Назначьте сервисному аккаунту, через который работает AWS CLI, роль
storage.editor.-
Создайте бакет:
aws s3api create-bucket \ --endpoint-url https://storage.yandexcloud.net \ --bucket <имя_бакета> \ --acl public-readГде
--bucket— имя бакета, уникальное для всего сервиса Object Storage. Например:cdn-source-bucket.Результат:
{ "Location": "/cdn-source-bucket" } -
Включите в бакете хостинг статического сайта:
aws --endpoint-url https://storage.yandexcloud.net \ s3 website "s3://<имя_бакета>" \ --index-document index.htmlГде
<имя_бакета>— имя созданного ранее бакета. Например:cdn-source-bucket.
Чтобы создать бакет, воспользуйтесь методом REST API create для ресурса Bucket, вызовом gRPC API BucketService/Create или методом S3 API create.
Чтобы включить в бакете хостинг статического сайта, воспользуйтесь методом REST API update для ресурса Bucket, вызовом gRPC API BucketService/Update или методом S3 API upload.
- В консоли управления
-
Загрузите в бакет подготовленные файлы:
Консоль управленияAWS CLIAPI- В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. - В списке сервисов выберите Object Storage.
- Выберите созданный ранее бакет.
- В правом верхнем углу страницы нажмите
Загрузить и выберите созданные файлыindex.htmlиcontent.jpg. - В открывшемся окне подтвердите загрузку объектов.
-
Загрузите в бакет файл
index.html:aws --endpoint-url https://storage.yandexcloud.net \ s3 cp ./index.html s3://<имя_бакета>/index.htmlГде
<имя_бакета>— имя созданного ранее бакета. Например:cdn-source-bucket.Результат:
upload: ./index.html to s3://cdn-source-bucket/index.html -
Загрузите в бакет файл
content.jpg:aws --endpoint-url https://storage.yandexcloud.net \ s3 cp ./content.jpg s3://<имя_бакета>/content.jpgРезультат:
upload: ./content.jpg to s3://cdn-source-bucket/content.jpg
Чтобы загрузить файлы в бакет, воспользуйтесь методом S3 API upload.
- В консоли управления
Создайте CDN-ресурс
- В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. - Выберите сервис Cloud CDN.
- Нажмите Создать ресурс.
- Задайте основные настройки CDN-ресурса:
- В блоке Контент:
- Включите Доступ к контенту.
- В поле Запрос контента выберите
Из одного источника. - В поле Тип источника выберите
Сервер. - В поле Доменное имя источника укажите
<имя_бакета>.website.yandexcloud.net, где<имя_бакета>— имя созданного ранее бакета, используемого CDN-ресурсом в качестве источника. - В поле Протокол для источников выберите
Как у клиента. - В поле Доменное имя укажите доменное имя, которое вы присвоите вашему CDN-ресурсу: например
cdn.example.com.
- В блоке Дополнительно:
- В поле Переадресация клиентов выберите
Не использовать. - В поле Тип сертификата выберите
Сертификат из Certificate Managerи в появившемся списке выберите созданный ранее сертификатmymanagedcert. - В поле Заголовок Host выберите
Свое значениеи в появившемся поле Значение заголовка укажите<имя_бакета>.website.yandexcloud.net, где<имя_бакета>— имя созданного ранее бакета, использующегося CDN-ресурсом в качестве источника. - Включите опцию Доступ по защищённому токену:
- В появившемся поле Секретный ключ укажите секретный ключ — произвольную строку длиной от 6 до 32 символов. Он будет передан в конфигурацию CDN-ресурса и будет использоваться для формирования и проверки подписанных ссылок.
- В поле Ограничение доступа по IP-адресу выберите
Только доверенные IP-адреса.
- В поле Переадресация клиентов выберите
- В блоке Контент:
- Нажмите Продолжить.
- В разделах Кеширование, HTTP-заголовки и методы и Дополнительно оставьте настройки по умолчанию и нажмите Продолжить.
-
Создайте ресурс:
yc cdn resource create <имя_поддомена> \ --origin-custom-source <имя_бакета>.website.yandexcloud.net \ --origin-protocol 'match' \ --cert-manager-ssl-cert-id <идентификатор_сертификата> \ --host-header <имя_бакета>.website.yandexcloud.net \ --secure-key <секретный_ключ> \ --enable-ip-url-signingГде:
<имя_поддомена>— доменное имя, для которого ранее был создан TLS-сертификат и которое будет использоваться CDN-ресурсом. Например:cdn.example.com.<имя_бакета>— имя созданного ранее бакета Object Storage. Например:cdn-source-bucket.--cert-manager-ssl-cert-id— идентификатор TLS-сертификата, сохраненный ранее при его создании.--secure-key— секретный ключ, произвольная строка длиной от 6 до 32 символов. Секретный ключ будет передан в конфигурацию CDN-ресурса и будет использоваться для формирования и проверки подписанных ссылок.
Результат:
id: bc8yqhobvxk6******** folder_id: b1gt6g8ht345******** cname: cdn.example.com created_at: "2024-06-22T19:59:05.430376Z" updated_at: "2024-06-22T19:59:05.430394Z" active: true options: edge_cache_settings: enabled: true default_value: "345600" query_params_options: ignore_query_string: enabled: true value: true host_options: host: enabled: true value: cdn-source-bucket.website.yandexcloud.net stale: enabled: true value: - error - updating secure_key: enabled: true key: sdh******** type: ENABLE_IP_SIGNING origin_group_id: "310699" origin_group_name: Origins for cdn.example.com (211929) origin_protocol: MATCH ssl_certificate: type: CM status: READY data: cm: id: fpqia0s2fc21********Подробнее о команде
yc cdn resource createчитайте в справочнике CLI.
Воспользуйтесь методом REST API create для ресурса Resource или вызовом gRPC API ResourceService/Create.
Чтобы новые настройки существующего ресурса применились к CDN-серверам, может потребоваться до 15 минут. После этого рекомендуется очистить кеш ресурса.
Контент на созданном CDN-ресурсе будет доступен только по подписанным ссылкам.
Создайте ресурсную запись CNAME для CDN-ресурса
-
Получите значение доменного имени провайдера CDN.
-
В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. -
Выберите сервис Cloud DNS.
-
Выберите созданную ранее DNS-зону.
-
Нажмите Создать запись.
-
Задайте параметры записи:
- В поле Имя выберите
Создать поддомени укажите имя, которое вы присвоили поддомену CDN-ресурса. Например: если доменное имя вашего CDN-ресурса —cdn.example.com, укажите толькоcdn. - В поле Тип выберите тип записи
CNAME. - В поле Значение укажите значение доменного имени провайдера CDN.
- В поле Имя выберите
-
Нажмите Создать.
-
Получите значение доменного имени провайдера CDN.
-
Создайте ресурсную запись CNAME в сервисе Cloud DNS:
yc dns zone add-records \ --name my-domain-zone \ --record "<поддомен> 600 CNAME <значение_cname>"Где:
<поддомен>— поддомен, созданный для CDN-ресурса. Например, для доменного имениcdn.example.comздесь нужно указатьcdn.<значение_cname>— полученное на предыдущем шаге значениеcnameдля CDN-ресурса.
Результат:
+--------+------------------+-------+-------------------------------------------+-----+ | ACTION | NAME | TYPE | DATA | TTL | +--------+------------------+-------+-------------------------------------------+-----+ | + | cdn.example.com. | CNAME | 328938ed********.a.yccdn.cloud.yandex.net | 600 | +--------+------------------+-------+-------------------------------------------+-----+Подробнее о команде
yc dns zone add-recordsчитайте в справочнике CLI.
Чтобы получить значение CNAME-записи для CDN-ресурса, воспользуйтесь методом REST API getProviderCName для ресурса Resource или вызовом gRPC API ResourceService/GetProviderCName.
Чтобы создать ресурсную запись CNAME в зоне DNS, воспользуйтесь методом REST API updateRecordSets для ресурса DnsZone или вызовом gRPC API DnsZoneService/UpdateRecordSets.
Опубликуйте сайт на веб-сервере
Далее вы создадите и опубликуете на вашем веб-сервере сайт, который будет генерировать подписанные ссылки на контент, расположенный на защищенном CDN-ресурсе. Чтобы обеспечить безопасность передаваемых данных, вы скопируете на веб-сервер созданный ранее TLS-сертификат и включите SSL-шифрование.
Выгрузите сертификат из Certificate Manager
Чтобы использовать созданный в Certificate Manager TLS-сертификат в конфигурации вашего веб-сервера, выгрузите цепочку сертификатов и закрытый ключ в текущую директорию:
-
Узнайте идентификатор созданного ранее TLS-сертификата:
yc certificate-manager certificate listРезультат:
+----------------------+---------------+-----------------------------+---------------------+---------+--------+ | ID | NAME | DOMAINS | NOT AFTER | TYPE | STATUS | +----------------------+---------------+-----------------------------+---------------------+---------+--------+ | fpq90lobsh0l******** | mymanagedcert | cdn.example.com,example.com | 2024-03-22 16:42:53 | MANAGED | ISSUED | +----------------------+---------------+-----------------------------+---------------------+---------+--------+Подробнее о команде
yc certificate-manager certificate listчитайте в справочнике CLI. -
Выгрузите ключ и сертификат, указав полученный на предыдущем шаге идентификатор:
yc certificate-manager certificate content \ --id <идентификатор_сертификата> \ --chain ./certificate_full_chain.pem \ --key ./private_key.pemПодробнее о команде
yc certificate-manager certificate contentчитайте в справочнике CLI.
Настройте веб-сервер
-
Скопируйте на ВМ с веб-сервером полученные сертификаты и закрытый ключ:
scp ./certificate_full_chain.pem yc-user@<IP-адрес_ВМ>:certificate_full_chain.pem \ && scp ./private_key.pem yc-user@<IP-адрес_ВМ>:private_key.pemГде
<IP-адрес_ВМ>— публичный IP-адрес созданной ранее ВМ с веб-сервером.Узнать IP-адрес ВМ можно в консоли управления
на странице ВМ в блоке Сеть или с помощью команды CLIyc compute instance get mywebserver.При первом подключении к ВМ появится предупреждение о неизвестном хосте:
The authenticity of host '51.250.**.*** (51.250.**.***)' can't be established. ED25519 key fingerprint is SHA256:PpcKdcT09gjU045pkEIwIU8lAXXLpwJ6bKC********. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])?Введите в терминале слово
yesи нажмите Enter. -
Подключитесь к ВМ с веб-сервером:
ssh yc-user@<IP-адрес_ВМ> -
Создайте директорию для сертификата и перенесите в нее скопированные файлы:
sudo mkdir /etc/ssl-certificates sudo mv certificate_full_chain.pem /etc/ssl-certificates/ sudo mv private_key.pem /etc/ssl-certificates/ -
Создайте директорию для файлов вашего сайта и предоставьте необходимые права на нее пользователю
www-data:sudo mkdir -p /var/www/<имя_домена>/public_html sudo chown www-data:www-data /var/www/<имя_домена>/public_htmlГде
<имя_домена>— доменное имя вашего сайта, напримерexample.com. -
Настройте виртуальный хост для вашего сайта:
-
Создайте файл конфигурации виртуального хоста:
sudo nano /etc/apache2/sites-available/mywebsite.conf -
Поместите в созданный файл следующую конфигурацию:
<VirtualHost *:443> ServerName <имя_домена> ServerAdmin webmaster@localhost DocumentRoot /var/www/<имя_домена>/public_html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/ssl-certificates/certificate_full_chain.pem SSLCertificateChainFile /etc/ssl-certificates/certificate_full_chain.pem SSLCertificateKeyFile /etc/ssl-certificates/private_key.pem </VirtualHost>Где
<имя_домена>— доменное имя вашего сайта, напримерexample.com. -
Активируйте созданный виртуальный хост:
sudo a2ensite mywebsiteРезультат:
Enabling site mywebsite. To activate the new configuration, you need to run: systemctl reload apache2 -
Включите для веб-сервера поддержку
ssl:sudo a2enmod sslРезультат:
Considering dependency setenvif for ssl: Module setenvif already enabled Considering dependency mime for ssl: Module mime already enabled Considering dependency socache_shmcb for ssl: Enabling module socache_shmcb. Enabling module ssl. See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates. To activate the new configuration, you need to run: systemctl restart apache2 -
Перезапустите веб-сервер:
sudo systemctl reload apache2
-
Создайте сайт
-
Создайте файл главной страницы сайта:
sudo nano /var/www/<имя_домена>/public_html/index.phpГде
<имя_домена>— доменное имя вашего сайта, напримерexample.com. -
Поместите в созданный файл
index.phpследующий код:<!DOCTYPE html> <html> <head> <title>Secure token generator website</title> <meta charset="utf-8" /> </head> <body> <h2>Генератор защищенных ссылок</h2> <p>Ниже сгенерирована подписанная ссылка на защищенный CDN-ресурс. Срок жизни ссылки — 5 минут. Контент по ссылке доступен лишь тому пользователю, для которого сайт эту ссылку сгенерировал (проверяется по IP-адресу).</p> <br> <?php $secret = '<секретный_ключ>'; $ip = trim(getUserIpAddr()); $domain_name = '<доменное_имя>'; $path = '<ключ_объекта>'; $expires = time() + 300; $link = "$expires$path$ip $secret"; $md5 = md5($link, true); $md5 = base64_encode($md5); $md5 = strtr($md5, '+/', '-_'); $md5 = str_replace('=', '', $md5); $url = '<a href="https://'.$domain_name.$path.'?md5='.$md5.'&expires='.$expires.'" target="_blank">Подписанная ссылка на файл</a>'; echo "<p>Ваш IP-адрес: <b>".$ip."</b></p><p>Если вы используете VPN, ссылка может не сработать. Для корректной работы генератора подписанных ссылок отключите VPN.</p>"; echo "<br><br>"; echo $url; function getUserIpAddr() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $addr = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $addr = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $addr = $_SERVER['REMOTE_ADDR']; } return $addr; } ?> </body> </html>Где:
$secret— созданный при настройке CDN-ресурса секретный ключ.$domain_name— доменное имя созданного CDN-ресурса. Например:cdn.example.com.$path— ключ объекта в бакете-источнике, например/content.jpg. Обязательно со знаком/.
Сайт будет генерировать подписанную ссылку для доступа к этому объекту через CDN-ресурс.
Проверьте работу защищенного доступа к файлам
Чтобы проверить работу генератора подписанных ссылок на защищенный CDN-ресурс:
-
Откройте в браузере созданный сайт, например
https://example.com. -
Пройдите по сгенерированной ссылке.
Если все работает правильно, у вас должно открыться изображение на защищенном CDN-ресурсе.
Примечание
Подключенный VPN может мешать правильной работе генератора подписанных ссылок. Для корректной работы сайта отключите VPN.
-
Откройте полученную ссылку на другом устройстве, выходящем в интернет с другого IP-адреса. Например, на смартфоне.
Доступ к контенту окажется запрещен.
-
Попробуйте открыть полученную ссылку на исходном устройстве по истечении пяти минут.
Доступ к контенту окажется запрещен.
Вы настроили защищенный доступ к контенту.
При формировании ссылок также можно задать определенный доверенный IP-адрес, например IP-адрес компании, который используется в корпоративной сети для доступа к интернету. Так вы сможете запретить доступ к вашему контенту за пределами сетевой инфраструктуры вашей компании.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
- Удалите CDN-ресурс, затем удалите группу источников.
- Удалите созданные в бакете объекты, затем удалите сам бакет.
- Удалите созданную виртуальную машину.
- Удалите созданную доменную зону.
- Удалите созданный TLS-сертификат.
- Удалите созданную группу безопасности, затем удалите созданную подсеть, затем удалите созданную сеть.