Por padrão, os workloads em uma instância do Service Mesh (ASM) podem se comunicar entre si. Crie políticas de autorização para aplicar controle de acesso e gerenciar permissões dos workloads no cluster. Assim, apenas solicitações que atendam a requisitos específicos acessam os workloads. Por exemplo, você pode controlar o acesso especificando caminhos de solicitação, métodos de requisição e endereços IP dos clientes. Essa prática aumenta a segurança e protege os recursos da instância ASM.
Pré-requisitos
Introdução ao recurso
Você pode definir a ação CUSTOM, DENY ou ALLOW em uma política de autorização. Ao aplicar várias políticas a um único workload, elas seguem níveis diferentes de prioridade. O sistema verifica as solicitações na seguinte ordem: CUSTOM, DENY e ALLOW. Se você criar múltiplas políticas para um mesmo workload, as regras abaixo serão aplicadas:
Se uma solicitação corresponder à condição de rejeição de uma política CUSTOM, ela será bloqueada.
Caso a solicitação atenda aos critérios de rejeição de uma política DENY, o acesso será negado.
Na ausência de uma política ALLOW configurada para o workload, a solicitação tem acesso permitido por padrão.
Quando existe uma política ALLOW e a requisição cumpre suas condições, o acesso ao workload é concedido.
Solicitações que não cumpram nenhum dos requisitos anteriores são automaticamente rejeitadas.
Este tópico apresenta quatro exemplos práticos para ajudar você a entender e configurar rapidamente as políticas de autorização:
Cenário 1: Controlar o acesso a um caminho específico de um workload
Neste exemplo, cria-se uma política de autorização permitindo que aplicações no namespace foo acessem o caminho /headers da aplicação HTTPBin, que também reside no namespace foo. Requisições para outros caminhos falharão. Aplicações fora do namespace foo não terão acesso à aplicação HTTPBin.
Etapa 1: Ativar a injeção automática de proxy sidecar nos namespaces default e foo
Crie os namespaces default e foo. Para mais informações, consulte Criar um namespace.
Ative a injeção automática de proxy sidecar para os namespaces default e foo. Para mais detalhes, veja Ativar injeção automática de proxy sidecar.
Etapa 2: Implantar aplicações de teste
-
Implante a aplicação sleep nos namespaces default e foo.
-
Crie um arquivo sleep.yaml com o seguinte conteúdo:
-
Execute o comando abaixo para implantar a aplicação sleep no namespace default:
kubectl apply -f sleep.yaml -n default -
Execute o comando a seguir para implantar a aplicação sleep no namespace foo:
kubectl apply -f sleep.yaml -n foo
-
-
Implante a aplicação HTTPBin no namespace foo.
-
Crie um arquivo httpbin.yaml contendo o conteúdo abaixo:
-
Execute este comando para implantar a aplicação HTTPBin no namespace foo:
kubectl apply -f httpbin.yaml -n foo
-
Etapa 3: Criar uma política de autorização
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em nome da instância ASM. No painel de navegação à esquerda, selecione . Na página exibida, clique em Create.
-
Na página Create, configure os parâmetros e clique em Create.
Parâmetro
Descrição
Name
Nome da política de autorização.
Policy Type
Defina o valor como ALLOW.
Namespaces
Na aba Workload Scope, defina Namespaces como foo.
Effective Scope
Selecione Service.
Workload
Escolha httpbin.
Request Matching Rules
Na seção Add Request Source, ative a chave Namespaces e insira o valor foo. Isso permite que todas as aplicações no namespace
fooacessem a aplicaçãohttpbin.Na seção Add Request Target, ative a chave Paths e defina o valor como /headers. Assim, as aplicações poderão acessar apenas o caminho
/headersda aplicaçãohttpbinno namespacefoo.
Etapa 4: Verificar se a política de controle de acesso ao caminho específico entrou em vigor
-
Envie uma requisição usando a aplicação sleep no namespace default para acessar a aplicação HTTPBin no namespace foo.
Acesse o console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique em nome do seu cluster. No painel de navegação à esquerda, clique em .
No topo da página Pods, defina Namespaces como default. Localize o pod
sleepe clique em na coluna Actions.-
Execute o comando abaixo na seção Terminal do contêiner sleep para acessar o caminho /headers da aplicação HTTPBin:
curl httpbin.foo.svc.cluster.local:8000/headersO código 403 será retornado, indicando que a requisição foi rejeitada.
-
Execute este comando na seção Terminal do contêiner sleep para acessar o caminho /ip da aplicação HTTPBin:
curl httpbin.foo.svc.cluster.local:8000/ipNovamente, o código 403 será retornado, confirmando a rejeição da requisição.
-
Envie uma requisição utilizando a aplicação sleep no namespace foo para acessar a aplicação HTTPBin, também no namespace foo.
No painel de navegação à esquerda da página de gerenciamento do cluster, escolha .
No topo da página Pods, defina Namespaces como foo. Encontre o pod
sleepe clique em na coluna Actions.-
Execute o seguinte comando na seção Terminal do contêiner sleep para acessar o caminho /headers da aplicação HTTPBin:
curl httpbin.foo.svc.cluster.local:8000/headersSaída esperada:
{ "headers": { "Accept": "*/*", "Host": "httpbin.foo.svc.cluster.local:8000", "User-Agent": "curl/7.82.0-DEV", "X-Envoy-Attempt-Count": "1", "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=f7ab4985563b5b1986314d5a36c6e46819213e2f38301f534f00afb7cd4b9164;Subject=\"\";URI=spiffe://cluster.local/ns/foo/sa/sleep" } } -
Execute o comando abaixo na seção Terminal do contêiner sleep para tentar acessar o caminho /ip da aplicação HTTPBin:
curl httpbin.foo.svc.cluster.local:8000/ipO retorno será o código 403, indicando que a requisição foi rejeitada.
Os resultados demonstram que as aplicações no namespace default não conseguem acessar os caminhos da aplicação HTTPBin no namespace foo. Já as aplicações dentro do namespace foo têm acesso permitido ao caminho /headers da aplicação HTTPBin.
Cenário 2: Controlar o método de requisição e o acesso a um caminho específico
Neste cenário, configura-se uma política de autorização determinando que aplicações fora do namespace foo só possam acessar o caminho /status da aplicação HTTPBin através de requisições GET. A aplicação HTTPBin está localizada no namespace foo. Requisições para outros caminhos ou que utilizem métodos diferentes de GET falharão.
Etapa 1: Ativar a injeção automática de proxy sidecar nos namespaces default e foo
Crie os namespaces default e foo. Consulte Criar um namespace para mais informações.
Ative a injeção automática de proxy sidecar para os namespaces default e foo. Veja mais detalhes em Ativar injeção automática de proxy sidecar.
Etapa 2: Implantar aplicações de teste
-
Implante a aplicação sleep nos namespaces default e foo.
-
Crie um arquivo sleep.yaml com o conteúdo a seguir:
-
Execute o comando abaixo para implantar a aplicação sleep no namespace default:
kubectl apply -f sleep.yaml -n default -
Execute o seguinte comando para implantar a aplicação sleep no namespace foo:
kubectl apply -f sleep.yaml -n foo
-
-
Implante a aplicação HTTPBin no namespace foo.
-
Crie um arquivo httpbin.yaml contendo o seguinte conteúdo:
-
Use o comando a seguir para implantar a aplicação HTTPBin no namespace foo:
kubectl apply -f httpbin.yaml -n foo
-
Etapa 3: Criar uma política de autorização
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em nome da instância ASM. No painel de navegação à esquerda, selecione . Na página exibida, clique em Create.
Na página Create, configure os parâmetros necessários e clique em Create.
Ative a chave Methods e defina o valor como GET.
Ative a chave Paths e insira o valor /status/*. Isso garante que aplicações em qualquer namespace usem exclusivamente o método GET para acessar o caminho /status da aplicação httpbin no namespace foo.
Parâmetro | Descrição |
Name | Nome da política de autorização. |
Policy Type | Selecione ALLOW. |
Namespaces | Na aba Workload Scope, defina Namespaces como foo. |
Effective Scope | Escolha Service. |
Workload | Selecione httpbin. |
Request Matching Rules | Na seção Add Request Target, configure os seguintes parâmetros: |
Etapa 4: Validar a eficácia da política de controle de método e caminho
Acesse o console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique em nome do seu cluster. No painel de navegação à esquerda, clique em .
No topo da página Pods, defina Namespaces como default. Localize o pod
sleepe clique em na coluna Actions.-
Execute o comando abaixo na seção Terminal do contêiner sleep para acessar o caminho /status da aplicação HTTPBin usando uma requisição POST:
curl -I -X POST "httpbin.foo.svc.cluster.local:8000/status/200" -H "accept: text/plain"O código 403 será retornado, indicando que a requisição foi rejeitada.
-
Execute este comando para tentar acessar o caminho /IP da aplicação HTTPBin usando uma requisição GET:
curl -I -X GET "httpbin.foo.svc.cluster.local:8000/IP/200" -H "accept: text/plain"Novamente, o código 403 será retornado, confirmando a rejeição.
-
Execute o comando a seguir para acessar o caminho /status da aplicação HTTPBin usando uma requisição GET:
curl -I -X GET "httpbin.foo.svc.cluster.local:8000/status/200" -H "accept: text/plain"Saída esperada:
HTTP/1.1 200 OK server: envoy date: Fri, 29 Apr 2022 03:01:16 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 5O resultado confirma que as aplicações no namespace default conseguem acessar o caminho /status da aplicação HTTPBin apenas via requisições GET. Isso comprova que a política de autorização está funcionando corretamente.
Exemplo 3: Restringir o acesso ao workload por endereços IP de cliente
Você pode criar uma política de autorização que permita o acesso à aplicação HTTPBin no namespace foo apenas para endereços IP de cliente autorizados.
Etapa 1: Ativar a injeção automática de proxy sidecar no namespace foo
Crie o namespace foo. Para mais informações, consulte Gerenciar namespaces globais.
Ative a injeção automática de proxy sidecar para o namespace foo. Veja mais detalhes em Ativar injeção automática de proxy sidecar.
Etapa 2: Implantar um gateway de entrada
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em nome da instância ASM. No painel de navegação à esquerda, selecione .
-
Na página Ingress Gateway, clique em Create, configure os parâmetros e clique em Create.
Parâmetro
Descrição
Name
Nome do gateway de entrada.
Cluster
Cluster onde o gateway de entrada será implantado.
SLB
Selecione Classic Load Balancer e Public Access. Este exemplo utiliza um Classic Load Balancer, mas também é possível usar um Network Load Balancer.
Create SLB Instance
Instância de balanceador de carga a ser utilizada. Escolha uma das opções abaixo:
Use Existing CLB Instance: Selecione um balanceador existente na lista.
Create SLB Instance: Clique em Create SLB Instance e escolha as especificações desejadas na lista suspensa.
Port Mapping
Selecione um Protocol e insira uma Service Port conforme necessário.
External Traffic Policy
Clique em Advanced Options e defina External Traffic Policy como Local.
Etapa 3: Criar um serviço virtual e um gateway Istio
-
Utilize o conteúdo abaixo para criar um serviço virtual no namespace foo. Para mais informações, consulte Gerenciar serviços virtuais.
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: httpbin spec: gateways: - httpbin-gateway hosts: - '*' http: - match: - uri: prefix: /headers route: - destination: host: httpbin port: number: 8000 -
Use o conteúdo a seguir para criar um gateway Istio no namespace foo. Consulte Gerenciar gateways Istio para mais detalhes.
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: httpbin-gateway spec: selector: istio: ingressgateway servers: - hosts: - '*' port: name: http number: 80 protocol: HTTP
Etapa 4: Criar uma política de autorização
Obtenha o endereço IP do gateway de entrada. Para instruções, veja Criar um gateway de entrada.
-
Identifique o endereço IP do cliente.
Insira http://{ASM Gateway IP}/headers na barra de endereços do seu navegador para obter o valor de X-Envoy-External-Address. Na resposta retornada, o campo
X-Envoy-External-Addresscorresponde ao endereço IP externo real do cliente.{ "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,imag...", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Cache-Control": "max-age=0", "Host": "<IP address>", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.3...", "X-Envoy-Attempt-Count": "1", "X-Envoy-External-Address": "<Client external IP>", "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=e49...service-account" } } -
Crie uma política de autorização.
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em nome da instância ASM. No painel de navegação à esquerda, selecione . Na página exibida, clique em Create.
-
Na página Create, configure os parâmetros e clique em Create.
Parâmetro
Descrição
Name
Nome da política de autorização.
Policy Type
Selecione DENY.
Namespaces
Na aba Workload Scope, defina Namespaces como foo.
Effective Scope
Escolha Service.
Workload
Selecione httpbin.
Request Matching Rules
Na seção Add Request Source, ative a chave RemoteIPBlocks e insira o endereço IP do cliente obtido na etapa anterior. Isso impede que o referido endereço IP acesse a aplicação
httpbin.
Etapa 5: Verificar se a política de bloqueio por IP entrou em vigor
No seu navegador, acesse http://{ASM gateway IP}/headers. A mensagem RBAC: access denied será exibida, indicando falha no acesso à aplicação httpbin. Isso confirma que a restrição baseada no endereço IP do cliente está ativa.
RBAC: access denied
Exemplo 4: Gerenciar o acesso a serviços entre namespaces
Etapa 1: Ativar a injeção automática de proxy sidecar nos namespaces demo-frontend e demo-server
Crie os namespaces demo-frontend e demo-server. Consulte Criar um namespace para mais informações.
Ative a injeção automática de proxy sidecar para os namespaces demo-frontend e demo-server. Para detalhes, consulte a seção "Ativar injeção automática de proxy sidecar" no tópico Gerenciar namespaces globais.
Etapa 2: Implantar serviços de teste
Crie um serviço chamado sleep no namespace demo-frontend e outro chamado httpbin no namespace demo-server. O serviço sleep será usado para enviar requisições de acesso ao serviço httpbin.
-
Crie o serviço sleep no namespace demo-frontend.
-
Crie um arquivo sleep.yaml com o seguinte conteúdo:
-
Conecte-se ao cluster Container Service for Kubernetes (ACK) usando kubectl e as informações do arquivo kubeconfig. Em seguida, execute o comando abaixo para criar o serviço sleep:
kubectl apply -f sleep.yaml -n demo-frontend
-
-
Crie o serviço httpbin no namespace demo-server.
-
Crie um arquivo httpbin.yaml contendo o conteúdo a seguir:
-
Utilize o kubectl para se conectar ao cluster ACK com base nas informações do arquivo kubeconfig e execute o comando abaixo para criar o serviço httpbin:
kubectl apply -f httpbin.yaml -n demo-server
-
-
Verifique se os proxies sidecar foram injetados nos pods onde residem os serviços sleep e httpbin.
Acesse o console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique em nome do seu cluster. No painel de navegação à esquerda, clique em .
-
No topo da página Pods, selecione demo-frontend na lista suspensa Namespaces e clique em nome do pod do serviço
sleep.Na aba Containers, verifique a presença do contêiner istio-proxy. Isso indica que a injeção de sidecar para o serviço
sleepfoi concluída com sucesso. -
No topo da página Pods, selecione demo-server na lista suspensa Namespaces e clique em nome do pod do serviço
httpbin.Na aba Containers, confirme a existência do contêiner istio-proxy. Isso demonstra que a injeção de sidecar para o serviço
httpbinfoi finalizada.
Etapa 3: Criar uma política de autorização para controlar o acesso entre namespaces
Crie uma política de autorização e modifique o parâmetro de ação para negar ou permitir requisições de acesso enviadas de serviços no namespace demo-frontend para serviços no namespace demo-server. Assim, você gerencia efetivamente o acesso entre namespaces.
-
Crie uma política de autorização para negar requisições de acesso do namespace demo-frontend para o namespace demo-server.
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em nome da instância ASM. No painel de navegação à esquerda, selecione . Na página exibida, clique em Create.
-
Configure os parâmetros da política de autorização e clique em Create.
Parâmetro
Descrição
Name
Nome da política de autorização.
Policy Type
Selecione DENY.
Namespaces
Na aba Workload Scope, defina Namespaces como
demo-server.Effective Scope
Escolha Namespace Scope.
Request Matching Rules
Na seção Add Request Source, ative a chave Namespaces e insira o valor demo-frontend.
-
Tente acessar o serviço httpbin.
Acesse o console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique em nome do seu cluster. No painel de navegação à esquerda, clique em .
No topo da página Pods, selecione demo-frontend na lista suspensa Namespaces. Em seguida, localize o pod
sleepe clique em na coluna Actions.-
Execute o comando abaixo no terminal do contêiner sleep para acessar o serviço httpbin:
curl -I httpbin.demo-server.svc.cluster.local:8000Saída esperada:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Wed, 11 Oct 2023 08:15:25 GMT server: envoy x-envoy-upstream-service-time: 4A saída acima indica que os serviços no namespace demo-frontend não conseguiram acessar os serviços no namespace demo-server.
-
Altere o valor do parâmetro de ação na política de autorização para ALLOW, permitindo assim as requisições de acesso do namespace demo-frontend para o namespace demo-server.
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em nome da instância ASM. No painel de navegação à esquerda, selecione .
Na página AuthorizationPolicy, localize a política desejada e clique em View YAML na coluna Actions.
Na caixa de diálogo Edit, altere o valor do parâmetro
actionpara ALLOW e clique em OK.
-
Execute o comando abaixo no terminal do contêiner sleep para acessar o serviço httpbin:
curl -I httpbin.demo-server.svc.cluster.local:8000Saída esperada:
HTTP/1.1 200 OK server: envoy date: Wed, 11 Oct 2023 08:21:40 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 13A saída acima confirma que os serviços no namespace demo-frontend agora acessam com sucesso os serviços no namespace demo-server.
Como demonstrado, após a criação de uma política de autorização com Action definida como Deny, os serviços no namespace demo-frontend falham ao tentar acessar o namespace demo-server. Quando a Action da política é alterada para ALLOW, o acesso entre os namespaces ocorre normalmente. Isso comprova a eficácia da política de autorização no controle de acesso entre namespaces.