Доступ в бакет с помощью сервисного подключения из Yandex Virtual Private Cloud
Важно
Функциональность Сервисные подключения (VPC Private Endpoints) находится на стадии Preview. Чтобы запросить доступ, обратитесь к вашему аккаунт-менеджеру.
Вы можете организовать прямой доступ к бакетам Object Storage из облачных сетей VPC с помощью сервисного подключения VPC. При таком подключении сервис Object Storage будет доступен по внутренним IP-адресам VPC без использования доступа в интернет.
Чтобы организовать доступ в бакет с помощью сервисного подключения из VPC:
- Создайте сервисное подключение VPC.
- Настройте политику доступа для бакета.
- Настройте ограничение для доступа только из сервисных подключений.
Создайте сервисное подключение VPC
Для создания сервисного подключения необходима одна из следующих ролей:
vpc.privateEndpoints.editorvpc.privateEndpoints.adminvpc.privateAdminvpc.adminadmin
-
В консоли управления
перейдите в каталог, в котором вы хотите настроить сервисное подключение. -
Перейдите в сервис Virtual Private Cloud.
-
На панели слева выберите
Сервисные подключения. -
Нажмите кнопку Создать подключение.
-
В поле Имя укажите название сервисного подключения. Требования к названию:
- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
(Опционально) В поле Описание добавьте описание.
-
(Опционально) Добавьте метки:
- Нажмите Добавить метку.
- Введите метку в формате
ключ: значение. - Нажмите Enter.
-
В блоке Сетевые настройки:
-
В поле Сеть укажите сеть, для которой хотите создать сервисное подключение.
-
Чтобы назначить случайный приватный IP-адрес, в поле Адрес выберите
Автоматически. -
Чтобы зарезервировать список адресов:
-
В поле IP-адрес выберите
Список. -
Нажмите Зарезервировать.
-
В открывшемся окне:
- Укажите имя и описание IP-адреса.
- Выберите подсеть.
- Назначьте внутренний IPv4-адрес, например
172.16.0.3. - Активируйте опцию Защита от удаления, чтобы адрес нельзя было удалить, пока вы не выключите защиту.
- Добавьте метки.
- Нажмите Создать.
- Повторите шаги для резервирования дополнительных IP-адресов.
-
-
В поле Сервис выберите Object Storage.
-
(Опционально) Активируйте опцию Создать основную DNS-запись, чтобы при включении создать дополнительную DNS-запись A-типа для публичного FQDN сервиса. В ней будет указан внутренний IP-адрес, выделенный для сервисного подключения.
В зависимости от того, применен ли параметр, будут автоматически созданы следующие ресурсные записи для доступа в Object Storage:
-
параметр не используется:
Имя Тип Значение storage.pe.yandexcloud.net A <внутренний_IP-адрес_сервисного_подключения> *.storage.pe.yandexcloud.net A <внутренний_IP-адрес_сервисного_подключения> -
параметр используется:
Имя Тип Значение storage.pe.yandexcloud.net A <внутренний_IP-адрес_сервисного_подключения> *.storage.pe.yandexcloud.net A <внутренний_IP-адрес_сервисного_подключения> storage.yandexcloud.kz A <внутренний_IP-адрес_сервисного_подключения> *.storage.yandexcloud.kz A <внутренний_IP-адрес_сервисного_подключения>
-
-
-
Нажмите Создать.
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.
-
Посмотрите описание команды CLI для создания сервисного подключения:
yc vpc private-endpoint create --help -
Создайте сервисное подключение к Object Storage в каталоге по умолчанию:
yc vpc private-endpoint create \ --name <имя_сервисного_подключения> \ --description "<описание_сервисного_подключения>" \ --network-name <имя_сети> \ --object-storageГде:
--name— (опционально) имя сервисного подключения.--description— (опционально) описание сервисного подключения.--network-name— имя облачной сети, в которой будет создано сервисное подключение. Также вы можете использовать идентификатор сети в параметре--network-id.--object-storage— сервисное подключение к Object Storage. Другие типы сервисных подключений пока не доступны.
При создании сервисного подключения можно использовать дополнительные параметры:
-
--address-spec— (опционально) параметры в форматеключ=значениедля внутреннего IP-адреса, который будет назначен сервисному подключению:-
address— (опционально) внутренний IP-адрес для сервисного подключения. Если IP-адрес не указан, он будет назначен случайно из диапазона указанной подсети. -
subnet-id— (опционально) идентификатор подсети, из которой будет взят IP-адрес для сервисного подключения. Если подсеть не указана, внутренний IP-адрес будет назначен случайно из диапазона одной из подсетей облачной сети.Примечание
Чтобы создать сервисное подключение, в вашей сети должна быть хотя бы одна подсеть.
-
-
--private-dns-records-enabled— (опционально) параметр для создания дополнительных ресурсных записей в DNS для переопределения публичного FQDN сервиса, к которому создается подключение.В зависимости от того, применен ли параметр, будут автоматически созданы следующие ресурсные записи для доступа в Object Storage:
-
параметр не используется:
Имя Тип Значение storage.pe.yandexcloud.net A <внутренний_IP-адрес_сервисного_подключения> *.storage.pe.yandexcloud.net A <внутренний_IP-адрес_сервисного_подключения> -
параметр используется:
Имя Тип Значение storage.pe.yandexcloud.net A <внутренний_IP-адрес_сервисного_подключения> *.storage.pe.yandexcloud.net A <внутренний_IP-адрес_сервисного_подключения> storage.yandexcloud.kz A <внутренний_IP-адрес_сервисного_подключения> *.storage.yandexcloud.kz A <внутренний_IP-адрес_сервисного_подключения>
-
-
Проверьте, что сервисное подключение создалось:
yc vpc private-endpoint listРезультат выполнения команды:
+----------------------+-------------+--------------------------------+ | ID | NAME | DESCRIPTION | +----------------------+-------------+--------------------------------+ | enpd7rq************* | s3-vpc-link | Private Endpoint to the Object | | | | Storage | +----------------------+-------------+--------------------------------+
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Опишите в конфигурационном файле Terraform параметры ресурсов, которые необходимо создать:
resource "yandex_vpc_private_endpoint" "my-vpc-endpoint" { name = "<имя_сервисного_подключения>" description = "<описание_сервисного_подключения>" network_id = "<идентификатор_облачной_сети>" # Сервисное подключение к Object Storage object_storage {} # Создание дополнительных ресурсных DNS-записей dns_options { private_dns_records_enabled = <true_или_false> } endpoint_address { subnet_id = "<идентификатор_подсети>" } }Где:
-
name— имя сервисного подключения. Необязательный параметр. -
description— описание сервисного подключения. Необязательный параметр. -
network_id— имя облачной сети, в которой будет создано сервисное подключение. Обязательный параметр. -
object_storage— сервисное подключение к Object Storage. Другие типы сервисных подключений пока не доступны. -
dns_options— блок с параметрами создания DNS-записей:-
private_dns_records_enabled— параметр для создания дополнительных ресурсных записей в DNS для переопределения публичного FQDN сервиса, к которому создается подключение. Необязательный параметр.В зависимости от того, применен ли параметр, будут автоматически созданы следующие ресурсные записи для доступа в Object Storage:
-
параметр не используется:
Имя Тип Значение storage.pe.yandexcloud.net A <внутренний_IP-адрес_сервисного_подключения> *.storage.pe.yandexcloud.net A <внутренний_IP-адрес_сервисного_подключения> -
параметр используется:
Имя Тип Значение storage.pe.yandexcloud.net A <внутренний_IP-адрес_сервисного_подключения> *.storage.pe.yandexcloud.net A <внутренний_IP-адрес_сервисного_подключения> storage.yandexcloud.kz A <внутренний_IP-адрес_сервисного_подключения> *.storage.yandexcloud.kz A <внутренний_IP-адрес_сервисного_подключения>
-
-
-
endpoint_address— блок с параметрами внутреннего IP-адреса сервисного подключения:subnet_id— идентификатор подсети, из которой будет взят IP-адрес для сервисного подключения. Если подсеть не указана, внутренний IP-адрес будет назначен случайным образом из диапазона одной из подсетей облачной сети. Необязательный параметр.
Примечание
Чтобы создать сервисное подключение, в вашей сети должна быть хотя бы одна подсеть.
Более подробную информацию о параметрах ресурса
yandex_vpc_private_endpointсм. в документации провайдера. -
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validateЕсли конфигурация является корректной, появится сообщение:
Success! The configuration is valid. -
Выполните команду:
terraform planВ терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply -
Подтвердите изменения: введите в терминале слово
yesи нажмите Enter.
Terraform создаст все требуемые ресурсы. Проверить появление ресурсов можно в консоли управления
или с помощью команды CLI:yc vpc private-endpoint list -
Чтобы создать сервисное подключение VPC, воспользуйтесь методом REST API create для ресурса PrivateEndpoint или вызовом gRPC API PrivateEndpointService/Create.
Сохраните идентификатор сервисного подключения.
Теперь бакеты Object Storage доступны по внутреннему IP-адресу VPC без использования доступа в интернет.
Настройте политику доступа для бакета
Чтобы разрешить доступ к бакету только по внутренним IP-адресам VPC, настройте для бакета политику доступа для сервисного подключения.
Примечание
На уровне политики доступа можно разрешить доступ в бакет из сервисных подключений VPC с идентификаторами, указанными в политике. Однако, согласно схеме механизмов доступа, все еще остается возможность доступа в бакет из публичной сети, например с помощью ACL объекта или при наличии другого разрешающего правила в политике.
Также при такой настройке остается возможность копирования объектов на стороне сервера (Server Side Copy) в такой бакет и из него.
-
В консоли управления
выберите каталог, в котором вы настроили сервисное подключение VPC. -
Перейдите в сервис Object Storage.
-
Выберите бакет в списке.
-
Перейдите на вкладку
Безопасность в меню слева. -
В верхней части экрана перейдите на вкладку Политика доступа.
-
Нажмите кнопку Настроить доступ.
-
Введите идентификатор политики доступа, например
private-endpoint-policy. -
Настройте правило:
-
Введите идентификатор правила, например
private-endpoint-rule. -
Настройте параметры правила:
-
Результат — разрешить.
-
Принцип выбора — включить пользователей.
-
Пользователь — все пользователи.
-
Действие — выберите опцию Все действия.
-
Ресурс —
<имя_бакета>/*.Нажмите кнопку Добавить ресурс и введите
<имя_бакета>.Примечание
Ресурс бакета не включает в себя ресурсы всех его объектов. Чтобы правило в политике доступа относилось к бакету и всем объектам, их нужно указать как отдельные ресурсы: например,
samplebucketиsamplebucket/*.
-
-
Добавьте условие для правила:
- В поле Ключ выберите
private-endpoint-id. - В поле Оператор выберите
StringEquals. - В поле Значение укажите идентификатор сервисного подключения (Private Endpoint), например
enpd7rq1s3f5********.
- В поле Ключ выберите
-
-
Нажмите кнопку Сохранить.
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.
-
Посмотрите описание команды CLI для изменения настроек бакета:
yc storage bucket update --help -
Опишите конфигурацию политики доступа в виде схемы данных формата JSON:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": [ "arn:aws:s3:::<имя_бакета>/*", "arn:aws:s3:::<имя_бакета>" ], "Condition": { "StringEquals": { "yc:private-endpoint-id": "<идентификатор_подключения>" } } } }Где:
<имя_бакета>— имя бакета в Object Storage, к которому нужно применить политику доступа, напримерmy-s3-bucket.<идентификатор_подключения>— идентификатор сервисного подключения (Private Endpoint), напримерenpd7rq1s3f5********.
-
Сохраните готовую конфигурацию в файле
policy.json. -
Выполните команду:
yc storage bucket update \ --name <имя_бакета> \ --policy-from-file <путь_к_файлу_с_политикой>После успешного применения политики доступа подключение к бакету будет возможно только из облачной сети VPC, в которой было создано соответствующее сервисное подключение (Private Endpoint).
Примечание
Для управления политикой доступа с помощью AWS CLI сервисному аккаунту должна быть назначена роль storage.admin.
Если у вас еще нет AWS CLI, установите и сконфигурируйте его.
-
Опишите конфигурацию политики доступа в виде схемы данных формата JSON:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": [ "arn:aws:s3:::<имя_бакета>/*", "arn:aws:s3:::<имя_бакета>" ], "Condition": { "StringEquals": { "yc:private-endpoint-id": "<идентификатор_подключения>" } } } }Где:
<имя_бакета>— имя бакета в Object Storage, к которому нужно применить политику доступа, напримерmy-s3-bucket.<идентификатор_подключения>— идентификатор сервисного подключения (Private Endpoint), напримерenpd7rq1s3f5********.
-
Сохраните готовую конфигурацию в файле
policy.json. -
Выполните команду:
aws s3api put-bucket-policy \ --endpoint https://storage.yandexcloud.kz \ --bucket <имя_бакета> \ --policy file://policy.json
После успешного применения политики доступа подключение к бакету будет возможно только из облачной сети VPC, в которой было создано соответствующее сервисное подключение (Private Endpoint).
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
По умолчанию для аутентификации в Object Storage Terraform использует IAM-токен. Кроме IAM-токена для аутентификации в Object Storage можно использовать сервисный аккаунт и статические ключи доступа. Более подробную информацию об особенностях аутентификации Terraform в Object Storage см. в документации провайдера.
Примечание
Если вы работаете с Object Storage через Terraform от имени сервисного аккаунта, назначьте сервисному аккаунту нужную роль, например storage.admin, на каталог, в котором будут создаваться ресурсы.
-
Откройте файл конфигурации Terraform и задайте политику с помощью ресурса
yandex_storage_bucket_policy:resource "yandex_storage_bucket_policy" "bpolicy" { bucket = "my-policy-bucket" policy = <<POLICY { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": [ "arn:aws:s3:::<имя_бакета>/*", "arn:aws:s3:::<имя_бакета>" ], "Condition": { "StringEquals": { "yc:private-endpoint-id": "<идентификатор_подключения>" } } } } POLICY }Где:
<имя_бакета>— имя бакета в Object Storage, к которому нужно применить политику доступа, напримерmy-s3-bucket.<идентификатор_подключения>— идентификатор сервисного подключения (Private Endpoint), напримерenpd7rq1s3f5********.
Более подробную информацию о параметрах ресурса
yandex_storage_bucket_policyсм. в документации провайдера. -
Примените изменения:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validateЕсли конфигурация является корректной, появится сообщение:
Success! The configuration is valid. -
Выполните команду:
terraform planВ терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply -
Подтвердите изменения: введите в терминале слово
yesи нажмите Enter.
Проверить изменения можно в консоли управления
. -
Чтобы настроить политику доступа для бакета, воспользуйтесь методом REST API update для ресурса Bucket, вызовом gRPC API BucketService/Update или методом S3 API PutBucketPolicy. Если ранее для бакета уже была настроена политика доступа, то после применения новой политики она будет полностью перезаписана.
Подробная информация о работе с политикой доступа бакета изложена на странице Управление политикой доступа.
Настройте ограничение для доступа только из сервисных подключений
Вы можете ограничить доступ в бакет на уровне сервиса, тогда доступ к бакету будет возможен только из сервисных подключений VPC.
Важно
После включения данной опции доступ в бакет из публичной сети будет невозможен. Доступ в бакет с помощью консоли управления
Разрешить доступ в бакет только из сервисных подключений VPC на уровне сервиса
- В консоли управления
выберите каталог, в котором вы настроили сервисное подключение VPC. - Перейдите в сервис Object Storage.
- Выберите бакет в списке.
- На панели слева выберите
Настройки. - В блоке Строгий режим активируйте опцию Доступ только через сервисные подключения VPC.
- В поле Сервисные подключения VPC укажите идентификатор созданного сервисного подключения.
- (Опционально) Активируйте опцию Доступ из консоли управления. Опция позволяет при включенном доступе только через сервисные подключения VPC работать с бакетом с помощью консоли управления. При отключенной опции доступ к бакету остается только через API и CLI.
- Нажмите Сохранить.
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.
-
Создайте дополнительные ресурсные записи в DNS для переопределения публичного FQDN сервиса, к которому создается подключение. Для этого включите специальный параметр сервисного подключения VPC:
yc vpc private-endpoint update \ --id <идентификатор_сервисного_подключения> \ --private-dns-records-enabled -
Измените настройки бакета, указав параметры для включения доступа только из сервисных подключений VPC:
yc storage bucket update \ --name <имя_бакета> \ --enable-private-endpoints true \ --private-endpoints <идентификатор_сервисного_подключения> \ --private-endpoints-force-cloudconsole-access trueГде:
-
--name— имя бакета. -
--enable-private-endpoints— параметр для включения доступа к бакету только из сервисных подключений VPC. Если параметр не указан, доступ к бакету будет возможен как из публичной сети, так и из сервисных подключений VPC. -
--private-endpoints— список идентификаторов сервисных подключений VPC, доступ из которых будет разрешен.Важно
Если идентификаторы сервисных подключений VPC не указаны, доступ к бакету будет невозможен отовсюду. Однако останется возможность выключить ограничения на доступ только из сервисных подключений VPC.
-
--private-endpoints-force-cloudconsole-access— (опционально) параметр для включения доступа к бакету с помощью консоли управления при включенном доступе только через сервисные подключения VPC. При отключенной опции доступ в бакет остается только через API и CLI.
-
Чтобы разрешить доступ в бакет только из сервисных подключений VPC на уровне сервиса, воспользуйтесь методом REST API update для ресурса Bucket или вызовом gRPC API Bucket/Update.
Восстановить доступ к бакету из публичной сети
- В консоли управления
выберите каталог, в котором вы настроили сервисное подключение VPC. - Перейдите в сервис Object Storage.
- Выберите бакет в списке.
- На панели слева выберите
Настройки. - В блоке Строгий режим деактивируйте опцию Доступ только через сервисные подключения VPC.
- Нажмите Сохранить.
Измените настройки бакета:
yc storage bucket update \
--name <имя_бакета> \
--enable-private-endpoints false
Где:
-
--name— имя бакета. -
--enable-private-endpoints— параметр для включения доступа к бакету только из сервисных подключений VPC.Совет
После того как ограничение на доступ только из сервисных подключений VPC снято, список сервисных подключений, переданный ранее в параметре
--private-endpoints, сохраняется в настройках бакета. При повторном ограничении доступа нет необходимости передавать список еще раз.
Чтобы разрешить доступ в бакет только из сервисных подключений VPC на уровне сервиса, воспользуйтесь методом REST API update для ресурса Bucket или вызовом gRPC API Bucket/Update.
Копирование объектов на стороне сервера (Server Side Copy)
Особенности копирования объектов на стороне сервера (Server Side Copy) в бакетах с включенным доступом только из сервисных подключений VPC приведены в таблице:
| Бакет-источник | Бакет-приемник | Условие для запуска копирования на стороне сервера1 |
|---|---|---|
| Доступ только из сервисных подключений VPC | Доступ только из сервисных подключений VPC | Запрос из сервисного подключения, которое указано в списке разрешенных для обоих бакетов |
| Доступ только из сервисных подключений VPC | Доступ из публичной сети | Запрос из сервисного подключения, которое указано в списке разрешенных для бакета-источника |
| Доступ из публичной сети | Доступ только из сервисных подключений VPC | Запрос из сервисного подключения, которое указано в списке разрешенных для бакета-приемника |
| Доступ из публичной сети | Доступ из публичной сети | Запрос из публичной сети или из сервисного подключения |
1 При наличии у клиента прав на чтение из бакета-источника и запись в бакет-приемник.