Skip to content

Tema:

Análisis de código de aplicaciones.


Introducción

En esta guía aprenderemos a realizar analisis de codigo de manera manual con la herramientas sonarqube que fue instalada anteriormente.

Objetivo

Objetivo General:

  • El objetivo de la practica es realizar analisis de codigo de un aplicativo utilizando la herramienta de sonarqube.

Desarrollo del tema

Para poder asegurar que se están siguiendo las mejores prácticas en el desarrollo, debemos de aplicar algún tipo de escaner contra el código escrito, de forma que podamos tener información sobre qué tan expuestos estamos a ataques, cantidad de bugs detectados, entre otras métricas. Para ello es común utilizar SonarQube dado su nivel de madurez y amplia base de datos que utiliza para realizar el análisis de nuetro código.

Laboratorio: Análisis de código de aplicaciones

Descripción

La presente guía aborda la automatización de la fase de análisis de la aplicación.

Objetivos

  • Ejecutar el análisis de código desde comandos
  • Visualizar el resultado desde la interfaz de SonarQube

Antes de comenzar

  • Contar con el acceso al ambiente del laboratorio.

Acceder al laboratorio.

  1. Ingresar al servidor de laboratorio con la llave proporcionada.

    export LAB=X
    ssh student@lab-${LAB}-aio 
    

  2. Cambiar al usuario root

    sudo -i
    

  3. Proporcione accesos administrativos al cluster de Kubernetes

    export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
    
    export PATH=$PATH:/var/lib/rancher/rke2/bin
    
    export CONTAINERD_ADDRESS=/run/k3s/containerd/containerd.sock
    

Inicio de laboratorio

Obtener token de sonar.

Ingresar a su instancia de sonar con la clave anteriormente seteada.

http://sonar.x.x.x.x.nip.io/
Ir a la parte de My account y dentro de la misma en security.

Generar un token de tipo global analysis token y guardar el valor. Setearlo como variable de entorno.

SONAR_TOKEN=<TOKEN>
  1. Ingrese a la carpeta testing

    cd testing
    

  2. Reemplace el contenido de settings.xml con el siguiente contenido

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <settings>
        <pluginGroups>
            <pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
        </pluginGroups>
        <profiles>
            <profile>
                <id>sonar</id>
                <activation>
                    <activeByDefault>true</activeByDefault>
                </activation>
                <properties>
                    <!-- Cambiar x.x.x.x.nip.io por el dominio correcto -->
                    <sonar.host.url>
                      http://sonar.x.x.x.x.nip.io/
                    </sonar.host.url>
                </properties>
            </profile>
         </profiles>
    </settings>
    

  3. Corra un contenedor con una terminal activa y un volumen montando la carpeta actual

    nerdctl run -it --rm -e SONAR_TOKEN=$SONAR_TOKEN -v $PWD:/usr/src/app maven:3.8.5-openjdk-18 bash
    

  4. Acceda a la carpeta de la aplicación

    cd /usr/src/app
    

  5. Ejecute el análisis con maven y dando el parametro de sonar.login=token

    mvn -s settings.xml verify sonar:sonar -Dmaven.repo.local=$PWD/.m2/repository -DskipTests -Dsonar.login=token
    exit
    

  6. Revisar en el portal de SonarQube un nuevo proyecto con el resultado del analisis

  7. Revisar los resultados del análisis realizado

  8. Cree un script llamado analyze.sh con el siguiente contenido

    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    
    cd /usr/src/app
    echo $PWD
    
    mvn -s settings.xml verify sonar:sonar -Dmaven.repo.local=$PWD/.m2/repository -DskipTests -Dsonar.login=token
    
    exit
    

  9. Asigne permisos de ejecución al archivo

    chmod +x ./analyze.sh
    

  10. Corra el script desde el contenedor

    nerdctl run -it --rm -e SONAR_TOKEN=$SONAR_TOKEN -v $PWD:/usr/src/app maven:3.8.5-openjdk-18 /usr/src/app/analyze.sh
    

  11. Revisar en el portal de SonarQube el proyecto getting-started-testing

  12. Revisar los resultados del análisis realizado

  13. Editar el script reemplazando los parametros de maven por $MVN_ARGS

    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    
    cd /usr/src/app
    echo $PWD
    
    mvn -s settings.xml verify sonar:sonar $MVN_ARGS
    
    exit
    

  14. Editar el script agregando un ping de test al servidor de SonarQube como condicional

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    #!/bin/bash
    
    cd /usr/src/app
    echo $PWD
    
    if [[ $(curl -Ss http://${SONAR_URL}) ]]; then
        mvn -s settings.xml verify sonar:sonar $MVN_ARGS
    else
        echo "[ERROR] No hay conexion hacia el servidor de SonarQube"
    fi
    
    exit
    

  15. Corra el script desde el contenedor

    # Cambiar x.x.x.x.nip.io por el dominio correcto
    # Cambiar token por el valor obtenido desde el portal de SonarQube
    nerdctl run -it --rm -v $PWD:/usr/src/app \
    -e SONAR_URL="sonar.x.x.x.x.nip.io" \
    -e SONAR_TOKEN=$SONAR_TOKEN \
    -e MVN_ARGS="-Dmaven.repo.local=/usr/src/app/.m2/repository -DskipTests -Dsonar.login=token" \
    maven:3.8.5-openjdk-18 /usr/src/app/analyze.sh
    

  16. Revisar en el portal de SonarQube el proyecto getting-started-testing

  17. Revisar los resultados del análisis realizado

  18. Borrar todo el contenido del archivo src/main/java/org/acme/getting/started/testing/GreetingResource.java y reemplazarlo con el siguiente

    package org.acme.getting.started.testing;
    
    import javax.inject.Inject;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    
    @Path("/hello")
    public class GreetingResource {
    
        public String publicMessage = "Hello Quarkus!";
    
    
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        @Path("/greeting/{name}")
        public String greeting(String unusedName) {
            return "Greetings from SonarQube Test";
        }
    
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String hello() {
            return "hello";
        }
    
        public void doNothing() {
        }
    }
    

  19. Corra el script desde el contenedor , ahora deberiamos de ver muchos mas problemas en sonarqube

    # Cambiar x.x.x.x.nip.io por el dominio correcto
    # Cambiar token por el valor obtenido desde el portal de SonarQube
    nerdctl  run -it --rm -v $PWD:/usr/src/app \
    -e SONAR_URL="sonarqube.x.x.x.x.nip.io" -e SONAR_TOKEN=$SONAR_TOKEN \
    -e MVN_ARGS="-Dmaven.repo.local=/usr/src/app/.m2/repository -DskipTests -Dsonar.login=token" \
    maven:3.8.5-openjdk-18 /usr/src/app/analyze.sh
    

  20. Revisar en el portal de SonarQube el proyecto getting-started-testing

  21. Revisar los resultados del análisis realizado en la pestaña New Code

policy.csv: |+ p, argo-ci, applications, , /, allow p, argo-ci, clusters, get, /, allow p, argo-ci, clusters, update, , allow p, argo-ci, projects, , , allow p, argo-ci, repositories, , , allow