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

1. Visão geral

Neste laboratório, você vai implantar um portal para os funcionários acessarem, atualizarem e excluirem 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 que uma VPN para funcionários remotos, tanto no local quanto em ambientes de nuvem, com um único ponto de controle para gerenciar o acesso aos 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 autor delas por meio do serviço de identidade do Google e só permite a transmissão se elas vierem 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 Você pode atualizar 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. normalmente você não se importa com o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, que normalmente é identificado como PROJECT_ID. Se você não gostar do ID gerado, pode gerar outro ID aleatório. Como alternativa, você pode tentar o seu próprio e ver se ele está disponível. Ela não pode ser alterada após essa etapa e permanecerá durante a duração do projeto.
  • Para sua informação, há um terceiro valor, um Número de 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 não gerar faturamento além deste tutorial, exclua os recursos criados ou exclua 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 ao projeto e aos 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 IAP e Cloud Resource Manager
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. Implantar o portal dos funcionários usando o script de configuração. Aguarde a conclusão do script antes de prosseguir 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. Como 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 do Google Cloud sem servidor com balanceamento de carga HTTP(S) externo.

2abe669e53c27186.png

  1. Criar um grupo de endpoints de rede para o serviço de 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 saída

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 saída

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. Adicionar o NEG sem servidor como 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 saída

Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
  1. Criar um mapa de URLs para encaminhar as solicitações recebidas ao 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 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 saída

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 saída

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

Criar um proxy HTTPS de destino

  1. Criar 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 saída

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. Criar uma regra de encaminhamento para encaminhar 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 ao serviço do Cloud Run

Restrinja o tráfego de entrada para aceitar apenas solicitações internas e solicitações provenientes 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

O IAP permite estabelecer 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 marca para os usuários. As marcas podem ser restritas a usuários internos ou públicos. Uma marca interna permite que o fluxo do 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 a 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 saída

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 saída

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. Armazene 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
  2. Acesse a tela de permissão OAuth no console do Cloud.

bcb460f3ab5241f4.png

  1. Clique em CRIAR EXTERNO em "Tipo de usuário".
  2. Selecione "Teste" como o status "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. Verifique se o certificado SSL está ATIVO
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
  1. Acessar 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 com suas credenciais do laboratório.

f7e0318388aa0739.png

  1. Feche o navegador.

Permitir que o usuário acesse o portal do funcionário

  1. Adicione uma vinculação de política do IAM para o papel de 'roles/iap.httpsResourceAccessor' do 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].

Como testar o acesso ao serviço

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

  1. Acessar 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ê deve ter acesso ao portal do funcionário.

(Opcional) Implante todas as dependências. A implantação dos 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.

O que vem em seguida:

Conheça outros codelabs da 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.