Sonar sous Apache

De EjnTricks

Cet article présente la configuration mise en place sur un serveur Apache pour une instance de Sonar.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Icon-Configuration-Settings.png Déploiement site sécurisé

La procédure décrite ci dessous permet de mettre à disposition l'application avec un accès sécurisé HTTPS avec utilisation d'un certificat fourni par Let's Encrypt et un tutoriel très bien réalisé.

L'application sera rendue disponible depuis un sous domaine du domaine principal. Afin de faciliter les configurations, il est important de ne pas déclarer de contexte d'exécution, ce qui s'effectue dans le fichier /var/opt/sonarqube/common/conf/sonar.properties, dans le paramètre sonar.web.context.

# Web context. When set, it must start with forward slash (for example /sonarqube).
# The default value is root context (empty value).
sonar.web.context=
#sonar.web.context=/sonar

Pour rappel, l'application est exécutée en service et est disponible sur le port 9000.

System-Install-icon.png Préparation environnement

Certbot sera utilisé pour demander et renouveler le certificat du site. Dans son fonctionnement, le process essaye d'accéder à un .well-known à la racine du site. De plus, une bonne pratique consiste à fournir un répertoire racine pour les sites déployés sous Apache. Le répertoire /var/www/sonar est alors créé, ainsi que le sous répertoire .well-known.

#sudo mkdir -p /var/www/sonar/.well-known

Pour cette application, il n'est pas nécessaire de placer un fichier index.html, avec un contenu vide, dans le répertoire racine, soit /var/www/sonar, car la racine sera sur l'instance qui possède déjà un fichier index.html.

De plus, aucun fichier robots.txt n'est mis en placé, car l'application Sonar en dispose d'un.

Les permissions mises en place donnent un accès uniquement aux compte du serveur, soit www-data.

#sudo find /var/www/sonar -type f -exec chmod 0600 {} \;
#sudo find /var/www/sonar -type d -exec chmod 0700 {} \;
#sudo chown -R www-data:www-data /var/www/sonar

Pour les besoins de personnalisation de Sonar, des images et des CSS sont mises à dispositions depuis une URL du type /sitesExtensions. Ce répertoire est créé dans le répertoire racine /var/www/sonar et la configuration Apache permettra d'y accéder.

Configuration-icon.png Configuration HTTP

Dans un premier temps, une configuration temporaire est mise en place pour accéder de façon non sécurisé. Un fichier sonar est créé dans le répertoire /etc/apache2/sites-available avec le contenu suivant.

<VirtualHost *:80>
    ServerAdmin contact-email@dummy.net
    ServerName www.sonar.dummy.net
    DocumentRoot /var/www/sonar
    DirectoryIndex index.html

    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/sonar_error.log
    CustomLog ${APACHE_LOG_DIR}/sonar_access.log combined

    <Directory "/var/www/sonar">
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ProxyPass /.well-known !
    ProxyPassReverse /.well-known !
    ProxyPass /sitesExtensions !
    ProxyPassReverse /sitesExtensions !
    ProxyPass /robots.txt !
    ProxyPassReverse /robots.txt !

    ProxyPass / http://localhost:9000/
    ProxyPassReverse / http://localhost:9000/
</VirtualHost>

Les directives sur l'accès à /.well-known, robots.txt et sitesExtensions permettent de servir les éléments depuis la racine /var/www/sonar.

Cette configuration doit être mise à disposition en plaçant un lien dans /etc/apache2/sites-enabled.

#sudo ln -s /etc/apache2/sites-available/sonar /etc/apache2/sites-enabled/008-sonar.conf

Le nom du lien, à savoir 008-sonar.conf, respecte une incrémentation sur la machine utilisée, il peut être remplacé pour tout autre nom valide pour Apache.

Il suffit de relancer la configuration d'Apache pour qu'elle soit prise en compte.

#sudo apache2ctl graceful

Certificate Server icon.png Certificat

L'application est à présent disponible avec l'URL http://www.sonar.dummy.net. Un certificat va être demandé à l'aide de Certbot.

#sudo certbot certonly --webroot -w /var/www/sonar -d www.sonar.dummy.net --email contact-email@dummy.net
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for www.sonar.dummy.net
Using the webroot path /var/www/sonar for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/www.sonar.dummy.net/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/www.sonar.dummy.net/privkey.pem
   Your cert will expire on 2018-05-17. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Le certificat est stocké dans le répertoire /etc/letsencrypt/live/www.sonar.dummy.net/.

Lock-icon.png Configuration HTTPS

Le certificat étant disponible, la configuration HTTPS peut être mise en place. Un fichier sonar-dummy-ssl est créé dans le répertoire /etc/apache2/sites-available avec le contenu suivant.

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerAdmin contact-email@dummy.net
    ServerName www.sonar.dummy.net
    DocumentRoot /var/www/sonar
    DirectoryIndex index.html

    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/sonar_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/sonar_ssl_access.log combined

    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

    SSLEngine on
    SSLCertificateFile         /etc/letsencrypt/live/www.sonar.dummy.net/cert.pem
    SSLCertificateKeyFile      /etc/letsencrypt/live/www.sonar.dummy.net/privkey.pem
    SSLCertificateChainFile    /etc/letsencrypt/live/www.sonar.dummy.net/chain.pem
    SSLProtocol all -SSLv2 -SSLv3
    SSLHonorCipherOrder on
    SSLCompression off
    SSLOptions +StrictRequire
    SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

    <Directory "/var/www/sonar">
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    ProxyPass /.well-known !
    ProxyPassReverse /.well-known !
    ProxyPass /sitesExtensions !
    ProxyPassReverse /sitesExtensions !
    ProxyPass /robots.txt !
    ProxyPassReverse /robots.txt !
    
    ProxyPass / http://localhost:9000/
    ProxyPassReverse / http://localhost:9000/
    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-Port "443"
</VirtualHost>
</IfModule>

A noter les deux directives RequestHeader pour X-Forwarded-Proto et X-Forwarded-Port. Ceci fait suite à la recommandation de la procédure officielle : https://docs.sonarqube.org/display/SONAR/Securing+the+Server+Behind+a+Proxy, ainsi que des exemples pour d'autres applications.

Cette configuration doit être mise à disposition en plaçant un lien dans /etc/apache2/sites-enabled.

#sudo ln -s /etc/apache2/sites-available/sonar-dummy-ssl /etc/apache2/sites-enabled/009-sonar-ssl.conf

Le nom du lien, à savoir 009-sonar-ssl.conf, respecte une incrémentation sur la machine utilisée, il peut être remplacé pour tout autre nom valide pour Apache.

Enfin la configuration HTTP, sur le port 80, est modifiée pour forcer la redirection sur l'accès en HTTPS. Le précédent fichier sonar est modifié avec le contenu suivant.

<VirtualHost *:80>
    ServerAdmin contact-email@dummy.net
    ServerName www.sonar.dummy.net
    DocumentRoot /var/www/sonar
    DirectoryIndex index.html

    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/sonar_error.log
    CustomLog ${APACHE_LOG_DIR}/sonar_access.log combined

    RewriteEngine on
    RewriteCond %{HTTPS} !on
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>

Il suffit de relancer la configuration d'Apache pour que les modifications soient prises en compte.

#sudo apache2ctl graceful

Viewer icon.png Voir aussi

Documentation officielle: https://docs.sonarqube.org/display/SONAR/Securing+the+Server+Behind+a+Proxy


Warning-icon.png Configuration simple

La première configuration mise en place a été réalisée sur un serveur Apache simple, à savoir qu'il était utilisé pour un seul site. Dans ce cas, et pour une installation sous Ubuntu, les paramètres ont été mis en place dans le fichier /etc/apache2/httpd.conf.

ProxyPass /sonar http://localhost:8080/sonar
ProxyPassReverse /sonar http://localhost:8080/sonar

<Proxy http://localhost:8080/sonar>
  Order allow,deny
  Allow from all
</Proxy>

Dans ce cas, toutes requêtes sur /sonar seront redirigées vers l'application Sonar hébergée sur un Tomcat en local.

Configuration-icon.png Configuration pour un domaine spécifique

Au fil du temps, le serveur Apache a été enrichi sur la machine, afin de servir différents domaine. La première configuration mise en place rendait l'application disponible sur l'ensemble des domaines, chose qui n'était pas souhaitée. La configuration dans le fichier /etc/apache2/httpd.conf a été déplaçée dans le fichier de configuration du domaine souhaité, à savoir /etc/apache2/sites-enabled/002-dev.conf, pour le domaine dev.dummy.net

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName www.sonar.dummy.net

        DocumentRoot /var/www/default
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/default>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                # Old configuration for APACHE 2.2
                # Order allow,deny
                # allow from all
                Require all granted
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                # Old configuration for APACHE 2.2
                # Order allow,deny
                # Allow from all
                Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

        ProxyPass /sonar http://localhost:8080/sonar
        ProxyPassReverse /sonar http://localhost:8080/sonar
        <Proxy http://localhost:8080/sonar>
                Order allow,deny
                Allow from all
        </Proxy>

</VirtualHost>

Ainsi l'application Sonar ne sera disponible que pour ce domaine.

Update icon.png SonarQube en service

Suite à l'installation de la version 4.4, où la construction de war est abandonnée, l'application est démarré dans son propre contexte. N'étant plus sous Tomcat, la configuration Apache doit être modifiée. Par défaut, le numéro de port est 9000.

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName www.sonar.dummy.net

        DocumentRoot /var/www/default
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/default>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                # Old configuration for APACHE 2.2
                # Order allow,deny
                # allow from all
                Require all granted
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                # Old configuration for APACHE 2.2
                # Order allow,deny
                # Allow from all
                Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

        ProxyPass /sonar http://localhost:9000/sonar
        ProxyPassReverse /sonar http://localhost:9000/sonar
        <Proxy http://localhost:9000/sonar>
                Order allow,deny
                Allow from all
        </Proxy>

</VirtualHost>

Attention, il est nécessaire de spécifier le contexte d'exécution pour SonarQube en modifiant la variable sonar.web.context dans le fichier de configuration sonar.properties, comme explicité lors de son installation. Dans cet exemple, le lien mis en place est du type http://SERVEUR/sonar, le contexte doit être sonar.


Pour le premier cas présenté dans cet article, la configuration devient la suivante.

ProxyPass /sonar http://localhost:9000/sonar
ProxyPassReverse /sonar http://localhost:9000/sonar

<Proxy http://localhost:9000/sonar>
  Order allow,deny
  Allow from all
</Proxy>


Warning-icon.png Version 5.4

Lors de la sortie de la version 5.4, installation en service, le paramètre sonar.web.context a été supprimé de la configuration. Il n'est donc plus possible de spécifier un contexte root pour l'application. Ceci peut être problématique lorsque l'application est déployée dans le même domaine que d'autres applications, mais la configuration Apache doit être revue ainsi.

ProxyPass / http://localhost:9000/
ProxyPassReverse / http://localhost:9000/

<Proxy http://localhost:9000/>
  Order allow,deny
  Allow from all
</Proxy>

A noter qu'un retour arrière est prévu pour la version suivante.