1. Обзор
В этой лабораторной работе вы развернете портал для сотрудников, позволяющий просматривать, обновлять и удалять заказы из приложения Cymbal Eats. Вы будете использовать Identity Aware Proxy (IAP) для защиты доступа к порталу без использования виртуальной частной сети (VPN). IAP упрощает внедрение модели доступа с нулевым доверием и занимает меньше времени, чем VPN, для удаленных сотрудников как в локальных, так и в облачных средах, обеспечивая единую точку управления доступом к вашим приложениям.

Что такое прокси-сервер с поддержкой идентификации?
Identity-Aware Proxy (IAP) — это сервис Google Cloud, который перехватывает запросы, отправляемые в ваше приложение, аутентифицирует пользователя, отправляющего запрос, с помощью службы Google Identity Service и пропускает запросы только в том случае, если они поступают от пользователя, авторизованного для доступа к приложению. Кроме того, он может изменять заголовки запроса, чтобы включить информацию об аутентифицированном пользователе.
Что вы узнаете
- Как настроить группу бессерверных сетевых конечных точек (NEG)
- Как настроить балансировщик нагрузки
- Как включить функцию IAP для ограничения доступа
- Как ограничить доступ с помощью IAP
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .



- Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы можете изменить её в любое время.
- Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор проекта (обычно он обозначается как
PROJECT_ID). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он останется неизменным на протяжении всего проекта. - К вашему сведению, существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
- Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить весь проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .
Настройка среды
- Создайте переменные среды, относящиеся к проекту и ресурсам.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1
export ORDER_SERVICE_URL=order-service
export INVENTORY_SERVICE_URL=inventory-service
export MENU_SERVICE_URL=menu-service
- Включите API служб IAP и Cloud Resource Manager.
gcloud services enable \
iap.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudidentity.googleapis.com \
compute.googleapis.com
- Клонируйте репозиторий с примерами приложений и перейдите в соответствующую директорию.
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/employee-ui
- Разверните портал для сотрудников с помощью скрипта установки. Дождитесь завершения работы скрипта, прежде чем переходить к следующему шагу.
./setup.sh
Пример выходных данных
... Done. Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic. Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
- Нажмите на ссылку «URL-адрес сервиса».

3. Настройка группы бессерверных сетевых конечных точек (NEG)
Вам потребуется создать группу бессерверных сетевых конечных точек ( Serverless NEG ) для сервиса Cloud Run, используемого в пользовательском интерфейсе сотрудников. Бессерверные группы конечных точек позволяют использовать бессерверные приложения Google Cloud с внешней балансировкой нагрузки HTTP(S) .

- Создайте группу сетевых конечных точек для службы пользовательского интерфейса сотрудников.
gcloud compute network-endpoint-groups create employee-ui-iap-neg \
--project $PROJECT_ID \
--region=$REGION \
--network-endpoint-type=serverless \
--cloud-run-service=employee-ui-service
Пример выходных данных
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/regions/us-east1/networkEndpointGroups/employee-ui-iap-neg]. Created network endpoint group [employee-ui-iap-neg].
Создайте бэкэнд-сервис и добавьте бессерверный NEG.
Серверная служба определяет, как Cloud Load Balancing распределяет трафик. Конфигурация серверной службы содержит набор значений, таких как протокол, используемый для подключения к серверным службам, различные параметры распределения и сессий, проверки работоспособности и тайм-ауты. Эти настройки обеспечивают точный контроль над поведением балансировщика нагрузки.
- Создайте серверную службу
gcloud compute backend-services create employee-ui-iap-backend \
--global
Пример выходных данных
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend]. NAME: employee-ui-iap-backend BACKENDS: PROTOCOL: HTTP
- Добавьте бессерверный NEG в качестве бэкэнда к бэкэнд-сервису.
gcloud compute backend-services add-backend employee-ui-iap-backend \
--global \
--network-endpoint-group=employee-ui-iap-neg \
--network-endpoint-group-region=$REGION
Пример выходных данных
Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
- Создайте карту URL-адресов для перенаправления входящих запросов к серверной части.
gcloud compute url-maps create employee-ui-iap-url-map \
--default-service employee-ui-iap-backend
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/urlMaps/employee-ui-iap-url-map]. NAME: employee-ui-iap-url-map DEFAULT_SERVICE: backendServices/employee-ui-iap-backend
4. Настройка компонентов балансировщика нагрузки
На следующей диаграмме показано, что балансировщик нагрузки использует бессерверную архитектуру NEG для перенаправления запросов к бессерверному сервису Cloud Run.

Зарезервировать статический IP-адрес
- Зарезервируйте статический IPv4-адрес и сохраните домен.
gcloud compute addresses create employee-ui-iap-ip \
--network-tier=PREMIUM \
--ip-version=IPV4 \
--global
Пример выходных данных
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/addresses/employee-ui-iap-ip].
- Сохраните домен nip.io
export DOMAIN=$(gcloud compute addresses list --filter employee-ui-iap-ip --format='value(ADDRESS)').nip.io
Создайте ресурс SSL-сертификата, управляемого Google.
- Создайте ресурс SSL-сертификата, управляемого Google.
gcloud compute ssl-certificates create employee-ui-iap-cert \
--description=employee-ui-iap-cert \
--domains=$DOMAIN \
--global
Пример выходных данных
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/sslCertificates/employee-ui-iap-cert]. NAME: employee-ui-iap-cert TYPE: MANAGED CREATION_TIMESTAMP: 2022-04-18T06:39:37.474-07:00 EXPIRE_TIME: MANAGED_STATUS: PROVISIONING 34.102.234.98.nip.io: PROVISIONING
Создайте целевой HTTPS-прокси.
- Создайте целевой HTTPS-прокси для маршрутизации запросов к вашей карте URL-адресов.
gcloud compute target-https-proxies create employee-ui-iap-http-proxy \
--ssl-certificates employee-ui-iap-cert \
--url-map employee-ui-iap-url-map
Пример выходных данных
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/targetHttpsProxies/employee-ui-iap-http-proxy]. NAME: employee-ui-iap-http-proxy SSL_CERTIFICATES: employee-ui-iap-cert URL_MAP: employee-ui-iap-url-map CERTIFICATE_MAP:
Настройте правила пересылки.
- Создайте правило переадресации для направления входящих запросов на прокси-сервер.
gcloud compute forwarding-rules create employee-ui-iap-forwarding-rule \
--load-balancing-scheme=EXTERNAL \
--network-tier=PREMIUM \
--address=employee-ui-iap-ip \
--global \
--ports=443 \
--target-https-proxy employee-ui-iap-http-proxy
Пример выходных данных
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/forwardingRules/employee-ui-iap-forwarding-rule].
Ограничение доступа к сервису Cloud Run.
Ограничьте входящий трафик, чтобы он принимал только внутренние запросы и запросы, поступающие через балансировку нагрузки HTTP(S).

- Обновите сервис, чтобы разрешить входящий трафик только от внутренних запросов и запросов через балансировщик нагрузки HTTP(S).
gcloud run services update employee-ui-service \
--ingress internal-and-cloud-load-balancing \
--region $REGION
Пример выходных данных
OK Deploying... Done. OK Creating Revision... OK Routing traffic... Done. Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic. Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
- Нажмите на ссылку «URL-адрес сервиса».

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

Настройка экрана согласия OAuth
Бренд — это экран согласия OAuth, содержащий информацию о бренде пользователей. Бренды могут быть доступны только внутренним или публичным пользователям. Внутренний бренд позволяет участнику процесса OAuth, входящему в ту же организацию Google Workspace, что и проект, получить доступ к процессу. Публичный бренд делает процесс OAuth доступным для любого пользователя, имеющего доступ к интернету.
- Создайте бренд
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")
gcloud alpha iap oauth-brands create \
--application_title="Cymbal Eats" \
--support_email=$USER_EMAIL
Пример выходных данных
Created [462858740426]. applicationTitle: Cymbal Eats name: projects/462858740426/brands/462858740426 orgInternalOnly: true
Создание клиента IAP OAuth
- Создайте клиента, используя название бренда из предыдущего шага.
gcloud alpha iap oauth-clients create \
projects/$PROJECT_ID/brands/$PROJECT_NUMBER \
--display_name=cymbal-eats-employee-ui
Пример выходных данных
Created [462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com]. displayName: cymbal-eats-employee-ui name: projects/462858740426/brands/462858740426/identityAwareProxyClients/462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com secret: [secret-removed]
- Сохраните имя клиента, идентификатор и секретный ключ.
export CLIENT_NAME=$(gcloud alpha iap oauth-clients list \
projects/$PROJECT_NUMBER/brands/$PROJECT_NUMBER --format='value(name)' \
--filter="displayName:cymbal-eats-employee-ui")
export CLIENT_ID=${CLIENT_NAME##*/}
export CLIENT_SECRET=$(gcloud alpha iap oauth-clients describe $CLIENT_NAME --format='value(secret)')
- В облачной консоли выберите проект из выпадающего меню выбора проекта.
- Перейдите на экран подтверждения OAuth в консоли Cloud.

- В разделе «Тип пользователя» нажмите «Сделать внешним».
- Выберите «Тестирование» в качестве статуса публикации.

- Нажмите ПОДТВЕРДИТЬ
6. Ограничение доступа с помощью IAP
Ограничьте доступ к серверной части с помощью IAP, а затем убедитесь, что приложение недоступно.
- Включите встроенные покупки (IAP) в бэкэнд-сервисе.
gcloud iap web enable --resource-type=backend-services \
--oauth2-client-id=$CLIENT_ID \
--oauth2-client-secret=$CLIENT_SECRET \
--service=employee-ui-iap-backend
Проверьте конфигурацию IAP.
- Убедитесь, что SSL-сертификат активен.
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
- Получить URL-адрес сервиса
echo https://$DOMAIN
Пример выходных данных
https://34.102.234.98.nip.io
- Чтобы открыть портал для сотрудников, нажмите на URL-адрес сервиса.

- Войдите в систему, используя свои учетные данные лаборатории.

- Закройте браузер
Предоставьте пользователю доступ к порталу для сотрудников.
- Добавьте привязку политики IAM для роли
'roles/iap.httpsResourceAccessor'для пользователя, созданного на предыдущем шаге.
gcloud iap web add-iam-policy-binding \
--resource-type=backend-services \
--service=employee-ui-iap-backend \
--member=user:$USER_EMAIL \
--role='roles/iap.httpsResourceAccessor'
Пример выходных данных
Updated IAM policy for backend service [projects/462858740426/iap_web/compute/services/employee-ui-iap-backend].
доступ к сервису тестирования
Подтвердите, что доступ к порталу для сотрудников предоставлен.
- Получить URL-адрес сервиса
echo https://$DOMAIN
Пример выходных данных
https://34.102.234.98.nip.io
- Чтобы открыть портал для сотрудников, нажмите на URL-адрес сервиса.

Теперь у вас должен быть доступ к порталу для сотрудников.
(Необязательно) Разверните все зависимости; развертывание этих микросервисов может занять около 20 минут.
unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL
cd ~/cymbal-eats
./setup.sh
./get-site-urls.sh
7. Поздравляем!
Поздравляем, вы завершили практическое занятие!
Что дальше:
Ознакомьтесь с другими обучающими материалами Cymbal Eats:
- Запуск облачных рабочих процессов с помощью Eventarc
- Запуск обработки событий из облачного хранилища.
- Подключение к частному серверу CloudSQL из Cloud Run
- Подключение к полностью управляемым базам данных из Cloud Run
- Запуск заданий Cloud Run с помощью Cloud Scheduler
- Безопасное развертывание в облаке
- Обеспечение безопасности входящего трафика облачных сервисов
- Подключение к частной базе данных AlloyDB из GKE Autopilot
Уборка
Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий эти ресурсы, либо сохраните проект и удалите отдельные ресурсы.
Удаление проекта
Самый простой способ избежать выставления счетов — удалить проект, созданный для этого урока.