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.