Este tópico mostra como configurar a autenticação de requisição JWT no Service Mesh para validar a origem, também conhecida como autenticação de usuário final. Ao receber uma requisição do usuário, essa configuração verifica se o token de acesso no cabeçalho da requisição é confiável e autoriza requisições de origens legítimas. Este tópico descreve como configurar a autenticação de requisição JWT para um gateway de entrada no ASM, exigindo um token de acesso confiável para acessar o service.
Pré-requisitos
Um gateway de entrada está implantado. Para mais informações, consulte Create an ingress gateway.
Contexto
Este tópico utiliza o service httpbin como exemplo. Primeiro, use uma política RequestAuthentication para restringir as requisições que acessam o service por meio de um gateway de entrada. Essa política inicial permite requisições com um JWT válido e nega requisições com um JWT inválido, mas também permite requisições sem JWT. Com base nisso, use uma política de autorização para restringir ainda mais as requisições nos dois cenários a seguir:
Use uma política de autorização para exigir que todas as requisições contenham um JWT para acessar o service com sucesso pelo gateway de entrada.
Use uma política de autorização para exigir que todas as requisições contenham um JWT de um emissor específico para acessar o service com sucesso pelo gateway de entrada.
Etapa 1: Implantar o service de exemplo
-
Ative a injeção automática para o namespace padrão.
Faça login no console do ASM.
No painel de navegação à esquerda, escolha .
Na página de detalhes da instância ASM, escolha no painel de navegação à esquerda.
Na página Global Namespace, localize default e clique em Enable Automatic Sidecar Proxy Injection na coluna Automatic Sidecar Injection.
Na caixa de diálogo Confirm, clique em OK.
-
Implante o service de exemplo.
Connect to the cluster by using kubectl and the cluster's KubeConfig file.
-
Crie um arquivo chamado httpbin.yaml com o seguinte conteúdo.
apiVersion: v1 kind: ServiceAccount metadata: name: httpbin --- apiVersion: v1 kind: Service metadata: name: httpbin labels: app: httpbin service: httpbin spec: ports: - name: http port: 8000 targetPort: 80 selector: app: httpbin --- apiVersion: apps/v1 kind: Deployment metadata: name: httpbin spec: replicas: 1 selector: matchLabels: app: httpbin version: v1 template: metadata: labels: app: httpbin version: v1 spec: serviceAccountName: httpbin containers: - image: docker.io/kennethreitz/httpbin imagePullPolicy: IfNotPresent name: httpbin ports: - containerPort: 80 -
Execute o comando a seguir para criar a aplicação httpbin.
kubectl apply -f httpbin.yaml -n default
Etapa 2: Criar um Gateway e um service virtual
-
Crie um Gateway.
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha . Na página exibida, clique em Create from YAML.
-
Defina Namespaces como default, insira o conteúdo a seguir na caixa de texto e clique em Create.
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: httpbin-gateway namespace: default spec: selector: istio: ingressgateway servers: - hosts: - '*' port: name: http number: 80 protocol: HTTP
-
Crie um service virtual.
Na página de detalhes da instância ASM, escolha no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.
-
Defina Namespaces como default, insira o conteúdo a seguir na caixa de texto e clique em Create.
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: httpbin namespace: default spec: gateways: - httpbin-gateway hosts: - '*' http: - route: - destination: host: httpbin port: number: 8000
Etapa 3: Criar uma política RequestAuthentication
-
Crie um JWK.
-
No OpenSSL, execute o comando a seguir para gerar uma chave privada RSA de 2048 bits.
openssl genrsa -out rsa-private-key.pem 2048 -
Execute o comando a seguir para gerar uma chave pública a partir da chave privada.
openssl rsa -in rsa-private-key.pem -pubout -out rsa-public-key.pem -
Em uma ferramenta online de Conversor de JWK para PEM, selecione PEM-to-JWK (RSA Only), insira a chave pública e clique em envie para converter a chave pública em um JWK.
{"kty":"RSA","e":"AQAB","kid":"59399e22-7a9a-45ed-8c76-7add7863915c","n":"2dnwOlDKEwII9Cyh9w7o59a5y3RS2gWUKYC3HSBJL1FhYIZa7sjTCKxwEuG-vCRQkR6augWxYWseSDfgtyivzi3CxxkF8WnQbECOCGm5xAYKmMcXeOpv0zsJTHN122Tt_tsd6K2OC3yGwKtmp7m-MOpHagqWRqFtvyEOm_1JW1-t0n1VsGSeWww8dvcmnJPKAKHbAU40jdV1hMn9AA3RfSpDY6nfrUkpXA5-aQ6rJRjMn36DatZ5ykVL4LKPOUxZdfK_yNIPkCnwIKesqiOpr4s-iCM8pMiZuejDZ1qoX-uBjggESf4G9_L-laDSeoDmXeOZ9kzN3Jw8ay69ihIFEQ"}
-
-
Crie uma política RequestAuthentication.
Faça login no console do ASM.
No painel de navegação à esquerda, escolha .
Na página Mesh Management, localize a instância ASM que deseja configurar. Clique no nome da instância ASM ou clique em Manage na coluna Actions.
No painel de navegação à esquerda da página de detalhes da instância ASM, escolha . Na página exibida, clique em Create.
-
Na página Create, configure os parâmetros e clique em Create.
Parâmetro
Descrição
Namespaces
Defina Namespaces como istio-system.
Name
Insira um nome para a política.
Match Label
Seleciona as cargas de trabalho às quais a política se aplica.
Clique em Add Matching Label. Defina Name como istio e Value como ingressgateway.
JWT Rule Set
Clique em Add à direita de JWT Rule Set e configure a regra JWT:
-
issuer: O emissor do JWT. Neste tópico, defina como testing@asm.test.io.
-
audiences: Uma lista de públicos-alvo para o JWT. Especifica quais services podem usar o JWT. Deixe em branco para permitir o acesso a todos os services.
-
jwks: As informações do JWT. Defina como
{"keys":[YOUR_JWK]}. Por exemplo, se o JWK da Etapa 3 for{"kty":"RSA","e":"AQAB","kid":"59399e22-7a9a-45ed-8c76-7add786**"}, definajwkscomo{"keys":[{"kty":"RSA","e":"AQAB","kid":"59399e22-7a9a-45ed-8c76-7add786**"}]}.
-
Etapa 4: Verificar a política RequestAuthentication
-
Use uma ferramenta como o JWT.io para codificar suas informações de requisição JWT em um JWT.
Na seção Decoded, insira as informações da requisição JWT. A ferramenta as converte automaticamente em um JWT na seção Encoded.
HEADER: Defina o algoritmo de criptografia como RS256, insira o
kiddo seu JWK e defina o tipo como JWT.PAYLOAD: Defina
isscomotesting@asm.test.io. Você também pode adicionar informações personalizadas.VERIFY SIGNATURE: Insira a chave pública e a chave privada criadas na Etapa 3.
Neste exemplo, o valor kid no HEADER é
59399e22-7a9a-45ed-8c76-7add7863915c. O PAYLOAD também contém uma claim sub com o valortesting@asm.test.io, uma claim iat com o valor1623389700e uma claim personalizada foo com o valorbar. -
Acesse o service pelo gateway de entrada.
-
Execute o comando a seguir para enviar uma requisição com o JWT válido criado na etapa anterior.
curl -I -H "Authorization: Bearer $TOKEN" http://{YOUR_ASM_GATEWAY_ADDRESS}/Saída esperada:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMT -
Execute o comando a seguir para enviar uma requisição com um JWT inválido.
curl -I -H "Authorization: Bearer invalidToken" http://{YOUR_ASM_GATEWAY_ADDRESS}/Saída esperada:
HTTP/1.1 401 Unauthorized www-authenticate: Bearer realm="http://47.98.25*.***/", error="invalid_token" content-length: 79 content-type: text/plain date: Fri, 18 Mar 2022 07:59:00 GMT server: istio-envoy -
Execute o comando a seguir para enviar uma requisição sem JWT.
curl -I http://{YOUR_ASM_GATEWAY_ADDRESS}/Saída esperada:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMT
Os resultados confirmam que a política RequestAuthentication funciona: requisições com um token válido ou sem token são bem-sucedidas, enquanto requisições com um token inválido são negadas.
-
Etapa 5: Criar uma política de autorização
**Cenário 1: Restringir o acesso ao service**
Crie uma política de autorização para exigir que todas as requisições contenham um JWT para acessar o service pelo gateway de entrada.
Faça login no console do ASM.
No painel de navegação à esquerda, escolha .
Na página Mesh Management, localize a instância ASM que deseja configurar. Clique no nome da instância ASM ou clique em Manage na coluna Actions.
Na página de detalhes da instância ASM, escolha no painel de navegação à esquerda. Na página exibida, clique em Create.
-
Na página Create, configure os parâmetros e clique em Create.
Neste exemplo, insira
require-jwtem Name.Parâmetro
Descrição
Name
Insira um nome para a política de autorização.
Policy Type
Defina Policy Type como ALLOW.
Gateway Scope
Clique na aba Gateway Scope e defina ASM Gateway como ingressgateway. Na seção Add Request Source, ative RequestPrincipals e insira * na caixa de texto.
-
Verifique a política de autorização.
-
Execute o comando a seguir para enviar uma requisição sem JWT.
curl -I http://{YOUR_ASM_GATEWAY_ADDRESS}/Saída esperada:
HTTP/1.1 401 Unauthorized www-authenticate: Bearer realm="http://47.98.25*.***/", error="invalid_token" content-length: 79 content-type: text/plain date: Fri, 18 Mar 2022 07:59:00 GMT server: istio-envoy -
Execute o comando a seguir para enviar uma requisição com um JWT válido.
curl -I -H "Authorization: Bearer $TOKEN" http://{YOUR_ASM_GATEWAY_ADDRESS}/Saída esperada:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMT
Os resultados confirmam que a política de autorização funciona: requisições sem JWT agora são negadas, enquanto requisições com um token válido são bem-sucedidas.
-
**Cenário 2: Restringir emissores de JWT**
Crie uma política de autorização para exigir que as requisições contenham um JWT de um emissor específico para acessar o service pelo gateway de entrada.
Faça login no console do ASM.
No painel de navegação à esquerda, escolha .
Na página Mesh Management, localize a instância ASM que deseja configurar. Clique no nome da instância ASM ou clique em Manage na coluna Actions.
Na página de detalhes da instância ASM, escolha no painel de navegação à esquerda. Na página exibida, clique em Create.
-
Na página Create, configure os parâmetros e clique em Create.
Parâmetro
Descrição
Name
Insira um nome para a política de autorização.
Policy Type
Defina Policy Type como ALLOW.
Gateway Scope
Clique na aba Gateway Scope e defina ASM Gateway como ingressgateway. Na seção Add Request Source, ative RequestPrincipals e insira testing@asm.test.io/demo@asm.test.io na caixa de texto.
-
Verifique se a política de autorização restringe o acesso com base no emissor.
-
Execute o comando a seguir para enviar uma requisição com o JWT original.
curl -I -H "Authorization: Bearer $TOKEN" http://{YOUR_ASM_GATEWAY_ADDRESS}/Saída esperada:
HTTP/1.1 401 Unauthorized www-authenticate: Bearer realm="http://47.98.25*.***/", error="invalid_token" content-length: 79 content-type: text/plain date: Fri, 18 Mar 2022 07:59:00 GMT server: istio-envoyA requisição falha porque a política de autorização exige que o principal do JWT seja
testing@asm.test.io/demo@asm.test.io. O principal do token original, que étesting@asm.test.io/testing@asm.test.io(issuer/subject), não corresponde. -
Modifique o JWT para ter um principal de
testing@asm.test.io/demo@asm.test.io.Na ferramenta JWT, defina a claim iss como
testing@asm.test.ioe a claimsubcomodemo@asm.test.iona seção PAYLOAD. Mantenha todas as outras configurações iguais às da etapa anterior.// Header { "alg": "RS256", "kid": "59399e22-7a9a-45ed-8c76-7add7863915c", "typ": "JWT" } // Payload { "foo": "bar", "iat": 1623389700, "iss": "testing@asm.test.io", "sub": "demo@asm.test.io" } -
Execute o comando a seguir para enviar uma requisição com o JWT recém-gerado.
curl -I -H "Authorization: Bearer $TOKEN" http://{YOUR_ASM_GATEWAY_ADDRESS}/Saída esperada:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMTA requisição é bem-sucedida, confirmando que a política de autorização restringe corretamente o acesso com base no principal do JWT.
-