# Pasando de DevOps a DevSecOps en nuestro CI/CD con GitHub Actions y Okteto.

Esta es la segunda parte de la entrada de CI/CD, gratis, con **GitHub Actions** & **Okteto** como cluster de **Kubernetes**.

¡Ya tenemos nuestro Pipeline funcionando! Ahora vamos a transformarnos en DevSecOps y vamos a integrar un poco de Seguridad, que nunca viene mal, a nuestro CI/CD.

Me puse a revisar y creo que si pensamos en Análisis de Código, pensamos en SAST & DAST. Entiendo que es un buen comienzo, pero ¡Vamos a revisar un poco mas! Vamos agregar funcionalidades como:

· SAST con SonarCloud  
· Detect Secrets  
· Análisis de Imagen Docker con Trivy de AquaSec  
· DAST con OWASP ZAP

## SAST con SonarCloud

Como muchos saben SonarQube es una plataforma para la calidad del código. Usa diversas herramientas de [análisis estático](https://es.wikipedia.org/wiki/An%C3%A1lisis_est%C3%A1tico_de_software) de código fuente o SAST como Checkstyle, PMD o FindBugs para obtener métricas que pueden ayudar a mejorar la calidad del código de un programa.

Vamos a usar la version SaaS SonarCloud, que para proyectos públicos es gratis. Para poder agregarlo a nuestro GitHub Actions es necesita interactuar con el servicio, para ello vamos a gestionar el Token, requerido.

Primero creamos el proyecto en SonarCloud y luego vamos a picar el el logo de GitHub Actions y seguimos los pasos.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707408949681/c81b70f0-644f-471e-abd0-9c1dc90dd728.jpeg align="center")

Seguimos con los pasos. Copiamos el Token, que luego lo utilizaremos en GitHub.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707408971598/440b2ce2-a79d-4da3-98b7-1710e6f41456.jpeg align="center")

Este es el YAML para crear el "Actions" que formara parate del Workflow.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707408994533/3c7992db-36d8-45ba-9fdf-6d1d8004eb8d.png align="center")

Sera necesario crear el archivo de propiedades.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707409016255/b39900af-c981-490b-bbc3-40858b9d321b.png align="center")

Luego de haber realizado el push, podremos revisar la calidad del codigo y las sugerencias de seguridad que arrojo en Analisis SAST en [sonarcloud.io](http://sonarcloud.io/).

En la documentación del [GitHub Actions](https://github.com/SonarSource/sonarcloud-github-action) se pueden encontrar como manejar los umbrales para rechazar el deploy, en base a lo que configuremos.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707409212152/8f349809-60cc-423f-8551-f2af71f7c494.jpeg align="center")

Cargamos el Token, que habiamos copiado.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707409283549/8b652dd1-1679-4ac8-9e66-5e539c2b185b.png align="center")

## Detect Secrets

Vamos agregar este código a nuestro YAML. Estan son algunas de las cosas que estará revisando:

  
· AWSKeyDetector  
· ArtifactoryDetector  
· Base64HighEntropyString  
· BasicAuthDetector  
· HexHighEntropyString  
· JwtTokenDetector  
· KeywordDetector  
· MailchimpDetector  
· PrivateKeyDetector  
· SlackDetector  
· SoftlayerDetector  
· StripeDetector

```plaintext
    ##########################
    #     Detect Secrets     #
    ##########################
    - name: Detect Secrets
      uses: evanextreme/detect-secrets-action@1.0.0
```

Esta es una buena manera de revisar si se filtra algún acceso.

## Análisis de Imagen Docker

Muy importante, revisar nuestras imagen de Docker. Para ello utilizaremos [Trivy](https://github.com/aquasecurity/trivy-action) de AquaSec. ¡Vamos agregar el código al YAML!

```yaml
    ##########################
    #       Trivy Scan       #
    ##########################
    - name: Run Trivy vulnerability scanner
      uses: aquasecurity/trivy-action@master
      with:
        image-ref: 'docker.io/safernandez666/okteto:${{ github.sha }}'
        format: 'template'
        template: '@/contrib/sarif.tpl'
        output: 'trivy-results.sarif'

    - name: Upload Trivy scan results to GitHub Security tab
      uses: github/codeql-action/upload-sarif@v1
      with:
        sarif_file: 'trivy-results.sarif'
```

Si miran el segundo Step la salida se sube al Tab de GitHub. Es ahi donde revisaremos los resultados.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707409493997/ab1d3e59-82a1-42c9-b1af-93879ced7d60.jpeg align="center")

## DAST con OWASP ZAP Scan

Vamos agregar el Análisis DAST. Es importante apuntar al EndPoint del Deployment. En nuestro caso el Kubernetes en Okteto.

```yaml
    ##########################
    #      DAST Analisys     #
    ##########################
    - name: ZAP Scan
      uses: zaproxy/action-baseline@v0.4.0
      with:
        target: 'https://flaskapp-deployment-safernandez666.cloud.okteto.net/'
```

Los resultados, segun las configuraciones que hagamos, van a salir en la salida del Push o tambien via Email si hemos configurado el Dependanbot Alert.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707409549669/7f03746e-74d8-4c1e-98c1-8ea8c8b46a80.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1707409567536/7b49016d-75cf-4dac-8af0-e1b8739b21cd.png align="center")

Creo que estos cuatro controles nos dan un baseline de seguridad apropiado. Podemos agregar Linter o revisar los YAML's de los manifiestos de Kubernetes. Deberán ustedes generar los umbrales para truncar o no el despliegue.

¡Espero les sirva!

Les dejo el [link](https://github.com/safernandez666/Okteto) del proyecto.
