Saltar al contenido

Asegure sus servicios con Istio: Guía paso a paso para configurar conexiones TLS de Istio

Introducción

La configuración de TLS en Istio es una de las características esenciales cuando habilitamos un Service Mesh. Istio Service Mesh proporciona muchas características para definir de manera centralizada y con políticas cómo se maneja la seguridad de transporte, entre otras características, en las diferentes cargas de trabajo que has desplegado en tu clúster de Kubernetes.

Una de las principales ventajas de este enfoque es que puedes hacer que tu aplicación se concentre en la lógica de negocio que necesita implementar. Estos aspectos de seguridad pueden externalizarse y centralizarse sin necesariamente incluir un esfuerzo adicional en cada aplicación que hayas desplegado. Esto es especialmente relevante si estás siguiendo un enfoque poliglota (como deberías) en las cargas de trabajo de tu clúster de Kubernetes.

Así que, esta vez vamos a hacer que nuestras aplicaciones manejen solo tráfico HTTP tanto interno como externo, y dependiendo de a dónde estemos llegando, forzaremos que esa conexión sea TLS sin que la carga de trabajo necesite ser consciente de ello. Así que, veamos cómo podemos habilitar esta configuración de TLS en Istio.

Vista del Escenario

Usaremos esta imagen que puedes ver a continuación para tener en mente los conceptos y componentes que interactuarán como parte de las diferentes configuraciones que aplicaremos a esto.

  • Usaremos la puerta de enlace de entrada para manejar todo el tráfico entrante al clúster de Kubernetes y la puerta de enlace de salida para manejar todo el tráfico saliente del clúster.
  • Tendremos un contenedor sidecar desplegado en cada aplicación para manejar la comunicación desde las puertas de enlace o la comunicación de pod a pod.

Para simplificar las aplicaciones de prueba, usaremos las aplicaciones de muestra predeterminadas que Istio proporciona, las cuales puedes encontrar aquí.

¿Cómo Exponer TLS en Istio?

Esta es la parte más fácil, ya que toda la comunicación entrante que recibirás desde el exterior entrará al clúster a través de la Puerta de Enlace de Ingreso de Istio, por lo que es este componente el que necesita manejar la conexión TLS y luego usar el enfoque de seguridad habitual para hablar con el pod que expone la lógica.

Por defecto, la Puerta de Enlace de Ingreso de Istio ya expone un puerto TLS, como puedes ver en la imagen a continuación:

Asegura tus servicios con Istio: Una guía paso a paso para configurar conexiones TLS en Istio

Así que necesitaremos definir una Puerta de Enlace que reciba todo este tráfico a través de HTTPS y lo redirija a los pods, y lo haremos como puedes ver aquí:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway-https
  namespace: default
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
        - '*'
      port:
        name: https
        number: 443
        protocol: HTTPS
      tls:
        mode: SIMPLE # habilita HTTPS en este puerto
        credentialName: httpbin-credential 

Como podemos ver, es una configuración sencilla, solo agregando el puerto HTTPS en el 443 y proporcionando la configuración TLS:

Y con eso, ya podemos acceder usando SSL a las mismas páginas:

Asegura tus servicios con Istio: Una guía paso a paso para configurar conexiones TLS en Istio

¿Cómo Consumir SSL desde Istio?

Ahora que hemos generado una solicitud TLS entrante sin que la aplicación sepa nada, vamos un paso más allá y hacemos la configuración más desafiante. Configuraremos la conexión TLS/SSL para cualquier comunicación saliente fuera del clúster de Kubernetes sin que la aplicación sepa nada al respecto.

Para hacerlo, usaremos uno de los conceptos de Istio que ya hemos cubierto en un artículo específico. Ese concepto es la Entrada de Servicio de Istio que nos permite definir un punto final para gestionarlo dentro del MESH.

Aquí podemos ver el punto final de Wikipedia agregado al registro de Service Mesh:

 apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: se-app
  namespace: default
spec:
  hosts:
  - wikipedia.org
  ports:
  - name: https
    number: 443
    protocol: HTTPS
  resolution: DNS

Una vez que hemos configurado la Entrada de Servicio, podemos definir una Regla de Destino para forzar que todas las conexiones a wikipedia.org usen la configuración TLS:

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: tls-app
  namespace: default
spec:
  host: wikipedia.org
  trafficPolicy:
    tls:
      mode: SIMPLE

Secure Your Services with Istio: A Step-by-Step Guide to Setting up Istio TLS Connections

Introduction

Istio TLS configuration is one of the essential features when we enable a Service Mesh. Istio Service Mesh provides so many features to define in a centralized, policy way how transport security, among other characteristics, is handled in the different workloads you have deployed on your Kubernetes cluster.

One of the main advantages of this approach is that you can have your application focus on the business logic they need to implement. These security aspects can be externalized and centralized without necessarily including an additional effort in each application you have deployed. This is especially relevant if you are following a polyglot approach (as you should) across your Kubernetes cluster workloads.

So, this time we’re going to have our applications just handling HTTP traffic for both internal and external, and depending on where we are reaching, we will force that connection to be TLS without the workload needed to be aware of it. So, let’s see how we can enable this Istio TLS configuration

Scenario View

We will use this picture you can see below to keep in mind the concepts and components that will interact as part of the different configurations we will apply to this.

  • We will use the ingress gateway to handle all incoming traffic to the Kubernetes cluster and the egress gateway to handle all outcoming traffic from the cluster.
  • We will have a sidecar container deployed in each application to handle the communication from the gateways or the pod-to-pod communication.

To simplify the testing applications, we will use the default sample applications Istio provides, which you can find here.

How to Expose TLS in Istio?

This is the easiest part, as all the incoming communication you will receive from the outside will enter the cluster through the Istio Ingress Gateway, so it is this component the one that needs to handle the TLS connection and then use the usual security approach to talk to the pod exposing the logic.

By default, the Istio Ingress Gateway already exposes a TLS port, as you can see in the picture below:

Secure Your Services with Istio: A Step-by-Step Guide to Setting up Istio TLS Connections

So we will need to define a Gateway that receives all this traffic through the HTTPS and redirect that to the pods, and we will do it as you can see here:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway-https
  namespace: default
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
        - '*'
      port:
        name: https
        number: 443
        protocol: HTTPS
      tls:
        mode: SIMPLE # enables HTTPS on this port
        credentialName: httpbin-credential 

As we can see, it is a straightforward configuration, just adding the port HTTPS on the 443 and providing the TLS configuration:

And with that, we can already reach using SSL the same pages:

Secure Your Services with Istio: A Step-by-Step Guide to Setting up Istio TLS Connections

How To Consume SSL from Istio?

Now that we have generated a TLS incoming request without the application knowing anything, we will go one step beyond that and do the most challenging configuration. We will set up TLS/SSL connection to any outgoing communication outside the Kubernetes cluster without the application knowing anything about it.

To do so, we will use one of the Istio concepts we have already covered in a specific article. That concept is the Istio Service Entry that allows us to define an endpoint to manage it inside the MESH.

Here we can see the Wikipedia endpoint added to the Service Mesh registry:

 apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: se-app
  namespace: default
spec:
  hosts:
  - wikipedia.org
  ports:
  - name: https
    number: 443
    protocol: HTTPS
  resolution: DNS

Once we have configured the ServiceEntry, we can define a DestinationRule to force all connections to wikipedia.org will use the TLS configuration:

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: tls-app
  namespace: default
spec:
  host: wikipedia.org
  trafficPolicy:
    tls:
      mode: SIMPLE

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *