Skip to main content

Protege tu aplicación desde Argo CD hasta Kubernetes

Escrito por

JJ Ng

Pas Apicella

Kubernetes Blog

12 de octubre de 2022

0 minutos de lectura

GitOps es un marco popular para administrar y proteger el pipeline de desarrollo de aplicaciones. Para muchas personas que han iniciado un recorrido con GitOps, surge una pregunta frecuente: «¿Cómo puedo proteger mi pipeline si todo está automatizado?»

El marco de GitOps es un concepto en el que todos los cambios o commits de código se realizan mediante Git, que luego activa un pipeline automatizado para compilar e implementar aplicaciones en Kubernetes. Como los equipos de desarrollo y seguridad tienen pocos puntos de contacto en el pipeline, es necesario exigir que la seguridad garantice que las aplicaciones implementadas tengan la menor cantidad posible de vulnerabilidades.

En este blog se explica cómo Snyk puede brindar seguridad para aplicaciones en GitOps, con un enfoque en una herramienta popular: Argo CD. En este escenario, Snyk ejecuta un análisis de IaC para garantizar que la aplicación que se va a implementar sea segura antes de la implementación y detiene la compilación si no lo es. Snyk también puede monitorear automáticamente las aplicaciones implementadas en distintos espacios de nombres de Kubernetes.

¿Qué es Argo CD?

Argo CD es una herramienta de entrega continua (CD) declarativa y nativa de Kubernetes que monitorea un repositorio y detecta cambios o «desviaciones». Luego aplica los cambios necesarios a la configuración del clúster de Kubernetes.

Cómo configurar Argo CD para que funcione con Snyk

Esta demostración muestra cómo iniciar tu proceso de GitOps con Argo CD y usar Snyk para brindar cobertura de seguridad a la aplicación y monitorear las cargas de trabajo de Kubernetes. Sigue estos pasos:

  1. Clona tu repositorio de Git

  2. Configura Argo CD

  3. Implementa la aplicación con Argo CD

  4. Crea un objeto secreto de Kubernetes para tu token de Snyk

  5. Crea un hook de recurso PreSync de Argo CD

  6. Espera a que Argo CD detecte la desviación de configuración

  7. Integra con Kubernetes

Requisitos previos

  1. Se requiere una cuenta de Snyk con un plan Business o Enterprise para ejecutar pruebas de Snyk en Argo CD e importar automáticamente cargas de trabajo de Kubernetes a Snyk. Si no tienes una cuenta de Snyk, puedes iniciar una prueba gratis de nuestro plan Business.

  2. Una instancia de Argo CD en ejecución en tu clúster de Kubernetes. Encontrarás los detalles de configuración en la documentación de Argo CD.

  3. Un clúster de Kubernetes en ejecución (por ejemplo, EKS, AKS, GKE, Red Hat OpenShift o cualquier distribución compatible).

Paso 1: Clona tu repositorio de Git

En esta demostración se usa una aplicación de encuestas en Flask cuyo código fuente está alojado en https://github.com/jiajunngjj/flask-polling-app. Clona el repositorio en tu propio entorno.

žœ  git clone https://github.com/jiajunngjj/flask-polling-app.git

Paso 2: Configura Argo CD

Agrega tu clúster de Kubernetes a Argo CD:

žœ argocd cluster add CONTEXTNAME

En esta demostración, Argo CD se encuentra dentro de este clúster de Kubernetes, así que se conecta automáticamente mediante el nombre de host interno de K8s (kubernetes.default.svc):

Página de configuración de clústeres de Argo CD que muestra un clúster de Kubernetes dentro del clúster en https://kubernetes.default.svc, con la versión 1.21 y el estado de conexión exitosa

A continuación, asegúrate de agregar también a Argo CD el repositorio mencionado anteriormente:

Formulario de Argo CD «Conectar repositorio mediante SSH» que muestra el valor predeterminado del proyecto y la URL de un repositorio de GitHub.

Cuando el repositorio se haya agregado correctamente, verás algo como esto:

Página de configuración de repositorios de Argo CD que muestra dos repositorios de GitHub con conexiones exitosas y opciones para conectar repositorios.

Paso 3: Implementa la aplicación con Argo CD

Crea un espacio de nombres de Kubernetes para implementar la aplicación. En este caso, crearemos el espacio de nombres argocd-demo para ejecutar flask-polling-app:

žœ kubectl create ns argocd-demo

Usa la línea de comandos de Argo CD para crear la aplicación (o hazlo desde la interfaz de usuario de Argo CD después de agregar el repositorio):

žœ argocd app create snyk-demo  \  --repo https://github.com/jiajunngjj/flask-polling-app.git \  --path argocd \  --dest-server https://kubernetes.default.svc \  --dest-namespace argocd-demo

A continuación, se explica el comando:

  • repo — Repositorio de administración del código fuente (SCM)

  • path — Directorio que contiene el manifiesto de Kubernetes

  • dest-server — Clúster de Kubernetes

  • dest-namespace — Espacio de nombres de Kubernetes en el que se implementará la aplicación

Después de crear la aplicación en Argo CD, verás el estado OutOfSync en la aplicación creada en la interfaz de usuario:

Panel de aplicaciones de Argo CD que muestra la aplicación snyk-demo marcada como Missing y OutOfSync
Pantalla de detalles de la aplicación de Argo CD que muestra la aplicación snyk-demo como desincronizada, con los recursos del servicio y el despliegue de polling-app en el árbol de aplicaciones.

A continuación, ejecuta el comando sync de Argo CD para implementar la aplicación:

žœ argocd app sync snyk-demo

Luego deberías ver la aplicación en la interfaz de usuario de Argo CD:

Árbol de detalles de la aplicación Argo CD que muestra la aplicación snyk-demo en buen estado y sincronizada, y los recursos de Kubernetes de polling-app

También deberías ver que la aplicación comenzó a implementarse en el espacio de nombres de Kubernetes argocd-demo:

➜ kubectl get pods -n argocd-demoNAME READY STATUS RESTARTS AGEpolling-app-6f5978849c-pp8f4 1/1 Running 0 33spolling-app-6f5978849c-tqpd2 1/1 Running 0 33s

Paso 4: Crea un objeto secreto de Kubernetes para tu token de Snyk

Después de agregar correctamente la aplicación a Argo CD, es hora de incluir la prueba de Snyk IaC en el pipeline de Argo CD. Obtén tu token de Snyk desde la aplicación de Snyk y crea un objeto secreto en el espacio de nombres argocd-demo:

➜ kubectl create secret generic snyk-token \ --from-literal=token=<XXXX-XXXXXX-XXXXXXXX> \ -n argocd-demo

Paso 5: Crea un hook de recurso PreSync de Argo CD

Crea un archivo llamado snyk-scan.yaml en el mismo directorio que los archivos YAML de implementación (argocd) y agrega el siguiente contenido:

apiVersion: batch/v1
kind: Job
metadata:
  name: snyk-iac-scan
  annotations:
    argocd.argoproj.io/hook: PreSync
spec:
  ttlSecondsAfterFinished: 600
  template:
    spec:
      containers:
      - name: snyk-cli
        image: snyk/snyk-cli:npm
        command: ["/bin/sh","-c"]
        args:
          - git clone https://github.com/jiajunngjj/flask-polling-app.git;
            snyk auth $SNYK_TOKEN;
            snyk iac test flask-polling-app/argocd/polling-app.yaml || true;
        env:
          - name: SNYK_TOKEN
            valueFrom:
              secretKeyRef:
                name: snyk-token
                key: token
      restartPolicy: Never
  backoffLimit: 0

Edita polling-app.yaml para activar la detección de desviaciones de configuración (en este ejemplo, se cambia el número de réplicas a «1»):

---
apiVersion: v1
kind: Service
metadata:
  name: polling-app
spec:
  ports:
  - name: 8080-tcp
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: polling-app
  type: LoadBalancer

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: polling-app
spec:
  replicas: 1
  selector:
  matchLabels:
    app: polling-app
  template:
    metadata:
      labels:
        app: polling-app
    spec:
      containers:
      - image: jiajunngjj/polling-app
        name: polling-app
        ports:
        - containerPort: 8080
      restartPolicy: "Always"

Ejecuta comandos de Git para enviar el archivo al repositorio:

➜ git add argocd/snyk-scan.yaml argocd/polling-app.yaml➜ git commit -m "added snyk-scan.yaml and edited polling-app.yaml"➜ git push

Paso 6: Espera a que Argo CD detecte la desviación de configuración

Cuando Argo CD detecta la desviación de configuración, comienza a sincronizarse para alcanzar el nuevo estado deseado. Puedes ver que el análisis de Snyk IaC se activa antes de implementar la aplicación:

Árbol de detalles de la aplicación de Argo CD que muestra la aplicación snyk-demo en buen estado y sincronizada, con el trabajo snyk-iac-scan resaltado en rojo.

También puedes ver snyk-iac-scan en ejecución como un pod:

➜ kubectl get pods -n argocd-demoNAME READY STATUS RESTARTS AGEpolling-app-6f5978849c-pp8f4 1/1 Running 0 16msnyk-iac-scan-9x8gz 0/1 Completed 0 2m32s

Por último, puedes ver en la interfaz de usuario de Argo CD que hay un trabajo snyk-iac-scan:

Los registros de Argo CD del trabajo snyk-iac-scan muestran que las pruebas de Snyk Infrastructure as Code finalizaron con cinco problemas de baja gravedad.

Paso 7: Integra con Kubernetes

Snyk se integra con Kubernetes y te permite importar y probar tus cargas de trabajo en ejecución para identificar vulnerabilidades en las imágenes asociadas y detectar configuraciones que podrían reducir su seguridad. Una vez importadas, Snyk monitorea continuamente esas cargas de trabajo e identifica y prioriza problemas de seguridad a medida que se implementan nuevas imágenes y cambian las configuraciones de las cargas de trabajo.

Una ventaja es que no es necesario actualizar los archivos YAML de implementación, ya que todo se hace automáticamente mediante Snyk Controller si configuras la importación automática (como se explica en la documentación de Snyk). Snyk admite las siguientes cargas de trabajo:

  • Implementaciones

  • ReplicaSets

  • DaemonSets

  • StatefulSets

  • Trabajos

  • CronJobs

  • ReplicationControllers

  • Pods

Otras publicaciones del blog de Snyk muestran cómo instalar varios clústeres de Kubernetes de Snyk en un solo clúster y cómo usar Pulumi para automatizar la integración de Snyk con Kubernetes.

Cuando Argo CD haya implementado tu aplicación, la integración de Snyk con Kubernetes importará el análisis de esa carga de trabajo a la plataforma, sin intervención manual:

Panel de proyectos de Snyk que muestra cargas de trabajo de Kubernetes y la cantidad de problemas de seguridad; el proyecto polling-app está resaltado con un óvalo rojo.
Panel del proyecto de Snyk para una aplicación de sondeo en Kubernetes que muestra los detalles de la imagen y recomendaciones para actualizar la imagen base de Python.

Resumen

En esta demostración se usa el hook de recursos de Argo CD para activar un análisis de Snyk IaC cada vez que se detecta un cambio en la configuración. De esta manera, puedes exigir seguridad en un flujo de trabajo de GitOps y usar Snyk para detectar vulnerabilidades y detener el flujo de trabajo cuando una vulnerabilidad detectada supere el umbral de gravedad definido. Así, el código vulnerable nunca llega al entorno de producción.

Más información

Ahora que aprendiste a configurar una prueba de Snyk IaC con Argo CD y a monitorear cargas de trabajo en Kubernetes, consulta estos recursos para obtener información sobre cómo proteger aún más el ciclo de vida del desarrollo de software:

Protege la infraestructura desde el origen

Snyk automatiza la seguridad y el cumplimiento de IaC en los flujos de trabajo, y detecta recursos con desviaciones de configuración y recursos faltantes.