Controle de acesso baseado em endpoint do produtor do PSC

1. Introdução

Private Service Connect

O Private Service Connect é um recurso da rede do Google Cloud que permite que consumidores acessem serviços gerenciados de maneira particular na rede VPC deles. Da mesma forma, ele permite que produtores de serviços gerenciados hospedem esses serviços em redes VPC separadas e ofereçam uma conexão particular aos consumidores.

50b907b09af4d8ac.png

Controle de acesso do produtor do Private Service Connect

Em vez de aceitar automaticamente todas as conexões de qualquer consumidor, os produtores só podem aceitar solicitações de conexão de entrada se o consumidor estiver na lista de aceitação. É possível especificar consumidores por projeto, rede VPC ou endpoint individual do PSC. Não é possível incluir diferentes tipos de consumidores na mesma lista de aceitação ou rejeição.

Para qualquer preferência de conexão, as conexões aceitas podem ser substituídas e rejeitadas por uma política da organização (compute.restrictPrivateServiceConnectConsumer) que bloqueia as conexões de entrada.

A política da organização (compute.restrictPrivateServiceConnectConsumer) se aplica à organização,pasta ou projeto. Se quiser um controle de acesso refinado ao endpoint do PSC, use a lista de aceitação do consumidor de endpoints individuais do PSC.

Controle de acesso baseado em endpoints

O controle de acesso baseado em endpoints do PSC é a capacidade de um produtor autorizar consumidores por endpoints individuais do PSC nas políticas de anexo de serviço.

Essa abordagem, recomendada para serviços multitenant, oferece o controle mais granular para gerenciar conexões.

Este codelab é focado em aprender a configurar esse recurso.

Esse método não se aplica a back-ends do Private Service Connect.

2. O que você vai aprender

  • Como um produtor publica um serviço usando o PSC.
  • Como um produtor pode criar um controle de acesso baseado em endpoint do PSC.
  • Como um consumidor, como acessar o serviço do PSC.

3. Arquitetura geral do laboratório

3d7cbafaffb50d2d.png

4. Etapas de preparação

Papéis do IAM necessários para trabalhar no laboratório

Comece atribuindo os papéis necessários do IAM à conta do GCP no nível do projeto.

  • Administrador de rede do Compute (roles/compute.networkAdmin): esse papel oferece controle total dos recursos de rede do Compute Engine.
  • Administrador do Logging (roles/logging.admin): esse papel dá acesso a todas as permissões de geração de registros e permissões dependentes.
  • Administrador do Service Usage (roles/serviceusage.serviceUsageAdmin): esse papel permite ativar, desativar e inspecionar estados de serviço, inspecionar operações, consumir cota e gerar faturamento para o projeto de um consumidor.
  • Administrador da instância do Compute (roles/compute.instanceAdmin.v1): esse papel oferece controle total de instâncias, grupos de instâncias, discos, snapshots e imagens do Compute Engine. Acesso de leitura a todos os recursos de rede do Compute Engine.
  • Administrador de segurança do Compute (roles/compute.securityAdmin): esse papel concede permissões para criar, modificar e excluir regras de firewall e certificados SSL, além de configurar as definições de VM protegida.

Ativar APIs

No Cloud Shell, verifique se o projeto está configurado corretamente e defina as variáveis de ambiente.

No Cloud Shell, faça o seguinte:

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

Ative todas as APIs do Google necessárias no projeto. No Cloud Shell, faça o seguinte:

gcloud services enable \
  compute.googleapis.com 
  

Criar VPC do produtor

No projeto, crie uma rede VPC com modo de sub-rede personalizado. Faça o seguinte no Cloud Shell:

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

Criar sub-redes na VPC do produtor

Você vai precisar de três sub-redes: producer-subnet para seu serviço, proxy-only-subnet para o balanceador de carga publicar seu serviço e psc-subnet para o PSC publicar o serviço.

No Cloud Shell, faça o seguinte para criar sub-redes 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

Criar o Cloud NAT e o Cloud Router para a VPC do produtor

O Cloud NAT é usado para permitir que a VM faça o download e instale aplicativos.

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

Criar VPC do consumidor

No projeto, crie uma rede VPC com modo de sub-rede personalizado. Faça o seguinte no Cloud Shell:

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

Criar sub-rede na VPC do consumidor

No Cloud Shell, faça o seguinte para criar uma sub-rede IPv4:

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

Criar uma política de firewall global para a VPC do produtor e do consumidor

Você vai criar uma política de firewall de rede global e associá-la à VPC do produtor e à VPC do consumidor.

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 

Permitir SSH

Para permitir que o Identity-Aware Proxy (IAP) se conecte às instâncias de VM, crie uma regra de firewall que:

  • Aplica-se a todas as instâncias de VM que você quer acessar usando o IAP.
  • Permite o tráfego de entrada do intervalo de IP 35.235.240.0/20. Esse intervalo contém todos os endereços IP que o IAP usa para o encaminhamento de 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

Adicionar regras de firewall de entrada ao serviço

Você vai usar o balanceador de carga de aplicativo interno regional para publicar o serviço.A regra de firewall de entrada y precisa permitir que a sub-rede somente proxy acesse o serviço. Para informações detalhadas, consulte este documento.

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

Permitir a verificação de integridade do balanceador de carga para seu serviço

As sondagens de verificação de integridade do balanceador de carga de aplicativo interno regional usam os intervalos 35.191.0.0/16 e 130.211.0.0/22. Você vai criar uma regra de firewall de entrada para permitir verificações de integridade das sondagens. Para mais detalhes, consulte este documento.

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

Criar uma VM como um cliente HTTP na VPC do consumidor

No Cloud Shell, faça o seguinte para criar uma instância de VM como cliente de teste:

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

Criar uma VM como um servidor HTTP na VPC do produtor

No Cloud Shell, faça o seguinte para criar uma instância de VM como servidor 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. Produtor publica serviço do PSC

Criar um balanceador de carga de aplicativo interno regional

Você vai criar um balanceador de carga de aplicativo interno regional como front-end do serviço, e o back-end será o grupo de instâncias não gerenciadas cujo endpoint é o servidor HTTP que criamos anteriormente.

Reserve o endereço IP do balanceador de carga

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

Criar um grupo de instâncias

Você vai criar um grupo de instâncias não gerenciadas e adicionar a instância de VM, myserver, ao grupo.

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

Criar uma verificação de integridade HTTP

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

Crie o serviço de back-end

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

Adicionar back-end ao serviço de back-end

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

Criar o mapa de URL

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

Criar o proxy de destino

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

Criar a regra de encaminhamento

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

O produtor do PSC publica o serviço

Você vai usar o PSC para publicar o serviço com connection-preference=ACCEPT_MANUAL e listas de consumidores vazias.

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. O consumidor cria o endpoint do PSC

Reservar um IP para o endpoint do PSC

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

Criar endpoint do PSC

Crie o endpoint do PSC e extraia o IP dele para testar na próxima etapa.

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

O consumidor verifica o status do endpoint do PSC

Antes de o produtor adicionar o endpoint do PSC à lista de consumidores, a conexão fica visível no endpoint conectado do lado do consumidor com o status "Pendente".

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

Você vai ver um resultado semelhante ao abaixo.

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. Testar o acesso da VM consumidora à VM produtora

Verifique o IP do endpoint do PSC.

echo $psc_endpoint_ip

Faça SSH na VM chamada myclient e teste se ela pode acessar myserver na porta HTTP 80.

No Cloud Shell, faça o seguinte:

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

Use curl para acessar o endpoint do PSC que você criou.

curl -m 10 <psc_endpoint_ip> 

O comando curl vai expirar. O cliente de teste da VPC consumidora não consegue acessar o servidor HTTP na VPC produtora.

curl: (28) Connection timed out after 10001 milliseconds

Saia da sessão SSH para voltar ao Cloud Shell.

exit

8. O produtor aprova o endpoint do PSC

O produtor verifica o status do endpoint do PSC

Antes de o produtor adicionar o endpoint do PSC à lista de consumidores, a conexão fica visível no anexo de serviço com o status "Pendente".

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

Você vai ver um resultado semelhante ao abaixo.

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

Receber o URI baseado em ID do endpoint do PSC

O URI baseado em ID do endpoint do PSC é o ID da regra de encaminhamento que o consumidor acabou de criar. No exemplo acima, "endpointWithId" é o URI do endpoint do PSC criado pelo consumidor. Você vai precisar desse URI para que o produtor crie o controle de acesso baseado em endpoints.

O ID de conexão do PSC não é o que estamos procurando. )

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

echo $psc_endpoint_uri

Adicionar URI baseado em ID do endpoint do PSC à lista de aceitação do consumidor

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

O produtor verifica o status do endpoint do PSC

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

Você vai ver um resultado semelhante ao abaixo. O status mudou para "ACEITO".

{'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. Testar o acesso da VM consumidora à VM produtora

Verifique o IP do endpoint do PSC.

echo $psc_endpoint_ip

Faça SSH na VM chamada myclient e teste se ela pode acessar myserver na porta HTTP 80.

No Cloud Shell, faça o seguinte:

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

Use curl para acessar o endpoint do PSC que você criou.

curl <psc_endpoint_ip>

O comando curl vai retornar uma resposta de myserver. O cliente de teste da VPC consumidora acessou o servidor HTTP na VPC produtora.

I am a Http Server.

Saia da sessão SSH para voltar ao Cloud Shell.

exit

10. Limpar

Liberar espaço nas VMs

No Cloud Shell, faça o seguinte:

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

Liberar memória dos componentes do cliente do PSC

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

Liberar memória dos componentes do produtor do 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

Liberar espaço de firewall, Cloud NAT, Cloud Router e VPCs

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. Parabéns

Você testou com sucesso o controle de acesso baseado em endpoints do produtor do Private Service Connect.