Skip to main content

Análisis de seguridad de JHipster con Snyk

Escrito por
Blog illustrations fipster feature

8 de octubre de 2020

0 minutos de lectura

JHipster es una plataforma de código abierto muy conocida que permite generar, desarrollar e implementar rápidamente aplicaciones web y de microservicios modernas. Con la CLI de JHipster, puedes elegir los frameworks y las plataformas que quieres usar para tus aplicaciones.

Combina fácilmente distintos frameworks. Por ejemplo, usa Java con Spring Boot para el backend, una base de datos MongoDB y Angular o React para el frontend. Al combinarlos con tu framework de pruebas favorito, se generará al instante una aplicación completa con todo el código base.

Illustrated bearded man wearing blue glasses and bow tie beside the word “Hipster” in script lettering

Crear aplicaciones con seguridad integrada

Crear el esqueleto de una aplicación y usar varios ecosistemas al mismo tiempo implica incorporar muchas dependencias de los ecosistemas elegidos. Es esencial vigilar el estado de tus dependencias. En particular, querrás recibir una notificación si alguna de esas dependencias tiene un problema de seguridad.


JHipster security scanning with Snyk

Analiza tu proyecto de JHipster desde la línea de comandos

Usaremos el escáner de vulnerabilidades gratuito de Snyk para probar las dependencias de la aplicación. Ya usaste npm para instalar JHipster, así que solo tienes que ejecutar este comando para instalar Snyk en tu equipo.

npm i -g snyk

Lo primero que debes hacer es autenticarte. Necesitas una cuenta gratuita de Snyk para usar las funciones de análisis. Si escribes snyk auth, la CLI abrirá un navegador web donde podrás crear una cuenta gratuita o iniciar sesión. También puedes usar tu clave de API snyk auth <api key> si ya tienes una cuenta de Snyk, o configurarla como variable de entorno SNYK_TOKEN.

Cada vez que quieras analizar tu proyecto, solo tienes que ejecutar el siguiente comando.

snyk test --all-projects

Se recomienda usar la opción all-projects, ya que podrías tener más de un proyecto en la carpeta. Esto obliga a Snyk a buscar más de un archivo de manifiesto en el directorio actual y sus subdirectorios.

Si acabas de crear una pequeña aplicación monolítica con JHipster, es posible que tengas en la carpeta un archivo de manifiesto de Java para el backend y otro de Node.js para el frontend. Queremos analizarlos ambos.

El resultado del análisis te permite saber si incluiste bibliotecas con vulnerabilidades y si hay una forma sencilla de corregirlas. Pero, aunque todavía no haya una actualización directa disponible, es posible que puedas actualizar la biblioteca manualmente. Aquí encontrarás algunos ejemplos de cómo hacerlo con Maven.

Terminal output listing Java dependency vulnerabilities, including deserialization of untrusted data and denial of service, with upgrade guidance.

Analiza tus dependencias en el flujo de CI/CD

Al ejecutar jhipster ci-cd, tienes varias opciones para configurar un pipeline de CI. También sería ideal analizar las dependencias como parte de este pipeline. En este ejemplo, usaremos Snyk para hacerlo. Solo necesitas una cuenta gratuita de Snyk para usar la clave de API.

En el siguiente ejemplo, te mostraremos cómo integrar la CLI en distintos pipelines que JHipster puede crear. Es la misma CLI que usamos hace poco en nuestro equipo local y genera resultados similares.

Además, probablemente quieras monitorear las dependencias después de compilar el binario. Como pueden aparecer vulnerabilidades con el tiempo, sería ideal monitorear las dependencias de forma continua. Te mostramos cómo hacerlo con snyk monitor en tu pipeline.

Jenkins

Al seleccionar un pipeline de Jenkins, se generará un nuevo archivo src/main/docker/jenkins.yml. Puedes ejecutar este contenedor de Docker con docker-compose -f src/main/docker/jenkins.yml up.

Al usar Jenkins, tienes dos opciones. Puedes instalar el plugin de Snyk en Jenkins desde la interfaz y configurarlo para usarlo en tu pipeline.

También puedes analizar tu aplicación con el binario de la CLI de Snyk y declararlo en el Jenkinsfile que genera el generador jhipster ci-cd.

Agrega las siguientes etapas a ese Jenkinsfile para descargar la versión más reciente de la CLI de Snyk y analizar con ella.

Nota: debes agregar el token de API de Snyk de tu cuenta gratuita como variable de entorno SNYK_TOKEN.

Jenkins mascot wearing a tuxedo and bow tie, holding a white scroll against a red circular background
Jenkinsfile
// Not required if you install the Snyk CLI on your Agent
stage('Download Latest Snyk CLI') {
   sh """
       curl -Lo ./snyk $(curl -s https://api.github.com/repos/snyk/snyk/releases/latest | grep "browser_download_url.*snyk-linux"" | cut -d ':' -f 2,3 | tr -d " | tr -d ' ')
       chmod +x snyk
   """
}

// Run snyk test to check for vulnerabilities and fail the build if any are found
// Consider using --severity-threshold=<low|medium|high> for more granularity (see snyk help for more info).
stage('Snyk Test using Snyk CLI') {
   sh './snyk test --all-projects'
}

// Run snyk monitor to create a snapshot and let it monitor by Snyk
// Consider using --severity-threshold=<low|medium|high> for more granularity (see snyk help for more info).
stage('Snyk Monitor using Snyk CLI') {
   sh './snyk monitor --all-projects'
}

El Jenkinsfile contiene 3 tareas:

  • descargar el binario más reciente de la CLI de Snyk

  • Snyk Test: analizar tu aplicación y mostrar las vulnerabilidades

  • Snyk Monitor: crear una instantánea del estado actual y enviarla a Snyk para su monitoreo activo

Tanto en Snyk Test como en Snyk Monitor, puedes agregar --severity-threshold=<low|medium|high> para recibir notificaciones solo sobre vulnerabilidades de una gravedad determinada.

GitHub Actions

GitHub Actions es probablemente una de las formas más populares de crear un pipeline cuando usas GitHub como repositorio. Al elegir “Github Actions” en el generador jhipster ci-cd, JHipster generará el archivo .github/workflow/github-ci.yml. GitHub detectará los archivos YAML de esa carpeta de flujo de trabajo y los ejecutará como una “acción” después de cada push.

GitHub Actions workflow icon with connected play, checkmark, and pending status symbols

Hay varias formas de integrar Snyk en este flujo.

Acciones de GitHub independientes

Puedes crear acciones de GitHub independientes para las funciones de Snyk Test. Para ello, debes crear un archivo yml independiente en la carpeta de flujo de trabajo. La acción se ejecutará en paralelo con el pipeline creado por JHipster.

Según el ecosistema, tendrás que insertar una acción específica. Puedes encontrar ejemplos de estas acciones en este repositorio.

Integra las pruebas de Snyk en el pipeline generado

También puedes integrar Snyk como paso adicional en el pipeline generado por JHipster.

Primero, debes agregar tu token de API de Snyk a las variables de entorno. Puedes agregarlo en la sección env de tu script.

env:
   ...
   SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}

Como no quieres exponer tu token al mundo exterior, agrégalo a tus secretos. Para ello, selecciona Settings †’ Secrets †’ New secret.

GitHub repository Settings page showing the Secrets section with an existing SNYK_TOKEN secret and options to update or remove it.

Al agregar los siguientes pasos, podrás:

  • descargar el binario más reciente de la CLI

  • probar tu aplicación con Snyk Test

  • monitorear la instantánea actual con Snyk Monitor

    • - name: Install Snyk CLI
       run: |
         curl -Lo ./snyk $(curl -s https://api.github.com/repos/snyk/snyk/releases/latest | grep "browser_download_url.*snyk-linux"" | cut -d ':' -f 2,3 | tr -d " | tr -d ' ')
         chmod +x snyk
      - name: Snyk Test
       run: ./snyk test --all-projects
      - name: Snyk Monitor
       run: ./snyk test --all-projects

También puedes instalar el binario con npm. Sin embargo, npm debe estar instalado en el pipeline. Esto ya ocurre si elegiste un frontend basado en JavaScript. En ese caso, puedes reemplazar el paso Install Snyk CLI por el siguiente:

- name: Install Snyk
 run: npm install -g snyk
- name: Snyk Test
 run: snyk test --all-projects
- name: Snyk Monitor
 run: snyk test --all-projects

Tanto en Snyk Test como en Snyk Monitor, puedes agregar --severity-threshold=<low|medium|high> para recibir notificaciones solo sobre vulnerabilidades de una gravedad determinada.

Travis CI

JHipster genera un archivo .travis si eliges esta opción en el generador jipster ci-cd. Puedes integrar Snyk fácilmente agregando lo siguiente a la sección script:

Cartoon construction worker wearing a yellow hard hat marked with a red T, safety glasses, and a red mustache
script:
...
# Dependency scanning with Snyk
# add Snyk API token as environment variable SNYK_TOKEN
- curl -Lo ./snyk $(curl -s https://api.github.com/repos/snyk/snyk/releases/latest | grep "browser_download_url.*snyk-linux"" | cut -d ':' -f 2,3 | tr -d " | tr -d ' ')
- chmod +x snyk
- ./snyk test --all-projects
- ./snyk monitor --all-projects

…

Debes agregar tu clave de API de Snyk como variable de entorno SNYK_TOKEN. Tanto en Snyk Test como en Snyk Monitor, puedes agregar --severity-threshold=<low|medium|high> para recibir notificaciones solo sobre vulnerabilidades de una gravedad determinada.

Circle CI

Al usar Circle CI, tienes 2 opciones. Puedes configurar tu instancia de Circle CI para usar Snyk Orb, como se describe en la documentación de integración. La otra opción es analizar con la versión más reciente de la CLI. Para hacerlo, agrega lo siguiente a tu archivo config.yml, creado por JHipster ci-cd.

CircleCI logo in black and white
       steps:
...
# Dependency scanning with Snyk.
# add Snyk API token as environment variable SNYK_TOKEN
 - run:
     name: install-snyk
     command: |
       curl -Lo ./snyk $(curl -s https://api.github.com/repos/snyk/snyk/releases/latest | grep "browser_download_url.*snyk-linux"" | cut -d ':' -f 2,3 | tr -d " | tr -d ' ')
       chmod +x snyk
 - run: # run snyk test
     name: snyk test
     command: './snyk test --all-projects'
 - run: # run snyk monitor
     name: snyk monitor
     command: './snyk monitor --all-projects'
...

Debes agregar tu clave de API de Snyk como variable de entorno SNYK_TOKEN. Tanto en Snyk Test como en Snyk Monitor, puedes agregar --severity-threshold=<low|medium|high> para recibir notificaciones solo sobre vulnerabilidades de una gravedad determinada.

GitLab CI

Para GitLab CI, también podemos integrar la CLI de Snyk para analizar tus proyectos en el pipeline de CI. En el archivo .gitlab-ci.yml generado por JHipster ci-cd, puedes agregar el siguiente ejemplo al final para analizar y monitorear tus proyectos.

GitLab CI logo with the orange fox icon and gray “GitLab CI” text
# Dependency scanning with Snyk
# add Snyk API token as environment variable SNYK_TOKEN
dependency_scanning:
 stage: release
 script:
   # Download latest CLI version
   - curl -Lo ./snyk $(curl -s https://api.github.com/repos/snyk/snyk/releases/latest | grep "browser_download_url.*snyk-linux"" | cut -d ':' -f 2,3 | tr -d " | tr -d ' ')
   - chmod +x snyk
   # SNYK_TOKEN environment variable should be present and containing the api key
   # run snyk test to break build if needed and snyk monitor to monitor this snapshot
   - ./snyk test --all-projects
   - ./snyk monitor --all-projects

Una vez más, debes agregar tu clave de API de Snyk como variable de entorno SNYK_TOKEN. Tanto en Snyk Test como en Snyk Monitor, puedes agregar --severity-threshold=<low|medium|high> para recibir notificaciones solo sobre vulnerabilidades de una gravedad determinada.

Conclusión

Es evidente que es importante revisar si tus bibliotecas de terceros tienen problemas de seguridad. Hay muchísimos ejemplos de casos en los que una biblioteca vulnerable que no se reemplazó por una versión corregida provocó un problema grave. Analizar con Snyk te ayuda a prevenirlo, tanto en tu equipo local durante el desarrollo como en tu pipeline de CI.

Como ves, analizar las dependencias de tu proyecto de JHipster es bastante sencillo. Si quieres ver los ejemplos de código de los pipelines de CI descritos en esta publicación, consulta este proyecto de ejemplo de JHipster. Desarrolla rápido con JHipster y mantén la seguridad con Snyk.

Introducción a Capture the flag

Aprende a resolver los desafíos de Capture the flag viendo nuestro taller virtual 101 bajo demanda.