Безопасное бессерверное приложение с прокси-сервером с функцией идентификации (IAP)

1. Обзор

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

94b06525c85408ad.png

Что такое прокси-сервер с идентификацией личности?

Identity-Aware Proxy (IAP) — это облачная служба Google, которая перехватывает запросы, отправленные в ваше приложение, аутентифицирует пользователя, делающего запрос, с помощью службы Google Identity Service, и пропускает запросы только в том случае, если они исходят от пользователя, авторизованного для доступа к приложению. Кроме того, он может изменить заголовки запросов, включив в них информацию об аутентифицированном пользователе.

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

  • Как настроить группу конечных точек бессерверной сети (NEG)
  • Как настроить балансировщик нагрузки
  • Как включить IAP для ограничения доступа
  • Как ограничить доступ с помощью IAP

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 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
  1. Включите API службы IAP и диспетчера облачных ресурсов.
gcloud services enable \
    iap.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudidentity.googleapis.com \
    compute.googleapis.com
  1. Клонируйте репозиторий примера приложения и перейдите в каталог.
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/employee-ui
  1. Разверните портал сотрудников с помощью сценария установки. Дождитесь завершения сценария, прежде чем переходить к следующему шагу.
./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
  1. Нажмите ссылку URL-адрес службы.

86416f68c0b8152a.png

3. Настройка группы конечных точек бессерверной сети (NEG)

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

2abe669e53c27186.png

  1. Создайте группу конечных точек сети для службы пользовательского интерфейса сотрудника.
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 распределяет трафик. Конфигурация серверной службы содержит набор значений, таких как протокол, используемый для подключения к серверной части, различные параметры распространения и сеанса, проверки работоспособности и тайм-ауты. Эти настройки обеспечивают детальный контроль над поведением вашего балансировщика нагрузки.

  1. Создайте серверную службу
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
  1. Добавьте бессерверный 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].
  1. Создайте карту 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.

335f4674737a6514.png

Зарезервируйте статический IP-адрес

  1. Зарезервируйте статический адрес 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].
  1. Сохраните домен nip.io
export DOMAIN=$(gcloud compute addresses list --filter employee-ui-iap-ip --format='value(ADDRESS)').nip.io

Создайте ресурс сертификата SSL, управляемый Google.

  1. Создайте ресурс сертификата 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-прокси

  1. Создайте целевой 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:

Настройка правил переадресации

  1. Создайте правило переадресации для маршрутизации входящих запросов на прокси.
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).

26cb0b2a9162e7ab.png

  1. Обновите службу, чтобы разрешить входящий трафик только из внутренних запросов и запросов через балансировщик нагрузки 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
  1. Нажмите ссылку URL-адрес службы.

8505fde7e0784bf1.png

Доступ к URL-адресу службы Cloud Run теперь отображается как запрещенный.

5. Включение прокси-сервера Cloud Identity-Aware (IAP) на балансировщике нагрузки.

IAP позволяет вам установить центральный уровень авторизации для приложений, доступ к которым осуществляется через HTTPS. Вместо брандмауэров сетевого уровня можно использовать модель управления доступом на уровне приложений.

d9740402a74370a8.png

Бренд – это экран согласия OAuth, содержащий информацию о бренде для пользователей. Бренды могут быть доступны только внутренним или общедоступным пользователям. Внутренний бренд позволяет получить доступ к потоку OAuth члену той же организации Google Workspace, что и проект. Публичный бренд делает поток OAuth доступным для всех, у кого есть доступ к Интернету.

  1. Создать бренд
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

  1. Создайте клиента, используя название бренда из предыдущего шага.
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]
  1. Сохраните имя клиента, идентификатор и секрет
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)')
  1. В Cloud Console выберите проект из раскрывающегося меню выбора проекта.
  2. Перейдите к экрану согласия OAuth в Cloud Console.

bcb460f3ab5241f4.png

  1. Нажмите «СДЕЛАТЬ ВНЕШНИЙ» в разделе «Тип пользователя».
  2. Выберите «Тестирование» в качестве статуса публикации.

27fd7de6e7b7ef21.png

  1. Нажмите ПОДТВЕРДИТЬ

6. Ограничение доступа с помощью IAP

Ограничьте доступ к серверной службе с помощью IAP, а затем убедитесь, что приложение недоступно.

  1. Включите 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

  1. Убедитесь, что SSL-сертификат АКТИВЕН.
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
  1. Получить URL-адрес службы
echo https://$DOMAIN

Пример вывода

https://34.102.234.98.nip.io
  1. Нажмите на URL-адрес службы, чтобы открыть портал сотрудников.

352b600209c3fb33.png

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

f7e0318388aa0739.png

  1. Закройте браузер

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

  1. Добавьте привязку политики 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].

Доступ к сервису тестирования

Подтвердите, что доступ к порталу сотрудников предоставлен.

  1. Получить URL-адрес службы
echo https://$DOMAIN

Пример вывода

https://34.102.234.98.nip.io
  1. Нажмите на URL-адрес службы, чтобы открыть портал сотрудников.

86416f68c0b8152a.png

Теперь у вас должен быть доступ к порталу сотрудников.

(Необязательно) Разверните все зависимости. Развертывание этих микросервисов может занять около 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:

Очистить

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

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

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