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.

Servicios de Administración de Sistemas WordPress

¿Tienes un sitio web con WordPress de alto tráfico? ¿Eres una Agencia con servidores con cPanel, Plesk u otro panel en los que mantienes WordPress para tus clientes?

Si es así y te interesa un servicio profesional de mantenimiento de infraestructura WordPress y de mejora del rendimiento de tus sitios web o los de tus clientes, contacta conmigo.

Deja un comentario