SonarQube: analiza la calidad de tu plugin o theme

Aunque WordPress tiene sus guías de seguridad para plugins y themes, con sus propias funciones, muchas veces entre tanto código puedes perderte. Y ahí entra SonarQube.

SonarQube es una herramienta que analiza la calidad del código y su seguridad y que puede ser una herramienta muy útil para mejorar ese plugin que quizá has hecho sin mucho control y que, antes de ponerse en producción, puedes mejorar ligeramente.

SonarQube como tal es una plataforma en la que poder integrar todos los proyectos que quieras y que tiene unos requisitos bastante diferentes a los de WordPress, por lo que es más que recomendable disponer de un sistema completamente independiente de otros.

Ten en cuenta que funciona con Java, PostgreSQL y nginx.

Configuración del Servidor

Para poder instalar y gestionar correctamente SonarQube montaremos una máquina del al menos 1 CPU y 2 GB de RAM, con al menos 10 GB de disco. En este ejemplo usaremos Ubuntu 20.

Este tutorial ha sido creado en un VPS de Clouding.io. Puedes crear tu propio VPS desde 3€/mes.

Además, tienes la posibilidad de crear tu VPS con la imagen de WordPress en un clic.

COLABORACIÓN

Comenzaremos con la puesta en hora del servidor.

timedatectl set-timezone 'UTC'
timedatectl set-ntp on

Y haremos una actualización de todo el servidor.

lsb_release -a
apt -y update && apt -y upgrade && apt -y dist-upgrade && apt -y autoremove

Posteriormente instalaremos algunas herramientas útiles.

apt -y install software-properties-common curl vim zip unzip apt-transport-https

Y finalmente dejaremos el sistema para que aplique actualizaciones de seguridad automáticamente.

apt -y install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

Instalando Java

Para que funcione necesitaremos Java 11, así que optaremos por OpenJDK.

apt -y install openjdk-11-jdk openjdk-11-jre

Podemos comprobar que está instalado para ver su versión.

java -version

Que nos devolverá un mensaje similar a:

openjdk version "11.0.10" 2021-01-19
OpenJDK Runtime Environment (build 11.0.10+9-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.10+9-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)

Instalando PortgreSQL

Descargaremos las claves.

cd
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list

Instalamos PostgreSQL

apt -y update
apt -y install postgresql-12 postgresql-client-12

Configuraremos el sistema para que active el servidor cuando se inicie la máquina.

systemctl enable postgresql.service
systemctl restart postgresql.service
systemctl status postgresql.service

Vamos a configurar la contraseña del servicio como root, y crear una base de datos para su uso posterior.

su - postgres
psql -c "alter user postgres with password 'contraseña_de_root'"
psql

Y creamos la base de datos, con su usuario y contraseña.

CREATE DATABASE sonarqube;
CREATE USER sonarqube WITH ENCRYPTED PASSWORD 'contraseña_de_sonarqube';
GRANT ALL PRIVILEGES ON DATABASE sonarqube TO sonarqube;

Instalando fuentes

Configuraremos el sistema de fuentes y tipografía para el servicio.

apt -y install fontconfig-config libfreetype6

Instalando SonarQube

Visitaremos el sitio web con la lista de descargas y buscaremos el enlace a la última versión. En este caso usaremos la versión 8.8.

cd
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.8.0.42792.zip

Descomprimimos el fichero.

unzip sonarqube-8.8.0.42792.zip
rm sonarqube-8.8.0.42792.zip

Y dejamos el software en la carpeta de uso.

mv ./sonarqube-8.8.0.42792/ /opt/sonarqube/
cd /opt/sonarqube/

Allí configuraremos los datos de acceso a la base de datos.

vim /opt/sonarqube/conf/sonar.properties

Y modificamos las líneas de configuración (por defecto están com,entadas).

sonar.jdbc.username=sonarqube
sonar.jdbc.password=contraseña_de_sonarqube
sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube

Para acabar crearemos un usuario de ejecución del software.

useradd -M -d /opt/sonarqube/ -r -s /bin/bash sonarqube
chown -R sonarqube: /opt/sonarqube

Para ejecutarlo, lo crearemos en modo servicio. De esta forma, cuando se arranque la máquina se ejecutará automáticamente.

vim /etc/systemd/system/sonarqube.service

En el fichero incluiremos el arranque del sistema.

[Unit]
Description=SonarQube service
After=syslog.target network.target

[Service]
Type=simple
User=sonarqube
Group=sonarqube
PermissionsStartOnly=true
ExecStart=/bin/nohup java -Xms32m -Xmx32m -Djava.net.preferIPv4Stack=true -jar /opt/sonarqube/lib/sonar-application-8.8.0.42792.jar
StandardOutput=syslog
LimitNOFILE=131072
LimitNPROC=8192
TimeoutStartSec=5
Restart=always
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

IMPORTANTE: deberemos ajustar el fichero de la versión correspondiente al sistema que tengamos en la línea de ExecStart.

ll /opt/sonarqube/lib/

Ahí debemos encontrar un fichero llamado sonar-application-8.8.0.42792.jar, que habrá que ajustar según la versión descargada.

Le diremos al sistema que encuentre esta nueva configuración.

systemctl daemon-reload

Antes de lanzarlo modificaremos la configuración del sistema.

echo 'vm.max_map_count=262144' >> /etc/sysctl.conf

Ahora sí, cargaremos el sistema y lo validamos.

systemctl enable --now sonarqube
systemctl status sonarqube.service

Podemos validar que hay ficheros de logs.

ll /opt/sonarqube/logs

Instalando nginx

Instalaremos un nginx.

apt -y install nginx

Y, para un funcionamiento sencillo, lo lanzaremos sin HTTPS (se puede configurar, pero para este ejemplo no sería necesario).

vim /etc/nginx/sites-available/sonarqube

Y cargamos la configuración.

server {
  listen 80;
  server_name sonarqube.example.com;

  access_log  /var/log/nginx/sonarqube.access.log;
  error_log   /var/log/nginx/sonarqube.error.log;

  proxy_buffers 16 64k;
  proxy_buffer_size 128k;

  location / {
    proxy_pass  http://127.0.0.1:9000;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_redirect off;

    proxy_set_header    Host            $host;
    proxy_set_header    X-Real-IP       $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto http;
  }
}

Para evitar problemas, sí que configuraremos de forma algo más óptima el propio nginx.

cd /etc/nginx/
rm nginx.conf
vim nginx.conf

Y le añadiremos nuestra configuración personalizada.

user www-data;
pid /run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 65535;
include /etc/nginx/modules-enabled/*.conf;
events {
  multi_accept on;
  worker_connections 65535;
  use epoll;
}
http {
  charset utf-8;
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  server_tokens off;
  more_clear_headers Server;
  log_not_found off;
  types_hash_max_size 2048;
  client_max_body_size 64m;
  keepalive_timeout 10;
  server_names_hash_bucket_size 128;
  server_names_hash_max_size 1024;
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  # logging
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;
  # TLS
  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_prefer_server_ciphers on;
  # gzip
  gzip on;
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 9;
  gzip_disable "msie6";
  gzip_buffers 16 8k;
  gzip_min_length 1100;
  gzip_types application/atom+xml application/javascript application/json application/x-javascript application/xml application/xml+rss image/svg+xml text/css text/javascript text/plain text/xml;
  # more
  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
}

Validaremos la configuración y reiniciamos nginx.

ln -s /etc/nginx/sites-available/sonarqube /etc/nginx/sites-enabled/
nginx -t
systemctl restart nginx

Y ya tenemos todo listo para comenzar a funcionar.

Visitaremos la URL de nuestro sitio, http://sonarqube.example.com/, y accederemos, la primera vez, con el usuario admin y contraseña admin.

Creando un proyecto

Aunque no es la intención de este tutorial explicar el funcionamiento de SonarQube y todas sus opciones, sí que haremos un repaso rápido a cómo se puede analizar un plugin.

Lo primero será crear un proyecto. Este nos da unas instrucciones a seguir. En este caso vamos a usar la versión para Linux.

Podemos encontrar la última versión del CLI para descargar. En este caso vamos a usar la versión 4.6 para Linux.

La vamos a descargar y descomprimir.

cd
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.0.2311-linux.zip
unzip sonar-scanner-cli-4.6.0.2311-linux.zip
mv sonar-scanner-4.6.0.2311-linux/ sonar-scanner/

Accederemos a la carpeta del plugin que queremos analizar y crearemos un fichero de configuración.

cd /webs/example.com/wp-content/plugins/minimal-analytics/
vim sonar-project.properties

E incorporaremos algunos datos, que vienen de lo que hemos configurado en el panel.

sonar.projectKey=minimal-analytics
sonar.projectName=Minimal Analytics
sonar.projectVersion=1.1.5
sonar.sources=.
sonar.sourceEncoding=UTF-8
sonar.host.url=http://sonarqube.example.com
sonar.login=3eef5cddf118a2dc967e8f8995d4d2bc0c758d2b

Y ejecutaremos el escáner.

/root/sonar-scanner/bin/sonar-scanner

Al finalizar la ejecución podremos volver al panel y veremos los resultados.

Y, a partir de aquí ¡a mejorar tu código y seguridad!

Y, por cierto, si usas Github o alguna herramienta similar, te será muy sencilla la integración.


Sobre este documento

Este documento está regulado por la licencia EUPL v1.2, publicado en WP SysAdmin y creado por Javier Casares. Por favor, si utilizas este contenido en tu sitio web, tu presentación o cualquier material que distribuyas, recuerda hacer una mención a este sitio o a su autor, y teniendo que poner el material que crees bajo licencia EUPL.