Neste guia, explicamos como integrar o Identity-Aware Proxy (IAP) ao Anthos Service Mesh. A integração do IAP ao Anthos Service Mesh permite acessar serviços de maneira segura com base nos princípios do BeyondCorp do Google. O IAP verifica a identidade do usuário e o contexto da solicitação para determinar se o usuário pode acessar um aplicativo ou recurso. A integração do IAP com o Anthos Service Mesh oferece as seguintes vantagens:
Controle total de acesso baseado no contexto das cargas de trabalho em execução no Anthos Service Mesh. É possível definir políticas de acesso detalhadas com base nos atributos da solicitação de origem, como identidade do usuário, endereço IP e tipo de dispositivo. É possível combinar políticas de acesso com restrições baseadas no nome do host e no caminho de um URL de solicitação.
Ativação do suporte para declarações contextuais na autorização do Anthos Service Mesh.
Acesso escalonável, seguro e altamente disponível ao aplicativo por meio de um balanceador de carga do Google Cloud. O balanceamento de carga de alto desempenho fornece proteção integrada contra ataques distribuídos de negação de serviço (DDoS, na sigla em inglês) e suporte para endereços IP anycast globais.
Pré-requisitos
Confira o que é necessário para seguir este guia:
Como configurar um cluster com o Anthos Service Mesh
A integração do IAP requer configurações específicas no projeto, no cluster e nos arquivos de configuração usados ao instalar o Anthos Service Mesh.
Novas instalações
As etapas nesta seção complementam as etapas no guia Instalação avançada no GKE. Nas etapas a seguir, você usará as variáveis de ambiente criadas no guia de instalação.
Ao configurar seu projeto, ative o
iap.googleapis.com
além das outras APIs necessárias.gcloud services enable \ --project=PROJECT_ID \ iap.googleapis.com
Ao atualizar o cluster, ative o complemento
HttpLoadBalancing
além das outras atualizações de cluster necessárias. O complementoHttpLoadBalancing
ativa um controlador de balanceamento de carga HTTP (L7) no cluster.gcloud container clusters update ${CLUSTER_NAME} \ --project=PROJECT_ID \ --update-addons=HttpLoadBalancing=ENABLED
Se você não definiu uma zona ou região padrão, é necessário fornecer a região (--region=${CLUSTER_LOCATION}) ou a zona (--zone=${CLUSTER_LOCATION}) no comando anterior. para criar um anexo da VLAN de monitoramento.
Depois de atualizar o cluster, continue seguindo o guia de instalação para definir credenciais e permissões e fazer o download do arquivo de instalação. Parar em Como preparar arquivos de configuração de recursos e execute as etapas a seguir.
Crie um novo diretório para os arquivos de configuração do recurso do pacote Anthos Service Mesh. Recomendamos que você use o nome do cluster como o nome do diretório.
Altere para o diretório em que você quer fazer o download do pacote do Anthos Service Mesh.
Faça o download do pacote
asm-iap
: Esse pacote define o campotype
no serviçoistio-ingressgateway
comoNodePort
. Nessa configuração, oistio-ingressgateway
abre uma porta específica na malha de serviço. Isso permite que você configure um balanceador de carga, que encaminha o tráfego enviado ao seu nome de domínio para essa porta.kpt pkg get https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/asm-iap@release-1.6-asm asm
Defina o ID do projeto em que o cluster foi criado:
kpt cfg set asm gcloud.core.project PROJECT_ID
Defina o número do projeto host da frota:
kpt cfg set asm gcloud.project.environProjectNumber ${FLEET_PROJECT_NUMBER}
Defina o nome do cluster:
kpt cfg set asm gcloud.container.cluster ${CLUSTER_NAME}
Defina a zona ou a região padrão:
kpt cfg set asm gcloud.compute.location ${CLUSTER_LOCATION}
Defina o webhook de validação para usar um rótulo de revisão:
kpt cfg set asm anthos.servicemesh.rev asm-1614-2
Define o perfil de configuração. Para a integração do IAP, defina o perfil
asm-gcp
:kpt cfg set asm anthos.servicemesh.profile asm-gcp
Defina as portas HTTP e de status do balanceador de carga. A porta de status padrão é 31223 e a porta HTTP padrão é 31224. Se essas portas já estiverem em uso, defina as portas:
kpt cfg set asm gcloud.container.cluster.ingress.httpPort HTTP_PORT
kpt cfg set asm gcloud.container.cluster.ingress.statusPort STATUS_PORT
Gere os valores dos setters
kpt
:kpt cfg list-setters asm
Na saída do comando, verifique se os valores dos setters a seguir estão corretos:
- anthos.servicemesh.rev
- gcloud.compute.location
- gcloud.container.cluster
- gcloud.container.cluster.ingress.httpPort
- gcloud.container.cluster.ingress.statusPort
- gcloud.core.project
- gcloud.project.environProjectNumber.
Continue seguindo o guia de instalação na seção Como instalar o Anthos Service Mesh. Depois de instalar o Anthos Service Mesh, retorne a este guia e continue com a próxima seção para configurar a integração com o IAP.
Upgrades
As etapas nesta seção complementam as etapas no guia Como fazer upgrade do Anthos Service Mesh no GKE. Nestas etapas, você usará as variáveis de ambiente criadas no guia de upgrade. Nesta seção, abordamos os seguintes casos de uso de upgrade:
Você já configurou a integração do IAP e está fazendo upgrade do Anthos Service Mesh. Nesse caso, você já ativou
iap.googleapis.com
no projeto e o complementoHttpLoadBalancing
no cluster. Portanto, você pode pular para a etapa 3.Você está atualizando o Anthos Service Mesh e quer configurar a integração com o IAP pela primeira vez. Nesse caso, será necessário concluir todas as etapas a seguir, fazer upgrade do Anthos Service Mesh e retornar a este guia após o upgrade para concluir a integração.
Ative
iap.googleapis.com
.gcloud services enable \ --project=$PROJECT_ID \ iap.googleapis.com
Ative o complemento
HttpLoadBalancing
. O complementoHttpLoadBalancing
ativa um controlador de balanceamento de carga HTTP (L7) para o cluster.gcloud container clusters update ${CLUSTER_NAME} \ --project=PROJECT_ID \ --update-addons=HttpLoadBalancing=ENABLED
Se você não definiu uma zona ou região padrão, é necessário fornecer a região (--region=${CLUSTER_LOCATION}) ou a zona (--zone=${CLUSTER_LOCATION}) no comando anterior. para criar um anexo da VLAN de monitoramento.
Continue seguindo o guia de upgrade para definir credenciais e permissões e fazer o download do arquivo de instalação. Parar em Como preparar arquivos de configuração de recursos e execute as etapas a seguir.
Crie um novo diretório para os arquivos de configuração do recurso do pacote Anthos Service Mesh. Recomendamos que você use o nome do cluster como o nome do diretório.
Altere para o diretório em que você quer fazer o download do pacote do Anthos Service Mesh.
Faça o download do pacote
asm-iap
: Esse pacote define o campotype
no serviçoistio-ingressgateway
comoNodePort
. Nessa configuração, oistio-ingressgateway
abre uma porta específica na malha de serviço. Isso permite que você configure um balanceador de carga, que encaminha o tráfego enviado ao seu nome de domínio para essa porta.kpt pkg get https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/asm-iap@release-1.6-asm asm
Defina o ID do projeto em que o cluster foi criado:
kpt cfg set asm gcloud.core.project PROJECT_ID
Defina o número do projeto host da frota:
kpt cfg set asm gcloud.project.environProjectNumber ${FLEET_PROJECT_NUMBER}
Defina o nome do cluster:
kpt cfg set asm gcloud.container.cluster ${CLUSTER_NAME}
Defina a zona ou a região padrão:
kpt cfg set asm gcloud.compute.location ${CLUSTER_LOCATION}
Defina o webhook de validação para usar um rótulo de revisão:
kpt cfg set asm anthos.servicemesh.rev asm-1614-2
Define o perfil de configuração. Para a integração do IAP, defina o perfil
asm-gcp
:kpt cfg set asm anthos.servicemesh.profile asm-gcp
Defina as portas HTTP e de status do balanceador de carga. A porta de status padrão é 31223 e a porta HTTP padrão é 31224.
Se você estiver atualizando um balanceador de carga HTTP do Cloud existente, execute o comando a seguir para preservar as portas HTTP e status existentes:
kpt cfg set asm gcloud.container.cluster.ingress.httpPort $(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
kpt cfg set asm gcloud.container.cluster.ingress.statusPort $(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')
Se necessário, use os setters
kpt
anteriores para definir outros valores para as portas.Gere os valores dos setters
kpt
:kpt cfg list-setters asm
Na saída do comando, verifique se os valores dos setters a seguir estão corretos:
- anthos.servicemesh.rev
- gcloud.compute.location
- gcloud.container.cluster
- gcloud.container.cluster.ingress.httpPort
- gcloud.container.cluster.ingress.statusPort
- gcloud.core.project
- gcloud.project.environProjectNumber
Continue seguindo o guia de upgrade na seção Como fazer upgrade do Anthos Service Mesh.
Como reservar um endereço IP estático e configurar o DNS
Para integrar o Identity-Aware Proxy com o Anthos Service Mesh, configure um balanceador de carga do Google Cloud HTTP(S), que requer um nome de domínio que aponte para um endereço IP estático. É possível reservar um endereço IP externo estático, que atribui o endereço ao projeto de maneira indefinida até você liberá-lo explicitamente.
Reserve um endereço IP externo estático.
gcloud compute addresses create example-static-ip --global
Consiga o endereço IP estático:
gcloud compute addresses describe example-static-ip --global
No registrador de domínios, configure um nome de domínio totalmente qualificado (FQDN, na sigla em inglês) com o endereço IP estático. Normalmente, você adiciona um registro
A
às configurações de DNS. As etapas de configuração e a terminologia para adicionar um registroA
para um FQDN variam de acordo com o registrador de domínios.Pode levar de 24 a 48 horas para que a configuração de DNS seja propagada. Você pode continuar configurando tudo neste guia, mas não será possível testar a configuração até que as configurações de DNS sejam propagadas.
Como implantar um aplicativo de amostra
Antes de ativar o IAP, você precisa de um aplicativo em execução no cluster do GKE para verificar se todas as solicitações têm uma identidade. Neste guia, usamos a amostra do Bookinfo para demonstrar a configuração do balanceador de carga HTTP(S) e a ativação do IAP.
Siga as etapas para implantar o Bookinfo. Até que você implante o balanceador de carga, o aplicativo Bookinfo não poderá ser acessado fora do cluster do GKE (como em um navegador).
Solicitações externas
O recurso Gateway do Bookinfo, definido em
samples/bookinfo/networking/bookinfo-gateway.yaml
, usa o istio-ingressgateway
pré-configurado.
Lembre-se de que, ao implantar o Anthos Service Mesh, você especificou NodePort
para
istio-ingressgateway
, o que abre uma porta específica na malha de serviço.
Embora os nós do cluster tenham endereços IP externos, as solicitações provenientes
de fora do cluster são bloqueadas pelas regras de firewall do Google Cloud. Com
o IAP, a maneira correta de expor aplicativos na Internet
pública é usando um balanceador de carga. Não exponha os endereços de nós usando
regras de firewall, que ignoram o IAP.
Para encaminhar solicitações ao Bookinfo, configure um balanceador de carga HTTP(S) no projeto do Google Cloud. Como o balanceador de carga está no projeto, ele está dentro do firewall e pode acessar os nós do cluster. Depois de configurar o balanceador de carga com o endereço IP estático e o nome de domínio, envie solicitações para o nome de domínio, e o balanceador de carga encaminhará as solicitações para os nós do cluster.
Como ativar o IAP
Veja nas etapas a seguir como ativar o IAP.
Como configurar a tela de consentimento
Verifique se você já tem uma marca usando o comando list. É possível ter apenas uma marca por projeto.
gcloud iap oauth-brands list
Veja um exemplo de resposta do gcloud, se a marca existir:
name: projects/[PROJECT_NUMBER]/brands/[BRAND_ID] applicationTitle: [APPLICATION_TITLE] supportEmail: [SUPPORT_EMAIL] orgInternalOnly: true
Se não houver marca, use o comando create:
gcloud iap oauth-brands create --application_title=APPLICATION_TITLE --support_email=SUPPORT_EMAIL
Os campos acima são obrigatórios ao chamar esta API:
supportEmail
: o e-mail de suporte exibido na tela de consentimento do OAuth. Esse endereço de e-mail pode ser um endereço de usuário ou um alias dos Grupos do Google. Embora as contas de serviço também tenham um endereço de e-mail, elas não são endereços de e-mail válidos e não podem ser usadas ao criar uma marca. No entanto, uma conta de serviço pode ser a proprietária de um Grupo do Google. Crie um novo Grupo do Google ou configure um grupo existente e defina a conta de serviço desejada como proprietário do grupo.applicationTitle
: o nome do aplicativo exibido na tela de consentimento do OAuth.
A resposta contém os seguintes campos:
name: projects/[PROJECT_NUMBER]/brands/[BRAND_ID] applicationTitle: [APPLICATION_TITLE] supportEmail: [SUPPORT_EMAIL] orgInternalOnly: true
Como criar um cliente OAuth do IAP
Use o comando create para criar um cliente. Use a marca
name
da etapa anterior.gcloud iap oauth-clients create projects/PROJECT_NUMBER/brands/BRAND-ID --display_name=NAME
A resposta contém os seguintes campos:
name: projects/[PROJECT_NUMBER]/brands/[BRAND_NAME]/identityAwareProxyClients/[CLIENT_ID] secret: [CLIENT_SECRET] displayName: [NAME]
Use o ID do cliente (
CLIENT_ID
na etapa acima) eCLIENT_SECRET
para ativar o IAP. Crie um secret do Kubernetes com os materiais de seu cliente OAuth:kubectl create secret generic -n istio-system my-secret --from-literal=client_id=CLIENT_ID \ --from-literal=client_secret=CLIENT_SECRET
Como implantar o balanceador de carga
É possível usar um recurso da Entrada para criar um balanceador de carga HTTP(S) com certificados SSL configurados automaticamente. Os certificados SSL gerenciados pelo Google são provisionados, renovados e gerenciados para seu domínio.
Crie um recurso ManagedCertificate. Este recurso especifica o domínio do certificado SSL. A lista
spec.domains
precisa conter apenas um domínio. Domínios com caracteres curinga não são compatíveis. No YAML a seguir, substituaDOMAIN_NAME
pelo nome de domínio que você configurou para o endereço IP estático externo.cat <<EOF | kubectl apply -f - apiVersion: networking.gke.io/v1beta1 kind: ManagedCertificate metadata: name: example-certificate namespace: istio-system spec: domains: - DOMAIN_NAME EOF
Crie um recurso BackendConfig. Esse recurso instrui o GCLB a realizar verificações de integridade no gateway de entrada, além de configurar o Identity-Aware Proxy. Primeiro, colete alguns valores do gateway de entrada sobre verificações de integridade:
Porta de entrada da verificação de integridade: é a porta da verificação de integridade do istio-ingress.
export HC_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')
Caminho de entrada da verificação de integridade: é o caminho de verificação de integridade do istio-ingress.
export HC_INGRESS_PATH=$(kubectl -n istio-system get deployments istio-ingressgateway -o jsonpath='{.spec.template.spec.containers[?(@.name=="istio-proxy")].readinessProbe.httpGet.path}')
cat <<EOF | kubectl apply -n istio-system -f - apiVersion: cloud.google.com/v1beta1 kind: BackendConfig metadata: name: http-hc-config spec: healthCheck: checkIntervalSec: 2 timeoutSec: 1 healthyThreshold: 1 unhealthyThreshold: 10 port: ${HC_INGRESS_PORT} type: HTTP requestPath: ${HC_INGRESS_PATH} iap: enabled: true oauthclientCredentials: secretName: my-secret EOF
Anote o serviço de entrada com o BackendConfig.
kubectl annotate -n istio-system service/istio-ingressgateway --overwrite \ cloud.google.com/backend-config='{"default": "http-hc-config"}' \ cloud.google.com/neg='{"ingress":false}'
Para criar o balanceador de carga, defina o recurso da Entrada.
Defina a anotação
networking.gke.io/managed-certificates
como o nome do certificado criado na etapa anterior,example-certificate
.Defina a anotação
kubernetes.io/ingress.global-static-ip-name
como o nome do endereço IP estático reservado,example-static-ip
.Defina
serviceName
comoistio-ingressgateway
, que é usado no recurso Gateway para a amostra Bookinfo.
cat <<EOF | kubectl create -f - apiVersion: extensions/v1beta1 kind: Ingress metadata: name: example-ingress namespace: istio-system annotations: kubernetes.io/ingress.global-static-ip-name: example-static-ip networking.gke.io/managed-certificates: example-certificate spec: backend: serviceName: istio-ingressgateway servicePort: 80 EOF
No console do Google Cloud, acesse a página Kubernetes Engine > Serviços e Entrada.
Acessar a página "Serviços e Entrada"
Você verá a mensagem "Criando entrada" na coluna Status. Aguarde até que o GKE provisione totalmente a Entrada antes de continuar. Atualize a página periodicamente para ver o status mais atualizado da Entrada. Depois que a Entrada for provisionada, você verá o status "Ok" ou o erro "Todos os serviços de back-end estão no estado NÃO ÍNTEGRO". Um dos recursos provisionados pelo GKE é uma verificação de integridade padrão. Se você vir a mensagem de erro, isso indica que a Entrada foi provisionada e que a verificação de integridade padrão foi executada. Quando aparecer o status "Ok" ou o erro, passe para a próxima seção para configurar as verificações de integridade do balanceador de carga.
Configurar a lista de acesso do IAP
Adicione um usuário à política de acesso do IAP:
gcloud beta iap web add-iam-policy-binding \ --member=user:EMAIL_ADDRESS \ --role=roles/iap.httpsResourceAccessor
em que EMAIL_ADDRESS
é o endereço de e-mail completo do usuário,
como alice@example.com
.
Teste o balanceador de carga. Aponte seu navegador para:
http://DOMAIN_NAME/productpage
em que
DOMAIN_NAME
é o nome de domínio que você configurou com o endereço IP estático externo.Você verá a
productpage
do aplicativo Bookinfo. Se você atualizar a página várias vezes, verá diferentes versões das avaliações, apresentadas em estilo round-robin: estrelas vermelhas, estrelas pretas, sem estrelas.Teste também o acesso
https
ao Bookinfo.
Ativar o suporte ao RCToken na malha de serviço
Por padrão, o IAP gera um JSON Web Token (JWT) com escopo para o cliente OAuth. No Anthos Service Mesh, é possível configurar o IAP para gerar um RequestContextToken (RCToken), que é um JWT, mas com um público configurável. O RCToken permite configurar o público do JWT para uma string arbitrária, que pode ser usada nas políticas do Anthos Service Mesh para autorização refinada.
Para configurar o RCToken:
Crie uma variável de ambiente para o número do projeto. Esse é o número que foi gerado e atribuído automaticamente ao projeto quando você o criou. Ele não é o mesmo que o ID do projeto.
export PROJECT_NUMBER=YOUR_PROJECT_NUMBER
Crie uma variável de ambiente para o público do RCToken. Pode ser qualquer string que você quiser.
export RCTOKEN_AUD="your-rctoken-aud"
Busque as configurações existentes do IAP
gcloud beta iap settings get --format json \ --project=${PROJECT_NUMBER} --resource-type=compute > iapSettings.json
Atualize
IapSettings
com o público do RCToken.cat iapSettings.json | jq --arg RCTOKEN_AUD_STR $RCTOKEN_AUD \ '. + {applicationSettings: {csmSettings: {rctokenAud: $RCTOKEN_AUD_STR}}}' \ > updatedIapSettings.json
gcloud beta iap settings set updatedIapSettings.json --format json \ --project=${PROJECT_NUMBER} --resource-type=compute
Ative a autenticação RCToken no gateway de entrada do Istio.
cat <<EOF | kubectl apply -f - apiVersion: "security.istio.io/v1beta1" kind: "RequestAuthentication" metadata: name: "ingressgateway-jwt-policy" namespace: "istio-system" spec: selector: matchLabels: app: istio-ingressgateway jwtRules: - issuer: "https://cloud.google.com/iap" jwksUri: "https://www.gstatic.com/iap/verify/public_key-jwk" audiences: - $RCTOKEN_AUD fromHeaders: - name: ingress-authorization prefix: "Istio " outputPayloadToHeader: "verified-jwt" forwardOriginalToken: true EOF
Verifique se as solicitações para a
productpage
do Bookinfo ainda estão bem-sucedidas:http://DOMAIN_NAME/productpage
Para testar a política:
Crie um objeto de solicitação
IapSettings
, mas definarctokenAud
como uma string diferente:echo $(cat <<EOF { "name": "projects/${PROJECT_NUMBER}/iap_web/compute", "applicationSettings": { "csmSettings": { "rctokenAud": "some-other-arbitrary-string" } } } EOF ) > request.txt
Chame a API
IapSettings
para definir o público do RCtoken.curl --request PATCH --header "Authorization: Bearer $(gcloud beta auth application-default print-access-token)" ${IAP_SETTINGS_API}
Faça uma solicitação para o Bookinfo
productpage
e ela falhará:http://DOMAIN_NAME/productpage
Como fazer a limpeza
Depois de concluir este tutorial, remova os seguintes recursos para evitar cobranças indesejadas na sua conta:
Exclua o certificado gerenciado:
kubectl delete managedcertificates example-certificate
Exclua a Entrada, que desaloca os recursos de balanceamento de carga:
kubectl -n istio-system delete ingress example-ingress
Exclua o endereço IP estático:
gcloud compute addresses delete example-static-ip --global
Se fizer isso, exclua o endereço IP do registrador de domínio.
Exclua o cluster, o que exclui os recursos que compõem o cluster, como instâncias de computação, discos e recursos de rede:
gcloud container clusters delete ${CLUSTER_NAME}