Защита Edge Cache с помощью Cloud Armor

1. Введение

Политики безопасности Google Cloud Armor Edge позволяют ограничивать доступ к кэшированным объектам в Google Cloud CDN и Google Cloud Storage. Примерами причин для этого являются обеспечение того, чтобы ваши пользователи не получали доступ к объектам в хранилищах из регионов с ограниченным доступом, или обеспечение фильтрации распространения медиаконтента в тех регионах, где у вас есть лицензия на это.

В этой лабораторной работе мы создадим хранилище GCS, загрузим в него образ, привяжем его к балансировщику нагрузки, а затем включим политики Cloud CDN и Edge Security.

Что вы узнаете

  • Как настроить хранилище Cloud Storage с возможностью кэширования контента
  • Как создать политику безопасности на границе сети для защиты контента.
  • Как проверить, что политика безопасности Edge работает должным образом?

Что вам понадобится

  • Базовые знания сетевых технологий и протокола HTTP.
  • Базовые знания командной строки Unix/Linux.

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google, и вы можете изменить её в любое время.
  • Идентификатор проекта должен быть уникальным для всех проектов Google Cloud и неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор проекта (обычно он обозначается как PROJECT_ID ), поэтому, если он вам не нравится, сгенерируйте другой случайный идентификатор или попробуйте свой собственный и посмотрите, доступен ли он. Затем он "замораживается" после создания проекта.
  • Существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
  1. Далее вам потребуется включить оплату в консоли Cloud, чтобы использовать ресурсы/API Cloud. Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, следуйте инструкциям по «очистке», приведенным в конце практического задания. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.

В консоли GCP щелкните значок Cloud Shell на панели инструментов в правом верхнем углу:

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Всю работу в этой лаборатории можно выполнять с помощью обычного браузера.

Прежде чем начать

Внутри Cloud Shell убедитесь, что идентификатор вашего проекта указан правильно.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
PROJECT_ID=[YOUR-PROJECT-NAME]
echo $PROJECT_ID

Включить API

Включите все необходимые службы

gcloud services enable compute.googleapis.com
gcloud services enable logging.googleapis.com
gcloud services enable monitoring.googleapis.com

3. Создайте сегмент облачного хранилища.

В консоли Cloud перейдите в меню «Навигация» > «Облачное хранилище» > «Браузер» . Нажмите «СОЗДАТЬ КОРЗИНУ» :

baf3d3c74282ecba.png

Правила именования контейнеров:

  • Не включайте конфиденциальную информацию в имя корзины, поскольку пространство имен корзины является глобальным и общедоступным.
  • Названия контейнеров должны содержать только строчные буквы, цифры, дефисы (-), подчеркивания (_) и точки (.). Названия, содержащие точки, требуют проверки .
  • Названия категорий должны начинаться и заканчиваться цифрой или буквой.
  • Названия сегментов должны содержать от 3 до 63 символов. Названия, содержащие точки, могут содержать до 222 символов, но каждый компонент, разделённый точкой, не может быть длиннее 63 символов.
  • Имена сегментов (bucket names) нельзя представить в виде IP-адреса в десятичной точечной записи (например, 192.168.5.4).
  • Названия сегментов не могут начинаться с префикса "goog".
  • В названиях контейнеров не может содержаться слово «google» или его близкие по написанию орфографические ошибки.
  • Кроме того, для соответствия требованиям DNS и обеспечения совместимости в будущем не следует использовать символы подчеркивания (_) или точки, расположенные рядом с другой точкой или дефисом. Например, "." или "-." или ".-" недопустимы в DNS-именах.

Нажмите ПРОДОЛЖИТЬ .

Тип местоположения: регион

Местоположение: выберите регион, расположенный далеко от вас.

Нажмите ПРОДОЛЖИТЬ .

Класс хранилища по умолчанию: Стандартный

Нажмите ПРОДОЛЖИТЬ .

Снимите флажок «Применить предотвращение публичного доступа к этому сегменту» в разделе «Предотвратить публичный доступ».

В разделе «Контроль доступа» выберите «Тонкая детализация» .

Нажмите ПРОДОЛЖИТЬ .

После настройки хранилища нажмите кнопку СОЗДАТЬ :

Вот и все — вы только что создали хранилище Cloud Storage!

4. Загрузите объект в свой бакет.

Теперь загрузите объект в корзину.

Сначала загрузите это изображение во временный экземпляр Cloud Shell. В приведенном ниже примере используется изображение Google с главной страницы Google.

Из Cloud Shell

wget --output-document google.png https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png

Используйте команду gsutil cp, чтобы загрузить изображение из места, где вы его сохранили, в созданный вами бакет:

Из Cloud Shell

gsutil cp google.png gs://YOUR-BUCKET-NAME

Теперь удалите загруженное изображение:

Из Cloud Shell

rm google.png

Найдите свой объект, щелкните по трем точкам справа и измените права доступа на общедоступные.

821aad82d8633922.png

30a975d3ad22d33d.png

5. Создайте балансировщик нагрузки.

Далее мы создадим балансировщик нагрузки HTTP.

Перейдите в раздел «Сеть» >> «Сетевые службы» >> «Балансировка нагрузки» >> «Создать балансировщик нагрузки» >> «Балансировщик нагрузки HTTP» >> «Интернет для моих виртуальных машин» >> «Классический балансировщик нагрузки HTTP(S)».

Для начала придумайте имя для балансировщика нагрузки, который вы будете создавать.

Создать бэкэнд-бакет

Создайте новый бэкэнд-корзину, используя ту же самую, которую вы только что создали, и выберите «Включить CDN» и «Кэшировать статический контент». Нажмите «Создать».

ed392a56538d499e.png

Создайте правила для хоста и пути.

Перейдите к правилам хоста и пути в левой части экрана. Мы будем использовать простое правило хоста/пути и отправлять все запросы в хранилище.

7c1a664e0d1f15b0.png

Создание конфигурации внешнего интерфейса

Выберите конфигурацию интерфейса. Для конфигурации интерфейса мы будем использовать HTTP (хотя HTTPS также будет работать, если у вас есть сертификат) и временный IP-адрес, а также убедитесь, что вы выбрали сеть премиум-уровня.

2597a5e63d618622.png

Нажмите «Создать».

Получить IP-адрес балансировщика нагрузки

Получите IP-адрес балансировщика нагрузки из консоли, щелкнув по имени балансировщика нагрузки в списке балансировщиков нагрузки для вашего проекта.

9b757362d806e835.png

Запрос к балансировщику нагрузки

Через пару минут попробуйте запросить у балансировщика нагрузки информацию о загруженном вами объекте. Вам понадобится IP-адрес балансировщика нагрузки и имя образа. Команда имеет следующую структуру:

Из терминала

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

Выход

armanrye-macbookpro% curl -svo /dev/null http://34.98.81.123/google.png
*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdtoILI76KVsvBvdVGvSfzaxys1m3zYqCepBrmJxAI48ni24cWCRIdNu-53PX3DS6iycxp6xwFbMpwtcHHZQUQmEBxAgng
< Expires: Mon, 13 Dec 2021 22:58:26 GMT
< Date: Mon, 13 Dec 2021 21:58:26 GMT
< Cache-Control: public, max-age=3600
< Last-Modified: Mon, 13 Dec 2021 21:45:57 GMT
< ETag: "8f9327db2597fa57d2f42b4a6c5a9855"
< x-goog-generation: 1639431957957903
< x-goog-metageneration: 2
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 5969
< Content-Type: image/png
< x-goog-hash: crc32c=TeiHTA==
< x-goog-hash: md5=j5Mn2yWX+lfS9CtKbFqYVQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: bytes
< Content-Length: 5969
< Server: UploadServer

Убедитесь, что ваш контент загружается из CDN через мониторинг CDN или балансировки нагрузки. Вы должны получить коэффициент попаданий, близкий к 100%. Если вам нужно выполнить несколько запросов, вы можете сделать следующее.

Из терминала

#for i in `seq 1 50`; do curl http://%loadbalncer-IP%/google.png; done

Подтвердите, что контент предоставляется облачной CDN-сетью.

Убедитесь, что вы обслуживаете трафик из CDN, перейдя в раздел «Сетевые службы» >> «CDN».

a52d0ba4c084aa05.png

6. Удалите объект из GCS.

Теперь, когда кэш заполнен, давайте удалим объект из хранилища, чтобы подчеркнуть, что мы применяем политику к кэшу, а не к бэкэнду.

Перейдите в Cloud Storage >> %bucket name% >> objects

Выберите изображение и удалите его.

a1cc1bb9a0ff41df.png

7. Создайте политику безопасности Edge для кэша вашей CDN.

Перейдите в раздел «Сетевая безопасность» >> «Cloud Armor» и нажмите «Создать политику».

Выберите следующее

Тип политики: Политика безопасности на границе сети

Действие по умолчанию: Запретить

7a12374be33026fd.png

b7c4efc091272358.png

77ddbcddd07b65d2.png

Примените эту политику к вашему бэкэнд-хранилищу.

8. Проверьте политику безопасности Edge.

Теперь, когда мы создали политику безопасности Edge перед нашим бэкэнд-сервером, давайте проверим, работает ли она должным образом.

Проверьте политику безопасности.

Через несколько минут вы сможете убедиться, что политика Cloud Armor запущена. В командной строке выполнение следующей команды приведет к ошибке 403.

Из терминала

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

Выход

curl -svo /dev/null http://34.98.81.123/google.png
*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< X-GUploader-UploadID: ADPycdtS6FtJOGIsiWYDrAAE8VFeQuNutcvbGoQe2t8EZxsuspVtmCjyiTv_P3CNktroHMOGFXkTCfG-Jj-rUO60ZGPpEbpqcw
< Content-Type: application/xml; charset=UTF-8
< Content-Length: 111
< Date: Mon, 13 Dec 2021 23:09:35 GMT
< Expires: Mon, 13 Dec 2021 23:09:35 GMT
< Cache-Control: private, max-age=0
< Server: UploadServer
<

Изучите журналы событий.

Далее вы можете проверить журналы, чтобы увидеть применяемую политику безопасности на границе сети. Перейдите в раздел «Операции» >> «Ведение журналов» >> «Проводник журналов».

Введите приведенный ниже фрагмент в запрос и нажмите «Выполнить».

14972af5ae6c182a.png

resource.type:(http_load_balancer) AND jsonPayload.enforcedEdgeSecurityPolicy.name:(%SECURITY_POLICY_NAME%)

Обратите внимание на ответ 403 и на применяемую политику безопасности.

cddc48ca93ad79ca.png

Удалите политику безопасности

Удалите политику безопасности и запросите объект из кэша.

Перейдите в раздел «Сетевая безопасность» >> «Cloud Armor» >> «%POLICY NAME%» >> «цели» и удалите целевой сегмент.

350655729a89eb33.png

Подтверждение удаления политики

Через несколько минут отправьте еще один запрос curl к ресурсу в хранилище. На этот раз вы получите ответ с кодом 200.

Из терминала

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

Выход

armanrye-macbookpro% curl -svo /dev/null http://34.98.81.123/google.png

*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdtI7f49P3MSuZSZ8vl6RwfwmnIDJ59EeSKp7UPvLPawdaiRHXiNWLtseQTxUxceWOvSLvpYmT3pWVkV4qeIP7M
< Date: Mon, 13 Dec 2021 23:06:46 GMT
< Last-Modified: Mon, 13 Dec 2021 21:45:57 GMT
< ETag: "8f9327db2597fa57d2f42b4a6c5a9855"
< x-goog-generation: 1639431957957903
< x-goog-metageneration: 2
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 5969
< Content-Type: image/png
< x-goog-hash: crc32c=TeiHTA==
< x-goog-hash: md5=j5Mn2yWX+lfS9CtKbFqYVQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: bytes
< Content-Length: 5969
< Server: UploadServer
< Age: 1621
< Cache-Control: public,max-age=3600
<
{ [775 bytes data]
* Connection #0 to host 34.98.81.123 left intact
* Closing connection 0

Поздравляем! Вы успешно завершили эту лабораторную работу по политикам безопасности Cloud Armor Edge.

©2020 Google LLC. Все права защищены. Google и логотип Google являются товарными знаками Google LLC. Все остальные названия компаний и продуктов могут являться товарными знаками соответствующих компаний, с которыми они связаны.

9. Уборка лаборатории

Перейдите в раздел «Сетевая безопасность» >> «Cloud Armor» >> «%НАЗВАНИЕ ПОЛИТИКИ%» и выберите «Удалить».

21eefb5f375e8fee.png

Перейдите в раздел «Облачное хранилище», выберите созданный вами сегмент и нажмите «Удалить».

ef2fa8d45c1d3452.png

Перейдите в раздел «Сеть» >> «Сетевые службы» >> «Балансировка нагрузки». Выберите созданный вами балансировщик нагрузки и нажмите «Удалить».

ee2e78c10f4104eb.png

10. Поздравляем!

Вы успешно завершили практическое задание «Защита кэша Edge с помощью Cloud Armor»!

Что мы рассмотрели

  • Как настроить хранилище в облаке и связанный с ним балансировщик нагрузки в облаке
  • Как создать политику безопасности Cloud Armor Edge
  • Как проверить, что политика безопасности Edge работает должным образом.

Следующие шаги

  • Попробуйте настроить политику безопасности Edge с учетом попадания в кэш ресурса вычислительного ядра.