PSC Producer Endpoint-Based Access Control

1. Введение

Private Service Connect

Private Service Connect — это функция сетевых возможностей Google Cloud, которая позволяет пользователям получать доступ к управляемым сервисам в частном порядке из своей сети VPC. Аналогичным образом, она позволяет производителям управляемых сервисов размещать эти сервисы в своих отдельных сетях VPC и предлагать своим пользователям частное соединение.

50b907b09af4d8ac.png

Private service Connect Producer Access Control

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

При любом из предпочтительных способов подключения принятые соединения могут быть переопределены и отклонены политикой организации (compute.restrictPrivateServiceConnectConsumer), которая блокирует входящие соединения.

Обратите внимание, что политика организации (compute.restrictPrivateServiceConnectConsumer) применяется к организации, папке или проекту. Если вам нужен более детальный контроль доступа к конечной точке PSC, вы можете использовать список разрешенных потребителей для отдельных конечных точек PSC.

Контроль доступа на основе конечных точек

Управление доступом на основе конечных точек PSC — это возможность для производителя авторизовать потребителей через отдельные конечные точки PSC в политиках подключения услуг.

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

Данный практический урок посвящен изучению того, как настроить эту функцию.

Обратите внимание, что этот метод не применим к бэкэндам Private Service Connect.

2. Чему вы научитесь

  • Как продюсеру опубликовать сервис с помощью PSC.
  • Как продюсеру создать систему контроля доступа на основе конечных точек PSC?
  • Как потребителю получить доступ к услуге PSC?

3. Общая архитектура лаборатории

3d7cbafaffb50d2d.png

4. Этапы подготовки

Для работы в лаборатории требуются роли IAM.

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

  • Администратор вычислительной сети ( roles/compute.networkAdmin ) Эта роль предоставляет вам полный контроль над сетевыми ресурсами Compute Engine.
  • Администратор ведения журналов ( roles/logging.admin ) Эта роль предоставляет вам доступ ко всем разрешениям на ведение журналов, а также к зависимым разрешениям.
  • Администратор использования сервиса ( roles/serviceusage.serviceUsageAdmin ) Эта роль позволяет включать, отключать и проверять состояния сервиса, контролировать операции, а также управлять квотой и выставлением счетов для потребительского проекта.
  • Администратор вычислительных экземпляров ( roles/compute.instanceAdmin.v1 ) Эта роль предоставляет вам полный контроль над экземплярами Compute Engine, группами экземпляров, дисками, моментальными снимками и образами. Доступ на чтение ко всем сетевым ресурсам Compute Engine.
  • Администратор безопасности вычислительных ресурсов ( roles/compute.securityAdmin ) Эта роль предоставляет вам права на создание, изменение и удаление правил брандмауэра и SSL-сертификатов, а также на настройку параметров защищенных виртуальных машин.

Включить API

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

Внутри Cloud Shell выполните следующие действия:

gcloud auth login
gcloud config set project <your project id>
export project_id=$(gcloud config get-value project)
export region=us-central1
export zone=$region-a
echo $project_id
echo $region
echo $zone

Включите все необходимые API Google в проекте. В Cloud Shell выполните следующие действия:

gcloud services enable \
  compute.googleapis.com 
  

Создать VPC для продюсера

В проекте создайте сеть VPC с пользовательским режимом подсети. Выполните следующие действия в Cloud Shell:

gcloud compute networks create producer-net \
    --subnet-mode=custom

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

Вам потребуется три подсети: подсеть производителя (producer-subnet) для вашей службы; подсеть только для прокси (proxy-only-subnet) для балансировщика нагрузки, который будет публиковать вашу службу; подсеть PSC (psc-subnet) для PSC, который будет публиковать службу.

Внутри Cloud Shell выполните следующие действия для создания подсетей IPv4:

gcloud compute networks subnets create producer-subnet \
    --network=producer-net \
    --range=10.10.0.0/24 \
    --region=$region
gcloud compute networks subnets create proxy-only-subnet \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE \
    --region=$region \
    --network=producer-net \
    --range=10.30.0.0/24
gcloud compute networks subnets create psc-subnet \
    --network=producer-net \
    --region=$region \
    --range=192.168.0.0/16 \
    --purpose=PRIVATE_SERVICE_CONNECT

Создание Cloud NAT и Cloud Router для VPC производителя

Облачный NAT используется для того, чтобы виртуальные машины могли загружать и устанавливать приложения.

gcloud compute routers create $region-cr \
   --network=producer-net \
   --region=$region
gcloud compute routers nats create $region-nat \
    --router=$region-cr \
    --region=$region \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips

Создание потребительской VPC

В проекте создайте сеть VPC с пользовательским режимом подсети. Выполните следующие действия в Cloud Shell:

gcloud compute networks create consumer-net \
    --subnet-mode=custom

Создайте подсеть в потребительской VPC.

Внутри Cloud Shell выполните следующие действия для создания подсети IPv4:

gcloud compute networks subnets create consumer-subnet \
    --network=consumer-net \
    --range=10.20.0.0/24 \
    --region=$region

Создайте глобальную политику межсетевого экрана для VPC производителя и VPC потребителя.

Вам потребуется создать глобальную политику сетевого брандмауэра и связать ее с VPC производителя и VPC потребителя.

gcloud compute network-firewall-policies create global-fw-policy \
--global
gcloud compute network-firewall-policies associations create \
    --firewall-policy=global-fw-policy \
    --name=producer-fw-policy \
    --network=producer-net \
    --global-firewall-policy 
gcloud compute network-firewall-policies associations create \
    --firewall-policy=global-fw-policy \
    --name=consumer-fw-policy \
    --network=consumer-net \
    --global-firewall-policy 

Разрешить SSH

Чтобы разрешить Identity-Aware Proxy (IAP) подключаться к вашим экземплярам виртуальных машин, создайте правило брандмауэра, которое:

  • Применяется ко всем экземплярам виртуальных машин, к которым вы хотите обеспечить доступ с помощью IAP.
  • Разрешает входящий трафик из диапазона IP-адресов 35.235.240.0/20. Этот диапазон содержит все IP-адреса, которые IAP использует для пересылки TCP-трафика.
gcloud compute network-firewall-policies rules create 100 \
    --action=ALLOW \
    --firewall-policy=global-fw-policy \
    --description="producer-allow-iap" \
    --direction=INGRESS \
    --src-ip-ranges=35.235.240.0/20 \
    --layer4-configs=tcp:22  \
    --global-firewall-policy

Добавьте правила межсетевого экрана для входящего трафика в вашу службу.

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

gcloud compute network-firewall-policies rules create 200 \
    --action=ALLOW \
    --firewall-policy=global-fw-policy \
    --description="producer-allow-access-service" \
    --direction=INGRESS \
    --src-ip-ranges=10.30.0.0/24 \
    --layer4-configs=tcp:80  \
    --global-firewall-policy

Разрешите проверку работоспособности балансировщика нагрузки для вашей службы.

Для проверки работоспособности регионального внутреннего балансировщика нагрузки используются диапазоны IP-адресов 35.191.0.0/16 и 130.211.0.0/22. Вам потребуется создать правило входящего трафика брандмауэра, разрешающее проверку работоспособности с помощью этих зондов. Для получения более подробной информации ознакомьтесь с этим документом .

gcloud compute network-firewall-policies rules create 300 \
    --action=ALLOW \
    --firewall-policy=global-fw-policy \
    --description="producer-allow-health-check" \
    --direction=INGRESS \
    --src-ip-ranges=35.191.0.0/16,130.211.0.0/22\
    --layer4-configs=tcp:80  \
    --global-firewall-policy

Создайте виртуальную машину в качестве HTTP-клиента в потребительской VPC.

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

gcloud compute instances create myclient \
    --zone=$zone \
    --subnet=consumer-subnet \
    --shielded-secure-boot \
    --no-address

Создайте виртуальную машину в качестве HTTP-сервера в VPC производителя.

Внутри Cloud Shell выполните следующие действия, чтобы создать экземпляр виртуальной машины в качестве HTTP-сервера:

gcloud compute instances create myserver \
    --subnet=producer-subnet \
    --zone=$zone \
    --no-address \
    --shielded-secure-boot \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    a2enmod ssl
    sudo a2ensite default-ssl
    echo "I am a Http Server." | \
    tee /var/www/html/index.html
    systemctl restart apache2'

5. Производитель публикует услугу PSC.

Создать региональный внутренний балансировщик нагрузки приложений

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

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

gcloud compute addresses create l7-ilb-ip-address \
    --region=$region \
    --subnet=producer-subnet

Создайте группу экземпляров.

Вам нужно будет создать группу неуправляемых экземпляров и добавить в неё экземпляр виртуальной машины myserver.

gcloud compute instance-groups unmanaged create my-service-ig \
    --zone=$zone
gcloud compute instance-groups unmanaged add-instances my-service-ig \
    --zone=$zone \
    --instances=myserver

Создайте проверку работоспособности HTTP.

gcloud compute health-checks create http l7-ilb-basic-check \
     --region=$region \
     --use-serving-port

Создайте серверную службу.

gcloud compute backend-services create l7-ilb-backend-service \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --protocol=HTTP \
    --health-checks=l7-ilb-basic-check \
    --health-checks-region=$region \
    --region=$region

Добавить бэкэнд в бэкэнд-сервис

gcloud compute backend-services add-backend l7-ilb-backend-service \
    --balancing-mode=UTILIZATION \
    --instance-group=my-service-ig \
    --instance-group-zone=$zone \
    --region=$region

Создайте карту URL-адресов

gcloud compute url-maps create l7-ilb-map \
    --default-service=l7-ilb-backend-service \
    --region=$region

Создайте целевой прокси-сервер.

gcloud compute target-http-proxies create l7-ilb-proxy \
    --url-map=l7-ilb-map \
    --url-map-region=$region \
    --region=$region

Создайте правило пересылки.

gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --network=producer-net \
    --subnet=producer-subnet \
    --address=l7-ilb-ip-address \
    --ports=80 \
    --region=$region \
    --target-http-proxy=l7-ilb-proxy \
    --target-http-proxy-region=$region

Производитель PSC публикует сервис

Для публикации сервиса с параметром connection-preference=ACCEPT_MANUAL и пустыми списками потребителей вам потребуется использовать PSC.

gcloud compute service-attachments create my-psc-service \
    --region=$region \
 --target-service=projects/$project_id/regions/$region/forwardingRules/l7-ilb-forwarding-rule \
    --connection-preference=ACCEPT_MANUAL \
    --nat-subnets=psc-subnet
export myserver_service_attachment=$(gcloud compute service-attachments describe my-psc-service --region=$region --format="value(selfLink.scope(v1))")

echo $myserver_service_attachment

6. Потребитель создает конечную точку PSC.

Зарезервировать IP-адрес для конечной точки PSC

gcloud compute addresses create myserver-psc-endpoint-ip \
    --region=$region \
    --subnet=consumer-subnet \
    --ip-version=IPV4

Создать конечную точку PSC

Создайте конечную точку PSC и получите IP-адрес этой конечной точки PSC для тестирования на следующем шаге.

gcloud compute forwarding-rules create myserver-psc-endpoint \
    --region=$region \
    --network=consumer-net \
    --address=myserver-psc-endpoint-ip \
    --target-service-attachment=$myserver_service_attachment
psc_endpoint_ip=$(gcloud compute forwarding-rules describe myserver-psc-endpoint \
    --region=$region --format="value(IPAddress)")

echo $psc_endpoint_ip

Потребитель проверяет состояние конечной точки PSC.

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

gcloud compute forwarding-rules describe myserver-psc-endpoint \
    --region=$region

Вы увидите результат, аналогичный приведенному ниже.

IPAddress: 10.20.0.3
allowPscGlobalAccess: false
creationTimestamp: '2026-02-23T16:27:27.920-08:00'
fingerprint: yh_UiYqjHCc=
id: '934193159895862912'
kind: compute#forwardingRule
labelFingerprint: 42WmSpB8rSM=
name: myserver-psc-endpoint
network: https://www.googleapis.com/compute/v1/projects/<project_id>/global/networks/consumer-net
networkTier: PREMIUM
pscConnectionId: '160443618817212419'
pscConnectionStatus: PENDING
region: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1
selfLink: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint
selfLinkWithId: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/forwardingRules/934193159895862912
serviceDirectoryRegistrations:
- namespace: goog-psc-default
target: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/serviceAttachments/my-psc-service

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

Проверьте IP-адрес конечной точки PSC.

echo $psc_endpoint_ip

Подключитесь по SSH к виртуальной машине с именем myclient и проверьте, может ли она получить доступ к myserver по HTTP-порту 80.

Внутри Cloud Shell выполните следующие действия:

gcloud compute ssh \
    --zone=$zone "myclient" \
    --tunnel-through-iap 

Используйте curl для доступа к созданной вами конечной точке PSC.

curl -m 10 <psc_endpoint_ip> 

Вы увидите сообщение о том, что команда curl завершилась по таймауту. Тестовый клиент из потребительской VPC не может получить доступ к HTTP-серверу в производительской VPC.

curl: (28) Connection timed out after 10001 milliseconds

Чтобы вернуться в Cloud Shell, завершите сеанс SSH.

exit

8. Производитель утверждает конечную точку PSC.

Производитель проверяет состояние конечной точки PSC.

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

gcloud compute service-attachments describe my-psc-service --region=$region 

Вы увидите результат, аналогичный приведенному ниже.

connectedEndpoints:
- consumerNetwork: https://www.googleapis.com/compute/projects/<project_id>/global/networks/consumer-net
  endpoint: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint
  endpointWithId: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/934193159895862912
  pscConnectionId: '160443618817212419'
  status: PENDING
connectionPreference: ACCEPT_MANUAL
creationTimestamp: '2026-02-23T13:27:33.886-08:00'
description: ''
enableProxyProtocol: false
fingerprint: -9EI8FCALrA=
id: '2578692595155826858'
kind: compute#serviceAttachment
name: my-psc-service
natSubnets:
- https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/subnetworks/psc-subnet
pscServiceAttachmentId:
  high: '149466704441770984'
  low: '2578692595155826858'
reconcileConnections: false
region: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1
selfLink: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/serviceAttachments/my-psc-service
targetService: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/l7-ilb-forwarding-rule

Получите URI конечной точки PSC на основе идентификатора.

URI конечной точки PSC, основанный на идентификаторе, — это идентификатор правила переадресации, созданного потребителем. В приведенном выше примере 'endpointWithId' — это URI конечной точки PSC, созданной потребителем. Этот URI понадобится производителю для создания контроля доступа на основе конечной точки.

(Обратите внимание, что идентификатор подключения PSC — это не тот идентификатор, который нам нужен.)

export psc_endpoint_uri=$(gcloud compute service-attachments describe my-psc-service --region=$region --format="value(connectedEndpoints.endpointWithId)")

echo $psc_endpoint_uri

Добавьте URI конечной точки PSC на основе идентификатора в список разрешенных устройств потребителя.

gcloud compute service-attachments update my-psc-service \
    --region=$region \
    --consumer-accept-list=$psc_endpoint_uri

Производитель проверяет состояние конечной точки PSC.

gcloud compute service-attachments describe my-psc-service --region=$region --format="value(connectedEndpoints)"

Вы увидите результат, аналогичный приведенному ниже. Статус изменился на «ПРИНЯТО».

{'consumerNetwork': 'https://www.googleapis.com/compute/projects/<project_id>/global/networks/consumer-net', 'endpoint': 'https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint', 'endpointWithId': 'https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/47564871796017232', 'pscConnectionId': '54547416268144643', 'status': 'ACCEPTED'}

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

Проверьте IP-адрес конечной точки PSC.

echo $psc_endpoint_ip

Подключитесь по SSH к виртуальной машине с именем myclient и проверьте, может ли она получить доступ к myserver по HTTP-порту 80.

Внутри Cloud Shell выполните следующие действия:

gcloud compute ssh \
    --zone=$zone "myclient" \
    --tunnel-through-iap 

Используйте curl для доступа к созданной вами конечной точке PSC.

curl <psc_endpoint_ip>

Вы увидите, что команда curl успешно возвращает ответ от myserver . Тестовый клиент из потребительской VPC получил доступ к HTTP-серверу в производительской VPC.

I am a Http Server.

Чтобы вернуться в Cloud Shell, завершите сеанс SSH.

exit

10. Уборка

Очистите виртуальные машины.

Внутри Cloud Shell выполните следующие действия:

gcloud compute instances delete myserver --zone $zone --quiet
gcloud compute instances delete myclient --zone $zone --quiet

Очистка потребительских компонентов PSC

gcloud compute forwarding-rules delete myserver-psc-endpoint \
    --region=$region --quiet
gcloud compute addresses delete myserver-psc-endpoint-ip \
    --region=$region --quiet

Очистка компонентов производителя PSC

gcloud compute service-attachments delete my-psc-service \
    --region=$region --quiet
gcloud compute forwarding-rules delete l7-ilb-forwarding-rule \
    --region=$region --quiet
gcloud compute target-http-proxies delete l7-ilb-proxy \
    --region=$region --quiet
gcloud compute url-maps delete l7-ilb-map \
    --region=$region --quiet
gcloud compute backend-services remove-backend l7-ilb-backend-service \
    --instance-group=my-service-ig \
    --instance-group-zone=$zone \
    --region=$region --quiet
gcloud compute backend-services delete l7-ilb-backend-service \
    --region=$region --quiet
gcloud compute health-checks delete l7-ilb-basic-check \
     --region=$region --quiet
gcloud compute instance-groups unmanaged delete my-service-ig \
    --zone=$zone --quiet
gcloud compute addresses delete l7-ilb-ip-address \
    --region=$region --quiet

Очистка межсетевого экрана, облачного NAT, облачного маршрутизатора и VPC.

gcloud compute network-firewall-policies rules delete 100 \
    --firewall-policy=global-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies rules delete 200 \
    --firewall-policy=global-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies rules delete 300 \
    --firewall-policy=global-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies associations delete \
    --firewall-policy=global-fw-policy \
    --name=producer-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies associations delete \
    --firewall-policy=global-fw-policy \
    --name=consumer-fw-policy \
    --global-firewall-policy --quiet
gcloud compute network-firewall-policies delete global-fw-policy \
    --global --quiet
gcloud compute routers nats delete $region-nat \
    --router=$region-cr \
    --region=$region --quiet
gcloud compute routers delete $region-cr \
    --region=$region --quiet
gcloud compute networks subnets delete producer-subnet \
    --region=$region --quiet
gcloud compute networks subnets delete proxy-only-subnet \
    --region=$region --quiet
gcloud compute networks subnets delete psc-subnet \
    --region=$region --quiet
gcloud compute networks delete producer-net --quiet
gcloud compute networks subnets delete consumer-subnet \
    --region=$region --quiet
gcloud compute networks delete consumer-net --quiet

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

Вы успешно протестировали управление доступом на основе конечных точек производителя в рамках Private Service Connect.