Piwigo

Ubuntu 20.04 – Installation de Piwigo avec Nginx, MariaDB et SSL/TLS

Si vous êtes photographe, créatif ou tout simplement détenteur de milliers de photos et vous souhaitez gérer et publier facilement vos médias sur le web, Piwigo est peut-être la solution qu’il vous faut…

Piwigo est une application opensource de gestion d’albums photo pour le web, disponible sous licence GPL et écrite en PHP.

Côté back office, Piwigo dispose de nombreuses fonctionnalités comme la gestion de collections, des modifications par lot, une gestion des coordonnées GPS à partir des métadonnées, une gestion de permissions (pour partager uniquement à votre famille ou à vos clients par exemple), une synchronisation avec Lightroom ou votre mobile et bien sûr de nombreuses options pour personnaliser le thème ou ajouter des fonctionnalités grâce à plus de 350 extensions.

D’un point de vue front office, Piwigo propose plusieurs thèmes mettant en avant facilement vos photos en haute qualité. Construit pour répondre aux contraintes actuelles du web, votre site sera responsive et s’adaptera en fonction de la résolution de l’utilisateur.

blank

Piwigo peut être installé sur n’importe quel serveur supportant une version récente de PHP et supportant MariaDB (base de données par défaut) ou MySQL.

1 – Prérequis

  • Vous devez disposer d’Ubuntu 20.04. Si vous disposez d’une version antérieure, vous pouvez mettre à jour votre système en suivant cette procédure.
  • Votre utilisateur doit avoir accès à sudo.

2 – Piwigo avec Nginx

Notre choix se portera sur le serveur HTTP Nginx pour une question de performances. Nginx est reconnu pour ses hautes performances, sa stabilité, son ensemble de fonctionnalités, sa configuration simple ainsi que sa faible consommation en ressources.

2.1 – Installation de Nginx

Installez le paquet nginx :

sudo apt-get -y install nginx

2.2 – Configuration de Nginx

Modifiez les directives suivantes du fichier de configuration Nginx /etc/nginx/nginx.conf :

user www-data;
worker_processes 8;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    # multi_accept on;                                                                                                                                                                                                                   
}

http {

    ##                                                                                                                                                                                                                                   
    # Basic Settings                                                                                                                                                                                                                     
    ##                                                                                                                                                                                                                                   

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_tokens off;                                                                                                                                                                                                                 

    # server_names_hash_bucket_size 64;                                                                                                                                                                                                  
    # server_name_in_redirect off;                                                                                                                                                                                                       

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

...
  • worker_processes : pour profiter pleinement de la puissance de votre serveur, il est recommandé de mettre autant de worker_processes que de cœurs disponibles sur votre serveur. Pour connaître le nombre de cœurs sur votre serveur, il suffit de lancer la commande :

    grep processor /proc/cpuinfo | wc -l
    8
  • server_tokens : pour des raisons de sécurité, il est recommandé de désactiver l’envoi d’informations telles que le numéro de version de votre Nginx. Pour cela, décommentez cette directive dans le bloc http.

3 – Installation et téléchargement de Piwigo

  • Installez l’outil curl et l’outil de décompression unzip :

    sudo apt-get -y install curl unzip
  • Déplacez-vous dans le répertoire /var/www et téléchargez la dernière version de Piwigo :

    cd /var/www
    sudo curl -o piwigo.zip http://piwigo.org/download/dlcounter.php?code=latest
  • Décompressez l’archive Piwigo :

    sudo unzip piwigo.zip
  • Supprimez l’archive téléchargée :

    sudo rm piwigo.zip

4 – Droits Unix : un utilisateur dédié piwigo

Lors du déploiement basique d’un serveur HTTP, l’utilisateur sous lequel fonctionne ce serveur (Apache, Nginx…) est la plupart du temps www-data, nobody ou apache. Cela signifie que si plusieurs sites existent sous la même instance de Nginx, tous utilisent le même utilisateur. Or si l’un des sites s’avère corrompu par un utilisateur malveillant alors l’assaillant peut profiter pleinement de tous les droits de l’utilisateur sous lequel tourne le serveur web. Tous les sites s’avèrent donc vulnérables.

Pour des raisons évidentes de sécurité, il est donc recommandé de cloisonner ces utilisateurs et d’avoir un utilisateur dédié à la gestion du dossier piwigo. Cet utilisateur aura des droits aussi restreints que possible à ce répertoire.

Par défaut, les fichiers de Piwigo possèdent les permissions suivantes :

  • répertoires : 755 (permission de lecture, d’écriture et d’exécution pour le propriétaire et permission de lecture et d’exécution pour le groupe et les autres)
  • fichiers : 644 (permission de lecture et d’écriture pour le propriétaire et permission de lecture uniquement pour le groupe et les autres).

Nous allons donc modifier le propriétaire du répertoire /var/www/piwigo et l’attribuer à un nouvel utilisateur dédié : piwigo.

Par ailleurs, Nginx est lancé sous l’utilisateur www-data et doit avoir accès en lecture au répertoire /var/www/piwigo pour lire les ressources statiques (HTML, CSS, JS, etc.). Nous allons donc attribuer le répertoire /var/www/piwigo au groupe www-data.

Enfin nous retirerons toutes les permissions de ce répertoire aux autres utilisateurs.

  • Créez un utilisateur piwigo :

    sudo adduser piwigo
  • Modifiez le propriétaire et le groupe du répertoire /var/www/piwigo :

    sudo chown -R piwigo:www-data /var/www/piwigo
  • Retirez toutes les permissions aux autres utilisateurs :

    sudo chmod -R o-rwx /var/www/piwigo

5 – Les modules PHP

Piwigo nécessite l’installation de modules PHP pour fonctionner :

sudo apt-get -y install php-common php-mbstring php-xmlrpc php-gd php-xml php-intl php-mysql php-cli php-ldap php-zip php-curl
Vous devez disposer d’une version de PHP égale ou supérieure à 7.2.

Pour connaître la version installée sur votre système, tapez la commande suivante :

php -v

6 – PHP-FPM

Le module PHP-FPM permet la communication entre le serveur Nginx et PHP, basée sur le protocole FastCGI. Ce module, écoutant sur le port 9000 par défaut ou sur un socket UNIX, permet notamment l’exécution de scripts PHP dans un processus indépendant de Nginx avec des UID et GID différents. Il sera alors possible, dans le cas de la gestion de plusieurs applications sur un même serveur, de créer et configurer un groupe (appelé aussi pool) par application. Un pool définit notamment le UID/GID des processus PHP et le nombre de processus minimum, maximum ou encore le nombre de processus en attente à lancer.

6.1 – Installation

Installez le paquet php-fpm :

sudo apt-get install -y php-fpm

6.2 – Création du pool piwigo

Créez le pool dédié à Piwigo en créant le fichier de configuration suivant : /etc/php/7.4/fpm/pool.d/piwigo.conf

[piwigo]
listen = /var/run/piwigo.sock

listen.owner = piwigo
listen.group = www-data

user = piwigo
group = www-data

pm = ondemand
pm.max_children = 30
pm.process_idle_timeout = 60s
pm.max_requests = 500

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

Certaines valeurs sont très arbitraires et seront, en fonction des ressources disponibles sur votre serveur et celles que vous souhaiterez dédier à votre Piwigo, différentes d’une configuration à l’autre. Cependant ces différentes directives respectent certaines conditions :

  • [piwigo] : nom du pool. Il est possible de créer plusieurs pools par fichier. Chaque pool doit commencer par cette directive.
  • listen : interface d’écoute des requêtes. Les syntaxes acceptées sont ADRESSE_IP:PORT (exemple : listen = 127.0.0.1:9000) et /path/to/unix/socket (exemple : listen = /var/run/piwigo.sock). Le socket est représenté comme un simple fichier sur le système et permet d’interfacer des processus entre eux sans passer par la couche réseau du système, ce qui est inutile lorsque Nginx et PHP-FPM sont hébergés sur le même serveur. Je vous conseille donc d’utiliser un socket.
  • listen.owner & listen.group : affecte l’utilisateur et le groupe au socket Unix si utilisé. Ces deux paramètres peuvent être associés au paramètre listen.mode qui définit les permissions du socket (660 par défaut). Il est important que Nginx ait les droits de lecture sur le socket Unix.
  • user & group : utilisateur et groupe sous lesquels le pool de processus sera exécuté. Cet utilisateur et ce groupe doivent bien sûr exister sur votre système et surtout accéder aux fichiers PHP de votre Piwigo. Cela veut dire aussi que chaque fichier et répertoire créé par Piwigo appartiendra à cet utilisateur et à ce groupe. Comme nous l’avons vu dans le chapitre dédié aux droits Unix, chaque fichier devra appartenir à l’utilisateur piwigo et au groupe www-data.
  • pm : directive acceptant les 3 valeurs suivantes : static, dynamic et ondemand.
    • static : les processus, au nombre de pm.max_children, sont continuellement actifs (quelle que soit la charge et l’affluence de votre Piwigo) et sont susceptibles de consommer de la mémoire inutilement. Cette directive est recommandée si Piwigo est l’unique application de votre serveur.
    • dynamic : le nombre de processus fils pourra varier suivant la charge. Cependant, nous gardons le contrôle sur le nombre de processus fils à créer au démarrage du serveur, le nombre de processus maximum, en attente de requêtes, etc. Les directives suivantes deviennent obligatoires : pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers. Cette directive est recommandée si vous avez plusieurs pools avec un fort trafic (plus de 10 000 requêtes/jour).
    • ondemand : aucun processus fils n’est lancé au démarrage du serveur, les processus s’activent à la demande et auront une durée de vie définie par la directive pm.process_idle_timeout. L’intérêt de cette directive est de libérer de la mémoire en cas de faible charge mais celle-ci peut légèrement augmenter le temps de réponse de votre Piwigo. Cette directive est recommandée si vous avez plusieurs pools avec potentiellement une faible affluence.

    Sachant que l’utilisation de Piwigo est personnelle et souvent limitée à quelques utilisateurs, nous choisirons et détaillerons ici la directive ondemand.

  • pm.max_children : nombre maximum de processus fils. La valeur du paramètre pm.max_children varie d’un système à l’autre. Voici la procédure à réaliser pour déterminer la valeur de ce paramètre :
    1. Arrêtez le service php-fpm :

      sudo systemctl stop php7.4-fpm.service
    2. Affichez la mémoire disponible (colonne available) sur votre système :

      free -m
                    total        used        free      shared  buff/cache   available
      Mem:           3913          58        2532          39        1322        3539
      Swap:          1048           0        1048

      Sur cet exemple, le système dispose de 3539Mo de RAM disponible. La quantité de RAM que vous souhaitez allouer au maximum à Piwigo dépend de vous et des autres services actifs que vous disposez sur ce même système. Dans notre exemple, nous partirons du principe que nous souhaitons allouer au maximum 1024Mo de RAM à Piwigo.

    3. Affichez la mémoire utilisée par un processus fils php-fpm :

      sudo systemctl start php7.4-fpm.service && ps --no-headers -o "rss,cmd" -C php-fpm7.4 | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'
      18M
    4. Déterminez le nombre de pm.max_children en appliquant la méthode de calcul suivante :

      pm.max_children = mémoire allouée (en Mo) / mémoire utilisée par un processus fils
      Dans notre exemple : 1024 / 18 = 56

    5. Éditez à nouveau le fichier /etc/php/7.4/fpm/pool.d/piwigo.conf et ajustez la valeur du paramètre pm.max_children :

      [piwigo]
      listen = /var/run/piwigo.sock
      
      listen.owner = piwigo
      listen.group = www-data
      
      user = piwigo
      group = www-data
      
      pm = ondemand
      pm.max_children = 56
      pm.process_idle_timeout = 60s
      pm.max_requests = 500
      
      env[HOSTNAME] = $HOSTNAME
      env[PATH] = /usr/local/bin:/usr/bin:/bin
      env[TMP] = /tmp
      env[TMPDIR] = /tmp
      env[TEMP] = /tmp
  • pm.process_idle_timeout : durée en secondes avant qu’un processus fils inactif soit détruit.
  • pm.max_requests : nombre de requêtes que chaque processus fils devra exécuter avant d’être détruit. Cette valeur ne doit pas être trop élevée afin de contourner d’éventuelles fuites mémoires, ni trop faible pour ne pas solliciter régulièrement le CPU à chaque création de processus fils. 500 reste une valeur recommandée.
  • env[*] : variables d’environnement nécessaires à PHP-FPM.

Redémarrez le service php-fpm afin d’activer le nouveau pool piwigo :

sudo systemctl start php7.4-fpm.service

6.3 – Configuration du service php-fpm

Enfin, il est nécessaire de spécifier à PHP-FPM les permissions de chaque fichier ou répertoire nouvellement créé dans votre Piwigo et ainsi respecter les permissions que nous avions spécifiées dans le chapitre des droits Unix. Pour cela :

  • Tapez la commande suivante :

    sudo systemctl edit php7.4-fpm.service

    Il se peut que l’éditeur de texte par défaut de votre système ne soit pas celui que vous avez l’habitude d’utiliser. Si c’est le cas, tapez la commande suivante et choisissez l’éditeur par défaut de votre système :

    sudo update-alternatives --config editor
  • Ajoutez les lignes suivantes :

    [Service]
    UMask=0027
  • Réactivez le service php7.4-fpm :

    sudo systemctl reenable php7.4-fpm.service

7 – Création de la base de données piwigo sous MariaDB

7.1 – Installation de MariaDB

Installez les paquets suivants :

sudo apt-get install -y mariadb-server mariadb-client

7.2 – Configuration de MariaDB

Lancez le script de configuration (recommandé) avec la commande sudo mysql_secure_installation :

sudo mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): [Touche Entrée]
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

7.3 – Création de la base de données piwigo

  • Tout d’abord, connectez-vous sur l’interface MySQL avec l’utilisateur root et grâce au mot de passe saisi lors de la configuration de MariaDB :

    sudo mysql -u root -p
    Enter password: 
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 49
    Server version: 10.3.22-MariaDB-1ubuntu1 Ubuntu 20.04
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  • Créez la base de données piwigo :

    CREATE DATABASE piwigo;
    Query OK, 1 row affected (0.00 sec)

    Tout comme pour la gestion du répertoire piwigo et pour plus de sécurité, vous allez tout d’abord créer un utilisateur MySQL piwigo dédié à la base de données piwigo, renseigner un mot de passe et ensuite lui donner les droits sur cette base de données. Exécutez les commandes suivantes en remplaçant mon_mot_de_passe par le vôtre (attention deux commandes sont à modifier) :

    CREATE USER "piwigo"@"localhost";
    Query OK, 0 rows affected (0.00 sec)
    
    SET password FOR "piwigo"@"localhost" = password('mon_mot_de_passe');
    Query OK, 0 rows affected (0.00 sec)
    
    GRANT ALL PRIVILEGES ON piwigo.* TO "piwigo"@"localhost" IDENTIFIED BY "mon_mot_de_passe";
    Query OK, 0 rows affected (0.00 sec)
    
    FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    
    EXIT;
    Bye

8 – Nom de domaine & virtual host

Si vous souhaitez accéder à votre Piwigo de l’extérieur (et non seulement via localhost), il est nécessaire de faire pointer votre domaine ou sous-domaine vers l’IP de votre serveur. Pour cela, commencez par modifier les règles DNS dans l’interface administrateur du fournisseur de votre nom de domaine.

  • Créez le fichier suivant /etc/nginx/sites-available/piwigo et modifiez les lignes en surbrillance en fonction de votre configuration :

    upstream php-handler {
        server                        unix:/var/run/piwigo.sock;
    }
    
    server {
        listen                        80;
        listen                        [::]:80;
        server_name                   piwigo.mondomaine.com;
    
        # Path to the root of your installation
        root                          /var/www/piwigo/;
    
        # Add headers to serve security related headers
        add_header                    X-Frame-Options "SAMEORIGIN";
        add_header                    X-Content-Type-Options nosniff;
        add_header                    X-XSS-Protection "1; mode=block";
        add_header                    X-Robots-Tag none;
        add_header                    X-Download-Options noopen;
        add_header                    X-Permitted-Cross-Domain-Policies none;
        add_header                    Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
        add_header                    Referrer-Policy no-referrer always;
    
        # set max upload size
        client_max_body_size          512M;
        fastcgi_buffers               64 4K;
    
        # Enable gzip but do not remove ETag headers
        gzip                          on;
        gzip_vary                     on;
        gzip_comp_level               4;
        gzip_min_length               256;
        gzip_proxied                  expired no-cache no-store private no_last_modified no_etag auth;
        gzip_types                    application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
    
        location / {
            index                     index.php;
            try_files                 $uri $uri/ @rewrite;
        }
    
        location @rewrite {
            rewrite                   ^/picture((/|$).*)$ /picture.php$1 last;
            rewrite                   ^/index((/|$).*)$ /index.php$1 last;
            rewrite                   ^/i((/|$).*)$ /i.php$1 last;
        }
    
        location ~ ^(?<script_name>.+?\.php)(?<path_info>/.*)?$ {
            try_files                 $script_name = 404;
            include                   /etc/nginx/fastcgi_params;
            fastcgi_pass              php-handler;
            fastcgi_param             PATH_INFO $path_info;
            fastcgi_param             SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    
        location ~ ^/.well-known/acme-challenge/* {
            allow                     all;
        }
    
        location ~ ^/favicon.ico$ {
            log_not_found             off;
            access_log                off;
            expires                   max;
        }
    
        location = /robots.txt {
            allow                     all;
            log_not_found             off;
            access_log                off;
        }
    
        # piwigo distribution files 
        location ~ ^/(README|doc)$ {
            deny                      all;
        }
    
        # prevent direct acces to uploaded images, derivates and logs
        location ~ ^/(_data/(i|logs)|upload)/ {
            deny                      all;
        }
    
        location ~* \.(gif|png|jpe?g)$ {
            if ($check_referal = "invalid+not_piwigo") {
                return                403;
            }
            try_files                 $uri $uri/ @rewrite;
        }
    
        # prevent any hotlinks  and direct access to alias URIs (/i/upload/...)
        # which are not from Piwigo itself (happens when exporting from lightroom via ws.php)
    
        set                           $check_referal "";
    
        # very restrictive
        valid_referers                *.domain.tld;
        # if you want google etc to be able to show your images:
        #valid_referers ~google\.com ~bing\.com *.domain.tld
    
        if ($invalid_referer) {
            set                       $check_referal "invalid";
        }
        if ($http_user_agent !~ "Piwigo") {
            set                       $check_referal "${check_referal}+not_piwigo";
        }
    }
  • Activez le virtual host :

    sudo ln -s /etc/nginx/sites-available/piwigo /etc/nginx/sites-enabled/piwigo
  • La nouvelle configuration sera prise en compte après redémarrage des services Nginx et PHP-FPM :

    sudo systemctl restart nginx.service
    sudo systemctl restart php7.4-fpm.service

9 – SSL/TLS avec Let’s Encrypt

Let’s Encrypt est une autorité de certification libre, automatisée et ouverte. Cette autorité fournit des certificats gratuits X.509 pour le protocole cryptographique SSL/TLS au moyen d’un processus automatisé destiné à se passer du processus complexe actuel impliquant la création manuelle, la validation, la signature, l’installation et le renouvellement des certificats pour la sécurisation des sites internet. Depuis sa création, Let’s Encrypt a livré plus de 100 millions de certificats.

9.1 – Installation

Installez les paquets software-properties-common et certbot :

sudo apt-get install -y software-properties-common
sudo apt-get install -y certbot

9.2 – Génération des certificats

Let’s Encrypt permet de générer de différentes façons plus ou moins automatisées un certificat. La méthode standalone permet de générer simplement un certificat. En revanche, celle-ci demande d’arrêter le serveur Nginx et ceci est valable à chaque renouvellement dudit certificat. Il existe aussi des plugins Apache et Nginx entièrement automatisés. Ces plugins mettent à jour automatiquement la configuration des virtual hosts mais le plugin Nginx est encore expérimental. Dans cet article, nous recommandons d’utiliser le plugin webroot pour Nginx qui permet de générer et renouveler son certificat sans interrompre le serveur Nginx.

Le plugin webroot crée un fichier temporaire /var/www/piwigo/.well-known/acme-challenge dans le dossier racine de votre Piwigo, celui-ci permettra aux serveurs de Let’s Encrypt de valider votre certificat en appelant ce fichier temporaire.

  • Générez votre certificat en remplaçant email@mondomaine.com et piwigo.mondomaine.com par vos informations personnelles :

    sudo certbot certonly --webroot -w /var/www/piwigo --agree-tos --no-eff-email --email email@mondomaine.com -d piwigo.mondomaine.com --rsa-key-size 4096
    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 piwigo.mondomaine.com
    Using the webroot path /var/www/piwigo for all unmatched domains.
    Waiting for verification...
    Cleaning up challenges
    
    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at
       /etc/letsencrypt/live/piwigo.mondomaine.com/fullchain.pem.
       Your key file has been saved at:
       /etc/letsencrypt/live/piwigo.mondomaine.com/privkey.pem
       Your cert will expire on 20XX-XX-XX. 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"
     - Your account credentials have been saved in your Certbot
       configuration directory at /etc/letsencrypt. You should make a
       secure backup of this folder now. This configuration directory will
       also contain certificates and private keys obtained by Certbot so
       making regular backups of this folder is ideal.
     - 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

    Vous obtiendrez 4 fichiers dans le répertoire /etc/letsencrypt/live/piwigo.mondomaine.com :

    • cert.pem : le certificat de votre domaine piwigo.mondomaine.com
    • chain.pem : le certificat Let’s Encrypt
    • fullchain.pem : les certificats cert.pem et chain.pem combinés
    • privkey.pem : la clé privée du certificat.
  • SSL/TLS utilise un système de chiffrement asymétrique (comme RSA ou Diffie-Hellman) afin de sécuriser les échanges de vos flux. Par défaut, Nginx utilise une clé de 1048 bits. En augmentant la longueur de la clé à 4096 bits, vous augmenterez ainsi la sécurité de votre protocole SSL/TLS. Générez une nouvelle clé Diffie-Hellman (DH) de 4096 bits et attribuez-lui un minimum de permissions. La première commande peut prendre plusieurs heures :

    sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
    sudo chmod 600 /etc/ssl/certs/dhparam.pem
  • Ajoutez ou modifiez les lignes en surbrillance dans votre virtual host (/etc/nginx/sites-available/piwigo) en remplaçant les chemins des directives ssl_certificate, ssl_certificate_key, ssl_trusted_certificate et ssl_dhparam par l’emplacement de vos certificats et de la clé DH précédemment générés :

    upstream php-handler {
        server                        unix:/var/run/piwigo.sock;
    }
    
    server {
        listen                        80;
        listen                        [::]:80;
        server_name                   piwigo.mondomaine.com;
        return                        301 https://$server_name$request_uri;
    }
    
    server {
        listen                        443 ssl http2;
        listen                        [::]:443 ssl http2;
        server_name                   piwigo.mondomaine.com;
    
        # Path to the root of your installation
        root                          /var/www/piwigo/;
    
        ssl                           on;
        ssl_certificate               /etc/letsencrypt/live/piwigo.mondomaine.com/fullchain.pem;
        ssl_certificate_key           /etc/letsencrypt/live/piwigo.mondomaine.com/privkey.pem;
        ssl_trusted_certificate       /etc/letsencrypt/live/piwigo.mondomaine.com/chain.pem;
        ssl_dhparam                   /etc/ssl/certs/dhparam.pem;
    
        ssl_session_cache             shared:SSL:1m;
        ssl_session_timeout           1440m;
        ssl_buffer_size               8k;
        ssl_protocols                 TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers                   TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
        ssl_prefer_server_ciphers     on;
        ssl_stapling                  on;
        ssl_stapling_verify           on;
    
        # Add headers to serve security related headers
        add_header                    X-Frame-Options "SAMEORIGIN";
        add_header                    X-Content-Type-Options nosniff;
        add_header                    X-XSS-Protection "1; mode=block";
        add_header                    X-Robots-Tag none;
        add_header                    X-Download-Options noopen;
        add_header                    X-Permitted-Cross-Domain-Policies none;
        add_header                    Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
        add_header                    Referrer-Policy no-referrer always;
    
            # set max upload size
        client_max_body_size          512M;
        fastcgi_buffers               64 4K;
    
        # Enable gzip but do not remove ETag headers
        gzip                          on;
        gzip_vary                     on;
        gzip_comp_level               4;
        gzip_min_length               256;
        gzip_proxied                  expired no-cache no-store private no_last_modified no_etag auth;
        gzip_types                    application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
    
        location / {
            index                     index.php;
            try_files                 $uri $uri/ @rewrite;
        }
    
        location @rewrite {
            rewrite                   ^/picture((/|$).*)$ /picture.php$1 last;
            rewrite                   ^/index((/|$).*)$ /index.php$1 last;
            rewrite                   ^/i((/|$).*)$ /i.php$1 last;
        }
    
        location ~ ^(?<script_name>.+?\.php)(?<path_info>/.*)?$ {
            try_files                 $script_name = 404;
            include                   /etc/nginx/fastcgi_params;
            fastcgi_pass              php-handler;
            fastcgi_param             PATH_INFO $path_info;
            fastcgi_param             SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param             HTTPS on;
        }
    
        location ~ ^/.well-known/acme-challenge/* {
            allow                     all;
        }
    
        location ~ ^/favicon.ico$ {
            log_not_found             off;
            access_log                off;
            expires                   max;
        }
    
        location = /robots.txt {
            allow                     all;
            log_not_found             off;
            access_log                off;
        }
    
        # piwigo distribution files 
        location ~ ^/(README|doc)$ {
            deny                      all;
        }
    
        # prevent direct acces to uploaded images, derivates and logs
        location ~ ^/(_data/(i|logs)|upload)/ {
            deny                      all;
        }
    
        location ~* \.(gif|png|jpe?g)$ {
            if ($check_referal = "invalid+not_piwigo") {
                return                403;
            }
            try_files                 $uri $uri/ @rewrite;
        }
    
        # prevent any hotlinks  and direct access to alias URIs (/i/upload/...)
        # which are not from Piwigo itself (happens when exporting from lightroom via ws.php)
    
        set                           $check_referal "";
    
        # very restrictive
        valid_referers                *.domain.tld;
        # if you want google etc to be able to show your images:
        #valid_referers ~google\.com ~bing\.com *.domain.tld
    
        if ($invalid_referer) {
            set                       $check_referal "invalid";
        }
        if ($http_user_agent !~ "Piwigo") {
            set                       $check_referal "${check_referal}+not_piwigo";
        }
    }
  • Rechargez votre configuration Nginx :

    sudo systemctl reload nginx.service

9.3 – Renouvellement automatique du certificat

Les certificats délivrés par Let’s Encrypt sont valides 90 jours. Une tâche planifiée permettant de renouveler l’ensemble des certificats présents sur votre serveur est fournie avec le paquet certbot. Celle-ci est exécutée deux fois par jour et les renouvelle si et seulement si vos certificats expirent dans un délai inférieur à 30 jours.

  • Testez si le renouvellement automatique est fonctionnel avec la commande suivante :

    sudo certbot renew --dry-run

10 – Piwigo

Lancez votre navigateur et rendez-vous à l’adresse suivante : https://piwigo.mondomaine.com/.

Configurez votre compte administrateur et les informations de votre base de données nécessaires à Piwigo :

Piwigo Configuration

Vérifiez la force de votre protocole SSL/TLS en vérifiant votre Piwigo sur SSL Labs. Avec une telle configuration, vous devriez obtenir un A+.

11 – Améliorer les performances de votre Piwigo avec OPcache

OPcache (qui signifie Optimizer Plus Cache) est introduit depuis la version 5.5.0 de PHP. Il sert à cacher l'opcode de PHP, c’est-à-dire les instructions de bas niveau générées par la machine virtuelle PHP lors de l’exécution d’un script. Autrement dit, le code pré-compilé est stocké en mémoire.

La suite est réservée aux membres. Déjà membre ? Se connecter

Accédez à l'intégralité des contenus de HowTo Wared en illimité.

Soutenez la publication de tutoriels et une rédaction indépendante.

Obtenez des réductions (VPN, plugins Nextcloud, Wordpress, ...)

12 – Améliorer la sécurité de votre Piwigo

Développé en langage Python, Fail2Ban est un outil permettant d'analyser des fichiers de logs et de déclencher des actions si certaines choses suspectes sont détectées. Fail2ban est capable de détecter des connexions non autorisées et de bannir (via iptables) l'adresse IP de l'attaquant

La suite est réservée aux membres. Déjà membre ? Se connecter

Accédez à l'intégralité des contenus de HowTo Wared en illimité.

Soutenez la publication de tutoriels et une rédaction indépendante.

Obtenez des réductions (VPN, plugins Nextcloud, Wordpress, ...)

Piwigo sur Android…

Découvrez l’excellente application officielle Piwigo sur Android qui vous permettra de synchroniser et de partager vos fichiers sur votre mobile.



Ubuntu Server 20.04 LTSNginx 1.17.10
PHP7-FPM 7.4.3
MariaDB 10.3.22
Piwigo 2.10.12
Fail2ban 0.11.1



3 réponses

Laisser un commentaire

Participez-vous à la discussion?
N'hésitez pas à contribuer!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *