Aplicativo seguro sem servidor com o Identity-Aware Proxy (IAP)

1. Visão geral

Neste laboratório, você vai implantar o portal do funcionário, que permite que os funcionários vejam, atualizem e excluam pedidos do app Cymbal Eats. Você vai usar o Identity-Aware Proxy (IAP) para proteger o acesso ao portal sem usar uma rede privada virtual (VPN). O IAP simplifica a implementação de um modelo de acesso de confiança zero e leva menos tempo do que uma VPN para trabalhadores remotos em ambientes locais e de nuvem, com um único ponto de controle para gerenciar o acesso aos seus apps.

94b06525c85408ad.png

O que é o Identity-Aware Proxy?

O Identity-Aware Proxy (IAP) é um serviço do Google Cloud que intercepta solicitações enviadas ao aplicativo, autentica o usuário que faz a solicitação usando o serviço de identidade do Google e só permite a transmissão quando elas vêm de um usuário autorizado a acessar o aplicativo. Além disso, ele pode modificar os cabeçalhos da solicitação para incluir informações sobre o usuário autenticado.

O que você vai aprender

  • Como configurar um grupo de endpoints de rede (NEG) sem servidor
  • Como configurar um balanceador de carga
  • Como ativar o IAP para restringir o acesso
  • Como restringir o acesso usando o IAP

2. Configuração e requisitos

Configuração de ambiente personalizada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google É possível atualizar o local a qualquer momento.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto.
  • Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou o projeto inteiro. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Configuração do ambiente

  1. Criar variáveis de ambiente relacionadas a projetos e recursos
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. Ative as APIs de serviço do IAP e do Resource Manager do Cloud
gcloud services enable \
    iap.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudidentity.googleapis.com \
    compute.googleapis.com
  1. Clone o repositório do app de exemplo e navegue até o diretório.
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/employee-ui
  1. Implante o portal do funcionário usando o script de configuração. Aguarde a conclusão do script antes de passar para a próxima etapa.
./setup.sh

Exemplo de saída

...
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. Clique no link "URL do serviço".

86416f68c0b8152a.png

3. Configurar um grupo de endpoints de rede (NEG) sem servidor

Você vai criar um grupo de endpoints de rede sem servidor( NEG sem servidor) para o serviço do Cloud Run da interface do funcionário. Os NEGs sem servidor permitem usar apps sem servidor do Google Cloud com balanceamento de carga HTTP(S) externo.

2abe669e53c27186.png

  1. Crie um grupo de endpoints de rede para o serviço da interface do funcionário.
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

Exemplo de resposta

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].

Criar um serviço de back-end e adicionar o NEG sem servidor

Um serviço de back-end define como o Cloud Load Balancing distribui tráfego. A configuração do serviço de back-end contém um conjunto de valores, como o protocolo usado para se conectar a back-ends, várias configurações de distribuição e sessão, verificações de integridade e tempos limite. Essas configurações fornecem um controle refinado sobre o comportamento do seu balanceador de carga.

  1. Criar um serviço de back-end
gcloud compute backend-services create employee-ui-iap-backend \
        --global 

Exemplo de resposta

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. Adicione o NEG sem servidor como um back-end ao serviço de back-end
gcloud compute backend-services add-backend employee-ui-iap-backend \
    --global \
    --network-endpoint-group=employee-ui-iap-neg \
    --network-endpoint-group-region=$REGION

Exemplo de resposta

Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
  1. Crie um mapa de URL para encaminhar solicitações recebidas para o serviço de back-end
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. Como configurar os componentes do balanceador de carga

O diagrama a seguir mostra que o balanceador de carga usa um back-end de NEG sem servidor para direcionar solicitações a um serviço do Cloud Run sem servidor.

335f4674737a6514.png

Reservar um endereço IP estático

  1. Reservar um endereço IPv4 estático e armazenar o domínio
gcloud compute addresses create employee-ui-iap-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

Exemplo de resposta

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/addresses/employee-ui-iap-ip].
  1. Armazenar o domínio nip.io
export DOMAIN=$(gcloud compute addresses list --filter employee-ui-iap-ip --format='value(ADDRESS)').nip.io

Criar um recurso de certificado SSL gerenciado pelo Google

  1. Criar um recurso de certificado SSL gerenciado pelo Google
gcloud compute ssl-certificates create employee-ui-iap-cert \
    --description=employee-ui-iap-cert \
    --domains=$DOMAIN \
    --global

Exemplo de resposta

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

Crie um proxy HTTPS de destino

  1. Crie o proxy HTTPS de destino para encaminhar solicitações ao mapa de URLs.
gcloud compute target-https-proxies create employee-ui-iap-http-proxy \
    --ssl-certificates employee-ui-iap-cert \
    --url-map employee-ui-iap-url-map

Exemplo de resposta

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:

Configurar regras de encaminhamento

  1. Crie uma regra de encaminhamento para rotear as solicitações recebidas para o proxy.
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

Exemplo de saída

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/forwardingRules/employee-ui-iap-forwarding-rule].

Como restringir a entrada no serviço do Cloud Run

Restrinja o tráfego de entrada para aceitar apenas solicitações internas e solicitações recebidas por meio do balanceamento de carga HTTP(S).

26cb0b2a9162e7ab.png

  1. Atualize o serviço para permitir apenas o tráfego de entrada de solicitações internas e solicitações pelo balanceador de carga HTTP(S).
gcloud run services update employee-ui-service \
    --ingress internal-and-cloud-load-balancing \
    --region $REGION

Exemplo de saída

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. Clique no link "URL do serviço".

8505fde7e0784bf1.png

O acesso ao URL do serviço do Cloud Run agora aparece como proibido.

5. Como ativar o Cloud Identity-Aware Proxy (IAP) no balanceador de carga

Ele também permite que você estabeleça uma camada de autorização central para aplicativos acessados por HTTPS. É possível usar um modelo de controle de acesso no nível do aplicativo em vez de firewalls no nível da rede.

d9740402a74370a8.png

Uma marca é a tela de permissão OAuth que contém informações de branding para os usuários. As marcas podem ser restritas a usuários internos ou públicos. Uma marca interna permite que o fluxo OAuth seja acessado por um membro da mesma organização do Google Workspace que o projeto. Uma marca pública torna o fluxo OAuth acessível para qualquer pessoa com acesso à Internet.

  1. Criar uma marca
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

Exemplo de resposta

Created [462858740426].
applicationTitle: Cymbal Eats
name: projects/462858740426/brands/462858740426
orgInternalOnly: true

Como criar um cliente OAuth do IAP

  1. Crie um cliente usando o nome da marca da etapa anterior.
gcloud alpha iap oauth-clients create \
    projects/$PROJECT_ID/brands/$PROJECT_NUMBER \
    --display_name=cymbal-eats-employee-ui

Exemplo de resposta

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. Armazenar o nome, o ID e a chave secreta do cliente
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. No Console do Cloud, selecione o projeto no menu suspenso de seleção de projetos.
  2. Navegue até a tela de permissão OAuth no console do Cloud.

bcb460f3ab5241f4.png

  1. Clique em "TORNAR EXTERNO" em "Tipo de usuário".
  2. Selecione "Teste" como o status de publicação.

27fd7de6e7b7ef21.png

  1. Clique em CONFIRMAR.

6. Como restringir o acesso com o IAP

Restrinja o acesso ao serviço de back-end usando o IAP e verifique se o aplicativo está inacessível.

  1. Ativar o IAP no serviço de back-end
gcloud iap web enable --resource-type=backend-services \
    --oauth2-client-id=$CLIENT_ID \
    --oauth2-client-secret=$CLIENT_SECRET \
    --service=employee-ui-iap-backend

Verificar a configuração do IAP

  1. Verificar se o certificado SSL está ATIVO
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
  1. Receber URL do serviço
echo https://$DOMAIN

Exemplo de saída

https://34.102.234.98.nip.io
  1. Clique no URL do serviço para abrir o portal do funcionário.

352b600209c3fb33.png

  1. Faça login usando suas credenciais do laboratório.

f7e0318388aa0739.png

  1. Feche o navegador.

Conceder acesso de usuário ao portal do funcionário

  1. Adicione uma vinculação de política do IAM para o papel de 'roles/iap.httpsResourceAccessor' para o usuário criado na etapa anterior.
gcloud iap web add-iam-policy-binding \
    --resource-type=backend-services \
    --service=employee-ui-iap-backend \
    --member=user:$USER_EMAIL \
    --role='roles/iap.httpsResourceAccessor'

Exemplo de saída

Updated IAM policy for backend service [projects/462858740426/iap_web/compute/services/employee-ui-iap-backend].

Testar o acesso ao serviço

Confirmar se o acesso ao portal do funcionário foi concedido

  1. Receber URL do serviço
echo https://$DOMAIN

Exemplo de saída

https://34.102.234.98.nip.io
  1. Clique no URL do serviço para abrir o portal do funcionário.

86416f68c0b8152a.png

Agora você tem acesso ao portal do funcionário.

(Opcional) Implante todas as dependências. A implantação desses microsserviços pode levar cerca de 20 minutos.

unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL

cd ~/cymbal-eats

./setup.sh
./get-site-urls.sh

7. Parabéns!

Parabéns, você concluiu o codelab.

Qual é a próxima etapa?

Confira outros codelabs do Cymbal Eats:

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto ou mantenha o projeto e exclua cada um dos recursos.

Excluir o projeto

O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para este tutorial.