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, essa configuração verifica se o token de acesso no cabeçalho é confiável e autoriza apenas 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 serviço.
Pré-requisitos
Um gateway de entrada está implantado. Para mais informações, consulte Criar um gateway de entrada.
Contexto
Este tópico usa o serviço httpbin como exemplo. Primeiro, utilize uma política RequestAuthentication para restringir as requisições que acessam o serviço 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:
Exija que todas as requisições contenham um JWT para acessar o serviço com êxito pelo gateway de entrada usando uma política de autorização.
Exija que todas as requisições contenham um JWT de um emissor específico para acessar o serviço com êxito pelo gateway de entrada usando uma política de autorização.
Etapa 1: Implantar o serviço de amostra
-
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 do 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 serviço de amostra.
Conecte-se ao cluster usando kubectl e o arquivo KubeConfig do cluster.
-
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 serviço 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 do 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 serviço virtual.
Na página de detalhes da instância do 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 Conversão 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 do ASM que deseja configurar. Clique no nome da instância do ASM ou clique em Manage na coluna Actions.
No painel de navegação à esquerda da página de detalhes da instância do 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 serviços podem usar o JWT. Deixe em branco para permitir o acesso a todos os serviços.
-
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 converte automaticamente essas informações 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 declaração sub com o valortesting@asm.test.io, uma declaração iat com o valor1623389700e uma declaração personalizada foo com o valorbar. -
Acesse o serviço 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 está funcionando: 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 serviço**
Crie uma política de autorização para exigir que todas as requisições contenham um JWT para acessar o serviço 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 do ASM que deseja configurar. Clique no nome da instância do ASM ou clique em Manage na coluna Actions.
Na página de detalhes da instância do 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 está funcionando: 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 serviço 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 do ASM que deseja configurar. Clique no nome da instância do ASM ou clique em Manage na coluna Actions.
Na página de detalhes da instância do 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 declaração iss como
testing@asm.test.ioe a declaraçãosubcomodemo@asm.test.iona seção PAYLOAD. Mantenha todas as outras configurações iguais às anteriores.// 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.
-