Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Истории успеха
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • ИИ для бизнеса
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Калькулятор цен
    • Тарифы
    • Промоакции и free tier
    • Правила тарификации
  • Истории успеха
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Все решения
    • Все решения для Cloud CDN
    • Устранение ошибок `no such bucket` и `no such key` при загрузке объектов из Cloud CDN
    • Устранение ошибки `CNAME already exists`
    • Устранение ошибки `You cannot enable redirect HTTP to HTTPS when HTTPS is disabled`
    • Сервис Cloud CDN возвращает только один IP-адрес
    • Как ограничить доступ к бакету Object Storage диапазоном IP-адресов, принадлежащих Cloud CDN

В этой статье:

  • Описание задачи
  • Решение
  1. Cloud CDN
  2. Как ограничить доступ к бакету Object Storage диапазоном IP-адресов, принадлежащих Cloud CDN

Как ограничить доступ к бакету Object Storage диапазоном IP-адресов, принадлежащих Cloud CDN

Статья создана
Yandex Cloud
Улучшена
alexrigin
Обновлена 10 ноября 2025 г.
  • Описание задачи
  • Решение

Описание задачиОписание задачи

Необходимо, чтобы контент статического сайта или SPA, размещенного в Yandex Object Storage, был доступен только для Yandex Cloud CDN.

РешениеРешение

Логика размещения статических сайтов в Object Storage предусматривает, что содержимое бакета должно быть доступно для всех IP-адресов и подсетей, которые запрашивают контент с сайта.

Инфраструктура Cloud CDN кеширует содержимое бакета с сайтом на своих серверах, однако в консоли управления пока отсутствует возможность настроить доступ к бакету исключительно из сетей CDN.

Для реализации этого сценария необходимо ограничить публичный доступ к бакету по IP-адресам, вручную разрешив подключения только из подсетей Yandex Cloud CDN, запрещая доступ к содержимому бакета для всех остальных IP-адресов. В этом случае необходимо настроить политику доступа для бакета, в которой будут указаны диапазоны IP-адресов, которые используются сервисом Cloud CDN.

Yandex Cloud CDN
EdgeCDN

Список подсетей провайдера Yandex Cloud CDN доступен в документации.

Список задействованных сервисом IP-адресов и подсетей расположен по ссылкам:

  • Список публичных IP-адресов провайдера EdgeЦентр;
  • Список подсетей провайдера EdgeЦентр c указанием CIDR;

Примечание

Список адресов периодечски меняется: в него могут быть включены новые или удалены более незадействованные IP-адреса или подсети.

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

Примените политику из указанного ниже примера по этой инструкции.
Перед применением политики на основе приложенного примера следует изменить <имя бакета> на наименование вашего бакета в Object Storage.

Yandex Cloud CDN
EdgeCDN
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::<имя бакета>/*",
      "Condition": {
        "IpAddress": {
          "aws:sourceip": "188.72.103.0/24"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::<имя бакета>/*",
      "Condition": {
        "IpAddress": {
          "aws:sourceip": "188.72.104.0/24"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::<имя бакета>/*",
      "Condition": {
        "IpAddress": {
          "aws:sourceip": "188.72.105.0/24"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::<имя бакета>/*",
      "Condition": {
        "IpAddress": {
          "aws:sourceip": "188.72.110.0/24"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::<имя бакета>/*",
      "Condition": {
        "IpAddress": {
          "aws:sourceip": "188.72.111.0/24"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::<имя бакета>/*",
      "Condition": {
        "IpAddress": {
          "aws:sourceip": "188.72.112.0/24"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::<имя бакета>/*",
      "Condition": {
        "IpAddress": {
          "aws:sourceip": "188.72.113.0/24"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::<имя бакета>/*",
      "Condition": {
        "IpAddress": {
          "aws:sourceip": "89.223.9.0/24"
        }
      }
    }
  ]
}

Список IP-адресов для CDN-провайдера EdgeCenter предоставлен по ссылке. Поскольку список очень большой, лучше автоматически сформировать ACL, а затем загрузить его в конфигурацию бакета.
В этом руководстве предоставлен пример скрипта на Python. Сохраните скрипт в файл acl_generator.py и запустите его с помощью команды python3 acl_generator.py https://api.edgecenter.ru/cdn/public_ips_list my-bucket -o policy.json, где my-bucket – наименование бакета в Object Storage.

Пример Python-скрипта
 import json
 import requests
 import argparse

 def main():
   parser = argparse.ArgumentParser(description='Generate S3 Bucket ACL from IP list')
   parser.add_argument('url', help='URL of JSON file with IP addresses')
   parser.add_argument('bucket', help='S3 bucket name')
   parser.add_argument('-o', '--output', default='acl.json', help='Output filename (default: acl.json)')
   args = parser.parse_args()

   try:
       response = requests.get(args.url, timeout=10)
       response.raise_for_status()
       data = response.json()

       if 'addresses' not in data or not isinstance(data['addresses'], list):
           raise ValueError("Invalid JSON structure: 'addresses' array not found")
       
       acl = {
           "Version": "2012-10-17",
           "Statement": [
               {
                   "Effect": "Allow",
                   "Principal": "*",
                   "Action": "s3:GetObject",
                   "Resource": f"arn:aws:s3:::{args.bucket}/*",
                   "Condition": {
                       "IpAddress": {
                           "aws:sourceip": address
                       }
                   }
               }
               for address in data['addresses']
           ]
       }

       with open(args.output, 'w') as f:
           json.dump(acl, f, indent=4)
       
       print(f"ACL successfully generated for {len(data['addresses'])} IPs. Saved to {args.output}")

   except requests.exceptions.RequestException as e:
       print(f"Network error: {e}")
   except json.JSONDecodeError:
       print("Error: Invalid JSON format in response")
   except ValueError as e:
       print(e)

if __name__ == "__main__":
   main()

Была ли статья полезна?

Предыдущая
Сервис Cloud CDN возвращает только один IP-адрес
Следующая
Все решения для Cloud Logging
Проект Яндекса
© 2025 ООО «Яндекс.Облако»