Защита входящего трафика Cloud Run

1. Обзор

В этой лабораторной работе показано, как ограничить доступ к службе Cloud Run и разрешить только запросы от рабочей нагрузки, выполняющейся локально или в VPC вашего проекта. Вы можете использовать два уровня контроля доступа: настройки входа и политики управления идентификацией и доступом (IAM).

5aed47d10595c878.png

Настройки входа

Настройки входящего трафика позволяют фильтровать запросы по их сетевому происхождению (внутреннему или внешнему). По умолчанию разрешены все запросы, в том числе из общедоступного Интернета.

IAM-политика

Политики IAM позволяют фильтровать запросы на основе личности отправителя и обычно используются для аутентификации запросов между службами.

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

Локальные хосты подключаются через VPC.

В этой лабораторной работе мы смоделируем локальную рабочую нагрузку. Чтобы подключить локальный хост к Cloud Run, вам необходимо настроить частный доступ Google для локальных хостов . Сюда входит настройка шлюза Cloud VPN в сети VPC, как показано ниже.

31611f6a2f12fd0c.png

Моделирование локальной рабочей нагрузки с использованием сервера перехода в VPC

В этой лабораторной работе вы смоделируете отправку запросов с локального хоста, отправляя запросы с виртуальной машины Compute Engine в VPC, как показано здесь.

aebf22740c7a84f0.png

Виртуальная машина Compute Engine, которую вы будете использовать в качестве сервера перехода, имеет тот же сетевой источник, что и облачный VPN-шлюз, поэтому вы можете использовать ее для имитации отправки запросов из локальной рабочей нагрузки.

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

Самостоятельная настройка среды

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

Настройка среды

  1. Задайте для переменной среды идентификатор проекта для использования в последующих командах:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ZONE=us-central1-a
  1. Включите API, необходимые для выполнения этой лабораторной работы.
gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  compute.googleapis.com \
  artifactregistry.googleapis.com
  1. Клонируйте репозиторий примера приложения и перейдите в каталог.
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git

cd cymbal-eats/partner-registration-service
  1. Установите регион и зону по умолчанию для Compute Engine и Cloud Run.
gcloud config set compute/region ${REGION}
gcloud config set run/region ${REGION}
gcloud config set compute/zone ${ZONE}

3. Разверните сервис

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

При выполнении следующей команды следуйте этим инструкциям:

  • Расположение исходного кода (...): убедитесь, что вы находитесь в каталоге службы регистрации партнеров, и нажмите Enter, чтобы принять значение по умолчанию.
  • Имя службы (partner-registration-service): нажмите Enter, чтобы принять значение по умолчанию.
  • Разрешить неаутентифицированные вызовы к [службе регистрации партнеров] (да/нет)? Да
gcloud run deploy 

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

Service [partner-registration-service] revision [partner-registration-service-00001-haz] has been deployed and is serving 100 percent of traffic.
Service URL: https://partner-registration-service-ssssssssss-uc.a.run.app

Откройте URL-адрес службы в браузере. Вы должны увидеть этот вывод:

Partner registration service: RUNNING

Настройте службу так, чтобы она разрешала только внутренние запросы.

Теперь вы будете использовать настройки входящего трафика службы Cloud Run, чтобы разрешать запросы только из внутренних источников. Внутренние источники включают ресурсы в сетях VPC, которые находятся в том же проекте (или периметре управления службами VPC), что и сервис Cloud Run, что делает его идеальным для нашего варианта использования.

Кроме того, запросы от других продуктов Google Cloud считаются внутренними, даже если они не являются частью VPC. К таким продуктам относятся, например, Pub/Sub и Workflows.

Запросы из этих источников остаются в сети Google, даже если они получают доступ к вашей службе по URL-адресу run.app , а публичный доступ запрещен.

Обновите службу, чтобы разрешить только внутренние запросы:

gcloud run services update partner-registration-service --ingress=internal

Если вы снова откроете URL-адрес службы, появится сообщение « Ошибка: запрещено — доступ запрещен ».

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

4. Создайте виртуальную машину Compute Engine в качестве сервера перехода.

Следующим шагом является имитация запросов от локального сервера через шлюз Cloud VPN путем создания экземпляра Compute Engine в VPC для использования в качестве сервера перехода:

gcloud compute instances create jump-server --scopes=https://www.googleapis.com/auth/cloud-platform

Вывод этой команды должен быть примерно таким:

NAME         ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
jump-server  us-central1-a  n1-standard-1               10.128.0.10  34.170.108.8  RUNNING

Отправьте запрос от экземпляра Compute Engine в службу.

Теперь вы откроете терминал на виртуальной машине и отправите запрос непосредственно с машины в сети VPC.

Если следующая команда предложит вам настроить SSH в Cloud Shell, следуйте инструкциям:

gcloud compute ssh jump-server

Получите URL-адрес службы Cloud Run с помощью этой команды:

gcloud run services describe partner-registration-service --region us-central1

Первые несколько строк вывода должны выглядеть так:

✔ Service partner-registration-service in region us-central1

URL:     https://partner-registration-service-ssssssssss-uc.a.run.app
Ingress: internal

Теперь скопируйте URL-адрес и отправьте запрос от экземпляра Compute Engine с помощью Curl. Этот запрос должен быть успешным, поскольку экземпляр виртуальной машины работает в сети VPC вашего проекта — это внутренний источник.

export SERVICE_URL=https://

curl ${SERVICE_URL}

В выводе должно быть сказано:

Partner registration service: RUNNING

5. А как насчет контроля доступа на основе IAM?

В ходе этой лабораторной работы было показано, как и когда использовать настройки входящего трафика. Настройки входящего трафика — отличный первый шаг, если вы подключаете локальную рабочую нагрузку к Cloud Run.

Управление доступом на основе IAM требует больше усилий для реализации, особенно если вы звоните с локального хоста:

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

Google рекомендует многоуровневый подход к контролю доступа. Использование настроек входящего трафика для ограничения доступа только к внутренним хостам — отличный первый шаг, но не останавливайтесь на достигнутом!

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

Поздравляем, вы завершили работу над кодом!

Что дальше:

Ознакомьтесь с другими лабораториями Cymbal Eats:

Очистить

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

Удаление проекта

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

Полезные ссылки

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