Table of Contents

Configuration NGINX et la navigation cryptée en mode HTTPS (OpenSSL)

Le but des instructions suivantes est de pouvoir configurer les sites web disponibles sur le serveur afin que la navigation par les clients se fasse en mode SSL ou autrement dit par accès en HTTPS. On verra que cela nécessite d'obtenir un certificat public et de configurer le serveur NGINX de telle sorte qu'il utilise ces certificats. Il faut prévoir un certificat par site du domaine et que chaque sous domaine soit déclaré en adresse de classe C afin d'obtenir un certificat pour chaque. Nous utiliserons les certificats gratuits donnés par Let's Encrypt Mais dans le cas de l'u-psud, il faudra faire une demande auprès du SI.

Definition de NGINX

NGINX est un serveur web comme le célèbre Apache. Il intègre toutes les fonctions de base et suffira à l'essentiel des utilisateurs. Il est présent sous forme de package pour la plateforme Ubuntu et Debian. J'ai choisi NGINX en raison de la facilité par rapport à Apache pour configurer l'utilisation des certificats et donc la mise en place de la navigation https.

Installation de NGINX

Pour une installation simple et essentielle, le package de base suffira:

sudo apt-get install nginx

Pour une installation complète et comprenant de nombreux modules pour interagir avec le serveur et les données à traiter, faites:
sudo apt-get install nginx-full

J'ai installé sur digicloud la version simple et jusqu'ici ça suffit.

Après cette installation vous pouvez effectuer l'affichage d'un site web statique. vous devriez le voir à l'adresse

http://server_domain_name_or_IP

Les fichiers de configurations se trouvent dans /etc/nginx/sites-available/ pour la configuration des sites. Pour activer les sites vous pourrez faire un lien vers /etc/nginx/sites-enabled, ce qui est similaire à la configuration de Apache. Typiquement un fichier de sites digicloud est :

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /var/www/digiwiki;
    index index.html index.htm;

    server_name digicloud digicloud.c2n.u-psud.fr;

    location / {
        try_files $uri $uri/ =404;
    }
}

Documentation version 2.0

Using Sphinx

pip install sphinx
mkdir Doc_DigiCleaR
cd Doc_DigiCleaR/
sphinx-quickstart 
make html

Using a nice theme for sphinx

Her e is a proposition to use a nice theme in sphinx : theme from Read-The-Docs https://about.readthedocs.com/

here is the theme : https://github.com/readthedocs/sphinx_rtd_theme

pip install sphinx-rtd-theme

To use the theme in your Sphinx project, you will need to edit your conf.py file's html_theme setting:

html_theme = "sphinx_rtd_theme"

And then use the basic commande make to create the html pages under the _build directory

make html

Installation php / MySQL

Mais la plupart du temps vous voudrez utiliser du code dynamique comme par exemple du php. A partir de la version 18.04 des Ubuntu Server il est possible d'installer simplement la version 7.2 de PhP. Il me semble intéressant de franchir le pas si vous n'avez pas d'impératif de rester en 5.6.

Nous installons donc le php5 et aussi un serveur MySQL qui est souvent utilisé pour gérer les bases de données. mais aussi un module pour interagir avec le serveur NGINX et nous choisirons php5-fpm. les modules entre php et mysql doivent également être installés. au moment où j'écris ces lignes l'installation du serveur php et de MySQL ont déjà été faites il y a plusieurs années. Il manque donc probablement des instructions de configuration:

MySQL Server

sudo apt-get install mysql-server
sudo mysql_install_db
sudo mysql_secure_installation
Après l'exécution de ces instructions vous avez installé le serveur MySQL et les dossiers pour accueillir les futures bases de données. Le deuxième script exécute des corrections liées à la sécurité de votre installation. Notez bien les login et mots de passe, ils sont indispensables pour la configuration de vos futures sites…

Configurer MySQL et créer une base de données



PHP 7.2 et modules complémentaires

Maintenant on installe le parser php7.2

sudo apt-get install php7.2 php7.2-mysql php7.2-bz2 php7.2-zip php7.2-sqlite3 php7.2-*
php7.2-fpm est un outils d'interaction avec le noyau de php7.2. C'est l'interface vers lequel NGINX enverra les requêtes php. Il faut ensuite éditer avec votre éditeur favori le fichier de configuration de php7.2-fpm
sudo joe /etc/php/7.2/fpm/php.ini
sudo service php7.2-fpm restart
Rappel: sous joe, utilisez Ctrl^K^F pour trouver une chaine de caractère puis Ctrl^L pour trouver la suivante. La recherche se fait à partir de la position du curseur (Ctrl^K^U = top of the file). Il faut ecrire cgi.fix_pathinfo=0 en enlevant le ; devant la ligne (uncomment it).


Maintenant on pourra envoyer des requêtes php vers unix:/var/run/php7.2-fpm.sock.
Nous pouvons donc modifier le fichier de configuration de NGINX pour que le serveur puisse processer les requêtes php. Par exemple le fichier suivant toujours pour des sites de type esoa.fr:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /WebData/esoa;
    index index.php index.html index.htm;

    server_name esoa.fr www.esoa.fr *.esoa.fr;

    location / {
        try_files $uri $uri/ =404;
    }

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php7.2-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Défintion des clés de chiffrement et utilisation par NGINX

Précautions avant de commencer

Avant de commencer le processus de sécurisation par cryptage à l'aide des clés publiques de Let's Encrypt, il est impératif que votre site soit déjà accessible avec une adresse IP publique et un nom de classe CNAME redirigé vers votre adresse IP. Il faut que vous puissiez accéder au site sans mot de passe ni erreur, ni redirection.
Ensuite il est impératif de commencer en créant la clé puis de l'utiliser en configurant votre serveur.

définition des clés

https://certbot.eff.org/#ubuntuxenial-nginx

Attention, vous pourriez avoir des conflits de version lors des mises à jour de certbot. Et plus particulièrement après avoir une commande comme dist-upgrade

Dans ce cas il y a un message du style:

Error: couldn't get currently installed version for /home/steval/.local/share/letsencrypt/bin/letsencrypt:

Si ce code apparaît, il faut effacer les fichiers incriminés:

$ rm .local/share/letsencrypt/ -R
$ sudo rm /root/.local/share/letsencrypt/ -R
Ensuite après avoir fait un update de la version de certbot (dernière instruction uniquement si première installation):
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo update   
$ sudo apt-get install python-certbot-nginx
NB : la ligne sudo update utilise le script décrit ici.

Ensuite Effectuez la mise à jour des certificats:
$ sudo -H  certbot-auto renew
NB : option -H pour que l'action se fasse en tant que root (see man sudo).
-H' The -H (HOME) option requests that the security policy set the HOME environment variable to the home directory of the target user (root by default) as specified by the password database. Depending on the policy, this may be the default behavior.

Configuration des blocks server de NGINX

Les blocks servers de Nginx doivent être rédigés dans des fichiers séparés comme autant de sous-site d'un domaine. Ceci est beaucoup plus clair pour la maintenance.

Cas particulier de dokuwiki

Le cas particulier de dokuwiki n'est pas clair pour moi, mais il y quelques petites différence par rapport à la définition standard pour le processeur php, sans que je ne trouve d'explication. Je ne comprends pas la signification de chaque signe utilisé.

server {
    listen               80;
    server_name          digiwiki digiwiki.c2n.u-psud.fr;
#    return 301 https://www.google.fr;
#    if ($scheme = http) {
#	    return	301 https://$server_name$request_uri;
#	}

 
#server {
#    listen [::]:443 ssl;
#    listen 443 ssl;

#    ssl_certificate /etc/nginx/ssl/nginx.crt;
#    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    # Maximum file upload size is 4MB - change accordingly if needed                                                                                           
    client_max_body_size 4M;
    client_body_buffer_size 128k;
 
    root /var/www/digiwiki/;
    index doku.php index.html index.htm index.php;
    
    #Remember to comment the below out when you're installing, and uncomment it when done.
    location ~ /(data/|conf/|bin/|inc/|install.php) { deny all; }

#   Uncomment this prevents images being displayed ! 
#    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
#        expires 31536000s;
#        add_header Pragma "public";
#        add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
#        log_not_found off;
#    }
 
    location / { try_files $uri $uri/ @dokuwiki; }

    location ~ ^/lib/plugins/davcal/ics.php/(.*)$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param REDIRECT_STATUS 200;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    }
 
    location @dokuwiki {
        rewrite ^/_media/(.*) /lib/exe/fetch.php?media=$1 last;
        rewrite ^/_detail/(.*) /lib/exe/detail.php?media=$1 last;
        rewrite ^/_export/([^/]+)/(.*) /doku.php?do=export_$1&id=$2 last;
        rewrite ^/(.*) /doku.php?id=$1&$args last;
    }
 
        location ~ .php$ {
                fastcgi_split_path_info ^(.+\.php)(.*)$;
                fastcgi_pass    unix:/var/run/php/php7.2-fpm.sock;
                fastcgi_index   doku.php;
                include         fastcgi_params;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param   SERVER_NAME $host;
                fastcgi_param   PATH_INFO $uri;
                fastcgi_intercept_errors        on;
                fastcgi_ignore_client_abort     off;
                fastcgi_connect_timeout         60;
                fastcgi_send_timeout            180;
                fastcgi_read_timeout            180;
                fastcgi_buffer_size             128k;
                fastcgi_buffers         4       256k;
                fastcgi_busy_buffers_size       256k;
                fastcgi_temp_file_write_size    256k;
	}

}