From Mageia wiki
Jump to: navigation, search


Drakconf multiflag.png
Autres langues
English ; français ;
Résumé :
Ce wiki permet d'installer un serveur Nextcloud basé sur NGINX. Redis est utilisé comme cache et Letsencrypt est utilisé comme gestionnaire de certificat SSL. Les mises à jour du serveur Nextcloud peuvent être faites par l'intermédiaire de l'interface graphique de son administrateur.

Introduction

Ce wiki est une alternative à l'installation par le dépôt officiel de Mageia. Un serveur NGINX est proposé ici, au lieu de Apache. Il est aussi proposé le choix entre une base de données MariaDB ou PostgresSQL. Les optimisations suivantes sont aussi proposées :

  • Cache mémoire Redis
  • Certificat SSL par Letsencrypt
  • Protection par Fail2ban

Avec cette option, vous pourrez mettre à jour Nextcloud au fur et à mesure des mises à jour mineures et majeures.

Cette installation a été testée avec Mageia 8 et Nextcloud 21.

Attention !
Si vous prévoyez de migrer depuis Mageia 7 avec Nextcloud 20,
  • Notez que Mageia 7 utilise pour NGINX l'utilisateur nginx:nginx. Par contre, c'est l'utilisateur apache:apache qui est utilisé avec Mageia 8; il faudra mettre à jour vos fichiers de configuration et vos scripts, notamment ceux utilisant la commande Nextcloud occ.
  • Le fichier de configuration de l'hôte virtuel Nextcloud pour NGINX demande à être légèrement adapté pour Nextcloud 21 (vous trouverez une proposition dans ce wiki).
  • Bien entendu, une sauvegarde du serveur, de la base de données et des données est obligatoire.

Installation du serveur

NGINX

Je ne vais pas ouvrir le débat sur quel est le meilleur choix entre NGINX et Apache. Les compétences de l'utilisateur et le contexte d'utilisation influencent aussi le choix. L'objectif principal est d'offir une alternative.

Sur un plan technique, il est cependant rapporté que NGINX est plus approprié pour des machines moins puissantes comme le Raspberry Pi ; il utilise aussi moins de mémoire. En fait, NGINX libère les ressources allouées de façon à s'adapter à la demande.

NGINX fonctionne avec 2 types de fichiers de configuration :

  • /etc/nginx/nginx.conf est un fichier global de configuration. Ces paramètres s'appliqueront à tous les serveurs de la machine considérée.
  • /etc/nginx/conf.d/*.conf est un dossier utilisé par NGINX pour configurer les hôtes virtuels -vHosts (philosophie analogue à Apache). Le fichier de configuration spécifique à Nextcloud y sera stocké.

NGINX peut être installé par le CCM ou en utilisant la commande suivante en tant que superutilisateur :

# urpmi nginx

Pour vérifier la version installée, utilisez la commande suivante :

$ nginx -v

qui retourne, par exemple :

nginx version: nginx/1.18.0

Il faut alors activer et démarrer le service. Le CCM peut être utilisé ou la commande suivante en tant que superutilisateur :

# systemctl enable --now nginx

Pour tester si NGINX est bien installé, ouvrir votre navigateur internet et taper localhost dans la barre d'adresse. Vous devez aboutir sur la page d'accueil de Mageia & NGINX :

Nginx welcome.png

PHP

NGINX a besoin d'interpéter les scripts PHP. Pour faire cela, PHP sera exécuté via FastCGI Process Manager (PHP-FPM).

Il faut donc installer PHP et ses modules, tel que requis par Nextcloud. Le manuel de l'administrateur Nextcloud fourni plus de détails. Notez que le serveur Apache lui-même n'a pas besoin d'être installé.


L'installation peut se faire par le CCM mais c'est un peu lourd du fait du nombre de paquets à installer. Il est préférable d'utiliser la commande suivante en tant que superutilisateur :

# urpmi php php php-apcu php-bcmath php-bz2 php-ctype php-cgi php-cli php-curl php-dom php-exif php-fileinfo php-filter php-fpm php-gd php-gmp php-iconv php-imagick php-intl php-json php-ldap php-mbstring php-mysql php-opcache php-openssl php-pcntl php-posix php-session php-sodium php-tokenizer php-xml php-xmlreader php-xmlwriter php-zip php-zlib ffmpeg


Pour vérifier la version de PHP installée, utiliser la commande suivante :

$ php -v

qui retourne, par exemple :

PHP 8.0.2 (cli) (built: Feb 3 2021 22:24:23) ( ZTS ) Copyright (c) The PHP Group Zend Engine v4.0.2, Copyright (c) Zend Technologies with Zend OPcache v8.0.2, Copyright (c), by Zend Technologies
Dragon-head.png Ici sont des dragons !
php -i est une commande qui fourni aussi beaucoup d'information sur l'installation.

Ici aussi, il faut activer et démarrer le service, en tant que superutilisateur :

# systemctl enable --now php-fpm

Connexion de NGINX et PHP

Il faut maintenant que NGINX et PHP se "parlent".

Pour tester cela, nous allons écrire un script qui affichera la configuration PHP installée.

A l'aide de votre éditeur de texte favori (nano or vi, for instance), créez le fichier /var/www/html/info.php. Y coller le bloc suivant :

<?php phpinfo(); ?>


L'étape suivante est d'indiquer à NGINX où trouver les scripts. Pour cela, il faut modifier le fichier /etc/nginx/conf.d/default.conf

Il est recommandé de garder une copie du fichier d'origine. Par exemple, en tant que superutilisateur, exécutez :

# cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf-original

Editez maintenant le fichier /etc/nginx/conf.d/default.conf en tant que superutilisateur et faire les modifications suivantes :

  • Trouvez le bloc commençant par location ~ \.php$ et enlever les symboles de commentaire # jusqu'à l'accolade }
  • Dans ce même bloc, changer :
    • root html par root /var/www/html
    • fastcgi_pass 127.0.0.1:9000 par unix:/var/lib/php-fpm/php-fpm.sock;
    • fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name par fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name

Le bloc doit alors ressembler à :

location ~ \.php$ { root /var/www/html; fastcgi_pass unix:/var/lib/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }

Vous noterez plus tard que le paramètre fastcgi_pass est maintenant similaire entre NGINX et PHP-FPM pour écouter le même socket.

Pour tester qu'il n'y a pas d'erreur dans le fichier de configuration de NGINX, exécutez la commande suivante en tant que superutilisateur :

# nginx -t

qui doit retourner :

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

Redémarrez alors le service NGINX :

# systemctl restart nginx


Vous pouvez maintenant tester que NGINX et PHP-FPM cohabitent bien. Ouvrir votre navigateur internet et aller à l'adresse localhost/info.php. Vous devez obtenir la page qui résume l'installation de PHP pour votre système. Par exemple :

Php info.png

Préparations pour Nextcloud

Ajustements pour NGINX

Dans la plupart des cas, le fichier de configuration /etc/nginx/nginx.conf est suffisant. Il faut cependant faire quelques ajustements pour Nextcloud.

  • 'user' : indique l'utilisateur du serveur. C'est toujours 'apache' pour Mageia 8 (Mageia 7 utilisait 'nginx' à l'instar d'autres distributions comme openSUSE).
  • 'worker_processes' : le nombre de processus utilisés par NGINX pour gérer les requêtes de ses clients. 'Auto' indique un processus par coeur de CPU, qui est la configuration optimale la plupart du temps.
  • 'server_tokens' : mettre 'off' assure que NGINX n'indique pas à l'extérieur la version installée (lors de pages d'erreur par exemple). C'est la valeur recommandée pour améliorer la sécurite.
  • 'tcp_nodelay' et 'tcp_nopush' : ils seront ajustés pour optimiser la performance.
    • L'option 'tcp_nodelay' autorise le transfert des données dès qu'elles sont disponibles, court-circuitant une zone tampon de stockage.
      • NGINX utilise 'tcp_nodelay' pour les connexions HTTP persistentes. Les connexions persistentes sont des sockets qui restent ouverts un temps après l'envoi des données. La persistence permet d'être plus rapide par l'envoi de plus de données à la fois.
      • Lors du téléchargement d'une page internet, 'tcp_nodelay' permet d'être 0,2 seconde plus rapide pour chaque requête HTTP.
      • L'option 'tcp_nopush' fonctionne à l'opposé de 'tcp_nodelay'. Au lieu d'optimiser le temps de réponse, elle optimise le volume de données transféré.
  • 'sendfile' :
    • La clé est l'associaton de 'sendfile', 'tcp_nodelay' et 'tcp_nopush' dans nginx.conf. Si vos fichiers sont stockés sur le serveur même, 'sendfile' est essentiel pour accélérer la vitesse de votre serveur. Combiné à 'sendfile', 'tcp_nopush assure que les paquets sont au maximum de leurs capacités avant envoi au client. Cela réduit grandement la charge du serveur et accélère le transfert des fichiers. Au moment de l'envoi du dernier paquet, NGINX désactive 'tcp_nopush'. 'tcp_nodelay' force alors l'envoi des données, économisant jusqu'à 0.2 seconde par fichier.

Donc, au final, voici les ajustements à faire dans /etc/nginx/ningx.conf. En tant que superutilisateur, éditez /etc/nginx/nginx.conf et :

  • Vérifiez que 'user' est bien 'apache'
  • Mettre 'worker_process' à 'auto'
  • Dans la section 'events', sous 'worker_connections 1024', ajouter 'use epoll'
  • Vérifiez 'sendfile est à 'on'
  • Définir :
    • 'tcp_nopush' à 'on'
    • 'tcp_nodelay' à 'on
    • 'server_tokens' à 'off'


Votre fichier /etc/nginx/nginx.conf doit ressembler à :

####################################################################### # # This is the main Nginx configuration file. # # More information about the configuration options is available on # * the English wiki - http://wiki.nginx.org/Main # * the Russian documentation - http://sysoev.ru/nginx/ # ####################################################################### #---------------------------------------------------------------------- # Main Module - directives that cover basic functionality # # http://wiki.nginx.org/NginxHttpMainModule # #---------------------------------------------------------------------- user apache; worker_processes auto; error_log /var/log/nginx/error.log; #error_log /var/log/nginx/error.log notice; #error_log /var/log/nginx/error.log info; pid /run/nginx.pid; #---------------------------------------------------------------------- # Events Module # # http://wiki.nginx.org/NginxHttpEventsModule # #---------------------------------------------------------------------- events { worker_connections 1024; use epoll; } #---------------------------------------------------------------------- # HTTP Core Module # # http://wiki.nginx.org/NginxHttpCoreModule # #---------------------------------------------------------------------- http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; server_tokens off; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # Load config files from the /etc/nginx/conf.d directory # The default server is in conf.d/default.conf include /etc/nginx/conf.d/*.conf; }


Testez la syntaxe des fichiers NGINX par la commande suivante en tant que superutilisateur :

# nginx -t

Redémarrez le service NGINX si pas d'erreur :

# systemctl restart nginx

Configuration PHP

Les 2 fichiers à modifier sont /etc/php-fpm.d/www.conf et /etc/php.ini

/etc/php-fpm.d/www.conf

Gardez une copie du fichier d'origine par, en tant que superutilisateur :

# cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf-original

Puis, en tant que superutilisateur, editez /etc/php-fpm.d/www.conf pour faire les actions suivantes :

  • Vérifiez les paramètres suivants :
'user' et 'group' doivent être 'apache'.
user = apache group = apache
'listen': la communication entre le serveur internet NGINX et PHP se fait par un socket.
listen = /var/lib/php-fpm/php-fpm.sock
  • Ajustez les ressources allouées au serveur :
La formule est : Nombre total de processus = (mémoire RAM allouée) / (Mémoire par processus php)
Si vous allouez 5Go de RAM à votre serveur, PHP utilisant environ 35Mo de RAM par requête, le nombre total de processus sera (1024*5) / 35 = 146. 'pm.max_children' est alors arrondi à 150.
pm.max_children = 150
  • Par défaut, les variables d'environnement ne sont pas définies par PHP. Cependant, elles sont essentielles à l'exécution de Nextcloud. Donc, enlever le signe de commentaire ';' devant chacune des lignes suivantes :
env[HOSTNAME] = $HOSTNAME env[PATH] = /usr/local/bin:/usr/bin:/bin env[TMP] = /tmp env[TMPDIR] = /tmp env[TEMP] = /tmp
et ajoutez un signe de commentaire devant :
;env[PATH] = $PATH
  • Pour éviter un timeout lors de l'installation de Nextcloud, ajouter la ligne :
request_terminate_timeout = 300


/etc/php.ini

il faut ajuster aussi /etc/php.d/05_date.ini et /etc/php.d/99_opcache.ini qui sont appelés par /etc/php.ini

Faites une copie des fichiers initiaux en tant que superutilisateur :

# cp /etc/php.ini /etc/php.ini-original
# cp /etc/php.d/05_date.ini /etc/php.d/05_date.ini-original
# cp /etc/php.d/99_opcache.ini /etc/php.d/99_opcache.ini-original

Puis, en tant que superutilisateur, éditez /etc/php.ini pour faire les modifications suivantes:

  • 'cgi.fix_pathinfo': pour des questions de sécurité (injecton arbitraire de script), il est important d'éviter que NGINX envoie une demande à PHP-FPM si le fichier n'existe pas.
cgi.fix_pathinfo = 0
  • Pour ne pas exposer la version de PHP vis-à-vis de l'extérieur :
expose_php = Off
  • Nextcloud exige que 512Mo de mémoire soient alloués à PHP :
memory_limit = 512M
  • Pour autoriser le téléchargement de fichier de taille maximale de 10Go :
post_max_size = 10240M upload_max_filesize = 10240M
  • Output Buffering doit être désactivé pour éviter que PHP ne retourne des erreurs d'allocation de mémoire :
output_buffering = Off


En tant que superutilisateur,

éditez /etc/php.d/05_date.ini et ajustez votre fuseau horaire. Par exemple, pour Paris :

date.timezone = Europe/Paris

éditez /etc/php.d/99_opcache.ini et ajustez les paramètres du cache :

opcache.enable_cli=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=10000 opcache.revalidate_freq=1 opcache.save_comments=1


redémarrez les services PHP-FPM et NGINX :

# systemctl restart php-fpm
# systemctl restart nginx

Base de données

MySQL/MariaDB est la base de données recommandées par la documentation de Nextcloud. Cependant, PostgreSQL est aussi une option valable.

De nombreux tutoriels proposent MariaDB. Les développeurs de Nextcloud semblent aussi avoir plus de compétences sur MySQL/MariaDB ; d'où leur recommandation.

Ceci dit, mes premiers tests de Nextcloud 21 beta sous Mageia 8 beta (i.e. using PHP8) ont fonctionné avec PostgreSQL mais échoué avec MariaDB. Autre point positif avec PostgreSQL, vous remarquerez plus loin que c'est plus simple à configurer.


Je n'ai pas fait de comparaison de performance mais, d'après mes lectures, c'est comparable. Plus de détails sont disponibles en suivant ce lien : Example of migration to PostgreSQL in 2017

A vous donc de choisir ce que vous préférez. L'installation est décrite ci-dessous pour ces 2 type de base de données.

MariaDB

Installation soit par CCM ou en tant que superutilisateur par :

# urpmi mariadb php-pdo_mysql

puis, activez et démarrez le service :

# systemctl enable --now mysqld

pour vérifier la version installée :

# mysql --version

qui retourne par exemple :

mysql Ver 15.1 Distrib 10.5.8-MariaDB, for Linux (x86_64) using readline 5.1


L'installation de MariaDB doit maintenant être sécurisée. En tant que superutilisalteur, exécutez :

# mysql_secure_installation

répondre alors aux questions posées avec les réponses marquées en rouge ci-dessous :

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 haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none): <ENTER> Enter

OK, successfully used password, moving on... Setting the root password or using the unix_socket ensures that nobody can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] N

Set root password? [Y/n] Y

New password: Your-MariaDB_password

Re-enter new password: Your_MariaDB_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 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!


Vous pouvez maintenant créer votre base de données pour Nextcloud. Nous utiliserons les paramètres suivants. Vous pouvez bien entendu les adapter à loisir.

  • database name: nextcloud
  • database administrator: adminmdb
  • database administrator password: pwd-nc

Exécutez en tant que superutilisateur :

# mysql -uroot -p

Vous devez entrer le mot de passe que vous venez juste de définir pour MariaDB. Ensuite, entrer la commande ci-dessous après le MariaDB [(none)]> prompt:

Enter password: Your_MariaDB_password

Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 11 Server version: 10.5.8-MariaDB Mageia MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER adminmdb@localhost IDENTIFIED BY 'pwd-nc'; GRANT ALL PRIVILEGES on nextcloud.* to adminmdb@localhost; FLUSH privileges; quit;

PostgreSQL

Installation soit par CCM soit en tant que superutilisateur par :

# urpmi postgresql13 postgresql13-server php-pdo_pgsql

puis activer et démarrer le service :

# systemctl enable --now postgresql

pour vérifier la version installée :

# psql --version

qui retourne par exemple :

psql (PostgreSQL) 13.1


La base de données pour Nextcloud sera créée avec les paramètres ci-dessous. Vous pouvez bien entendu les adapter à loisir.

  • database name: nextcloud
  • database administrator: adminpgsql
  • database administrator password: pwd-nc


En tant que superutilisateur, exécutez :

# sudo -u postgres psql

après le postgres=# prompt, entrez les commandes ci-dessous :

psql (13.1)

Type "help" for help.

postgres=# CREATE USER adminpgsql WITH PASSWORD 'pwd-nc';

CREATE ROLE

postgres=# CREATE DATABASE nextcloud TEMPLATE template0 ENCODING 'UNICODE';

CREATE DATABASE

postgres=# ALTER DATABASE nextcloud OWNER TO adminpgsql;

ALTER DATABASE

postgres=# GRANT ALL PRIVILEGES ON DATABASE nextcloud TO adminpgsql;

GRANT

postgres=# \q


Comme vous le voyez, c'est plus rapide qu'avec MariaDB.

Configuration de Nextcloud

Hôte virtuel pour NGINX

Selon comment votre nom de domaine est configué, il y a 2 options pour se connecter à votre serveur Nextcloud :

  • Option 1 : vous avez un nom de domaine 'mon_domaine' ou vous ne voulez utiliser Nextcloud que dans un réseau local.
    • Si vous avez un nom de domaine, vous devez le faire pointer vers l'adresse IP de votre routeur (ou box). Vous devez alors configurer votre routeur pour qu'il redirige les ports 80 et 443 vers la machine sur laquelle Nextcloud est installé.
    • Pour une utilisation uniquement dans un réseau local, vous aurez juste besoin d'assigner une adresse IP fixe à votre machine ; adresse du type 192.168.x.y
Avec cette première option, vous vous connecterez à votre serveur Nextcloud à l'aide d'un navigateur internet et en allant à l'adresse mon_domaine/nextcloud ou 192.168.x.y/nextcloud
  • Option 2 : vous avez la possibilité de créer un sous-domaine du type nextcloud.mon_domaine
    • Vous aurez aussi besoin de rediriger les ports 80 et 443 vers la machine hébergeant le serveur Nextcloud.
Vous vous connecterez à votre serveur à l'aide d'un navigateur internet et en allant à l'adresse nextcloud.mon_domaine


Ces 2 options vont être couvertes dans cette section afin de configurer l'hôte virtuel Nextcloud pour NGINX.

NGINX utilisent des hôtes virtuels (vHost) pour gérer plusieurs applications (Web site, Nextcloud,...) sur la même machine.


Cas d'un réseau local ou absence de sous-domaine

Nous sommes dans le cas où votre serveur est accessible par un nom de domaine ou uniquement dans un réseau local (option 1 décrite précédemment). Votre serveur Nextcloud sera accessible soit par http://my_domain/nextcloud soit par 192.168.x.y/nextcloud

Le fichier de configuration vHost utilisé ici est celui fourni par la manuel de l'administrateur de Nextcloud, avec les ajustements suivants :

  • Le nom de 'socket' reflète la configuration de Mageia.
  • Le nom de domaine est appelé mon_domaine. Utilisez l'adresse IP 192.168.x.y à la place de mon_domaine si vous restez dans votre réseau local.
  • L'instruction 'add_header Strict-Transport-Security' est activée en enlevant le signe de commentaire en début de ligne.
  • La taille maximum d'un fichier à télécharger 'client_max_body_size' est fixé à 10Go, pour être consitent avec la configuration de PHP déjà effectuée.
  • Les parties relatives à HTTPS et aux certificats SSL sont enlevées. Cela sera traité dans un second temps.


Pour créer le fichier de configuration vHost pour Nextcloud vHost, éditez /etc/nginx/conf.d/nextcloud.conf en tant que superutilisteur et copiez/collez le bloc ci-dessous (ajustez mon_domaine avec le votre ou votre adresse IP locale) :

upstream php-handler { server unix:/var/lib/php-fpm/php-fpm.sock; } server { listen 80; listen [::]:80; server_name mon_domaine; # HSTS settings # WARNING: Only add the preload option once you read about # the consequences in https://hstspreload.org/. This option # will add the domain to a hardcoded list that is shipped # in all major browsers and getting removed from this list # could take several months. add_header Strict-Transport-Security "max-age=15768000; includeSubDomains;" always; # Path to the root of the domain root /var/www; location = /robots.txt { allow all; log_not_found off; access_log off; } location /.well-known { # The following 6 rules are borrowed from `.htaccess` location = /.well-known/carddav { return 301 /nextcloud/remote.php/dav/; } location = /.well-known/caldav { return 301 /nextcloud/remote.php/dav/; } # Anything else is dynamically handled by Nextcloud location ^~ /.well-known { return 301 /nextcloud/index.php$uri; } try_files $uri $uri/ =404; } location ^~ /nextcloud { # set max upload size client_max_body_size 10240M; 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; # Pagespeed is not supported by Nextcloud, so if your server is built # with the `ngx_pagespeed` module, uncomment this line to disable it. #pagespeed off; # HTTP response headers borrowed from Nextcloud `.htaccess` add_header Referrer-Policy "no-referrer" always; add_header X-Content-Type-Options "nosniff" always; add_header X-Download-Options "noopen" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Permitted-Cross-Domain-Policies "none" always; add_header X-Robots-Tag "none" always; add_header X-XSS-Protection "1; mode=block" always; # Remove X-Powered-By, which is an information leak fastcgi_hide_header X-Powered-By; # Specify how to handle directories -- specifying `/nextcloud/index.php$request_uri` # here as the fallback means that Nginx always exhibits the desired behaviour # when a client requests a path that corresponds to a directory that exists # on the server. In particular, if that directory contains an index.php file, # that file is correctly served; if it doesn't, then the request is passed to # the front-end controller. This consistent behaviour means that we don't need # to specify custom rules for certain paths (e.g. images and other assets, # `/updater`, `/ocm-provider`, `/ocs-provider`), and thus # `try_files $uri $uri/ /nextcloud/index.php$request_uri` # always provides the desired behaviour. index index.php index.html /nextcloud/index.php$request_uri; # Rule borrowed from `.htaccess` to handle Microsoft DAV clients location = /nextcloud { if ( $http_user_agent ~ ^DavClnt ) { return 302 /nextcloud/remote.php/webdav/$is_args$args; } } # Rules borrowed from `.htaccess` to hide certain paths from clients location ~ ^/nextcloud/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) { return 404; } location ~ ^/nextcloud/(?:\.|autotest|occ|issue|indie|db_|console) { return 404; } # Ensure this block, which passes PHP files to the PHP process, is above the blocks # which handle static assets (as seen below). If this block is not declared first, # then Nginx will encounter an infinite rewriting loop when it prepends # `/nextcloud/index.php` to the URI, resulting in a HTTP 500 error response. location ~ \.php(?:$|/) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; set $path_info $fastcgi_path_info; try_files $fastcgi_script_name =404; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $path_info; fastcgi_param HTTPS on; fastcgi_param modHeadersAvailable true; # Avoid sending the security headers twice fastcgi_param front_controller_active true; # Enable pretty urls fastcgi_pass php-handler; fastcgi_intercept_errors on; fastcgi_request_buffering off; } location ~ \.(?:css|js|svg|gif)$ { try_files $uri /nextcloud/index.php$request_uri; expires 6M; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets } location ~ \.woff2?$ { try_files $uri /nextcloud/index.php$request_uri; expires 7d; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets } location /nextcloud { try_files $uri $uri/ /nextcloud/index.php$request_uri; } } }


Redémarrez les services NGINX and PHP-FPM :

# systemctl restart nginx
# systemctl restart php-fpm

Utilisation d'un sous-domaine

Nous sommes dans le cas de l'option 2. Votre serveur Nextcloud se trouve à l'adresse du type http://nextcloud.mon_domaine

Notez que le '/nextcloud' a disparu.

Le fichier de configuration vHost utilisé ici est celui fourni par la manuel de l'administrateur de Nextcloud, avec les ajustements suivants :

  • Le nom de 'socket' reflète la configuration de Mageia.
  • Le nom de domaine est appelé nextcloud.mon_domaine.
  • L'instruction 'add_header Strict-Transport-Security' est activée en enlevant le signe de commentaire en début de ligne.
  • La taille maximum d'un fichier à télécharger 'client_max_body_size' est fixé à 10Go, pour être consitent avec la configuration de PHP déjà effectuée.
  • Les parties relatives à HTTPS et aux certificats SSL sont enlevées. Cela sera traité dans un second temps.


Pour créer le fichier de configuration vHost pour Nextcloud vHost, éditez /etc/nginx/conf.d/nextcloud.conf en tant que superutilisteur et copiez/collez le bloc ci-dessous (ajustez nextcloud.mon_domaine avec le votre) :

upstream php-handler { server unix:/var/lib/php-fpm/php-fpm.sock; } server { listen 80; listen [::]:80; server_name nextcloud.mon_domaine; # HSTS settings # WARNING: Only add the preload option once you read about # the consequences in https://hstspreload.org/. This option # will add the domain to a hardcoded list that is shipped # in all major browsers and getting removed from this list # could take several months. add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always; # set max upload size client_max_body_size 10240M; 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; # Pagespeed is not supported by Nextcloud, so if your server is built # with the `ngx_pagespeed` module, uncomment this line to disable it. #pagespeed off; # HTTP response headers borrowed from Nextcloud `.htaccess` add_header Referrer-Policy "no-referrer" always; add_header X-Content-Type-Options "nosniff" always; add_header X-Download-Options "noopen" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Permitted-Cross-Domain-Policies "none" always; add_header X-Robots-Tag "none" always; add_header X-XSS-Protection "1; mode=block" always; # Remove X-Powered-By, which is an information leak fastcgi_hide_header X-Powered-By; # Path to the root of your installation root /var/www/nextcloud; # Specify how to handle directories -- specifying `/index.php$request_uri` # here as the fallback means that Nginx always exhibits the desired behaviour # when a client requests a path that corresponds to a directory that exists # on the server. In particular, if that directory contains an index.php file, # that file is correctly served; if it doesn't, then the request is passed to # the front-end controller. This consistent behaviour means that we don't need # to specify custom rules for certain paths (e.g. images and other assets, # `/updater`, `/ocm-provider`, `/ocs-provider`), and thus # `try_files $uri $uri/ /index.php$request_uri` # always provides the desired behaviour. index index.php index.html /index.php$request_uri; # Rule borrowed from `.htaccess` to handle Microsoft DAV clients location = / { if ( $http_user_agent ~ ^DavClnt ) { return 302 /remote.php/webdav/$is_args$args; } } location = /robots.txt { allow all; log_not_found off; access_log off; } # Make a regex exception for `/.well-known` so that clients can still # access it despite the existence of the regex rule # `location ~ /(\.|autotest|...)` which would otherwise handle requests # for `/.well-known`. location ^~ /.well-known { # The following 6 rules are borrowed from `.htaccess` location = /.well-known/carddav { return 301 /remote.php/dav/; } location = /.well-known/caldav { return 301 /remote.php/dav/; } # Anything else is dynamically handled by Nextcloud location ^~ /.well-known { return 301 /index.php$uri; } try_files $uri $uri/ =404; } # Rules borrowed from `.htaccess` to hide certain paths from clients location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) { return 404; } location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { return 404; } # Ensure this block, which passes PHP files to the PHP process, is above the blocks # which handle static assets (as seen below). If this block is not declared first, # then Nginx will encounter an infinite rewriting loop when it prepends `/index.php` # to the URI, resulting in an HTTP 500 error response. location ~ \.php(?:$|/) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; set $path_info $fastcgi_path_info; try_files $fastcgi_script_name =404; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $path_info; fastcgi_param HTTPS on; fastcgi_param modHeadersAvailable true; # Avoid sending the security headers twice fastcgi_param front_controller_active true; # Enable pretty urls fastcgi_pass php-handler; fastcgi_intercept_errors on; fastcgi_request_buffering off; } location ~ \.(?:css|js|svg|gif)$ { try_files $uri /index.php$request_uri; expires 6M; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets } location ~ \.woff2?$ { try_files $uri /index.php$request_uri; expires 7d; # Cache-Control policy borrowed from `.htaccess` access_log off; # Optional: Don't log access to assets } location / { try_files $uri $uri/ /index.php$request_uri; } }


Redémarrez les services NGINX and PHP-FPM services :

# systemctl restart nginx
# systemctl restart php-fpm

Fin de l'installation

Télécharger Nextcloud

Le paquet pour le serveur Nextcloud est téléchargé directement depuis le site officiel nextcloud.com/install

Le script ci-dessous télécharge Nextcloud, l'installe dans le répertoire approprié et attribue les permissions nécessaires.

Remplacez NC_VER par le numéro de version de la dernière version stable de Nextcloud (21 au moment de la sortie de Mageia 8).


Créez le fichier get_nc.sh

Copiez/collez le bloc suivant :

#!/bin/bash NC_VER="21" wget https://download.nextcloud.com/server/releases/latest-$NC_VER.zip -O /var/www/latest.zip unzip /var/www/latest.zip -d /var/www chown -R apache:apache /var/www/nextcloud rm /var/www/latest.zip

Rendre le script exécutable :

$ chmod a+x ./get_nc.sh

l'exécutez en tant que superutilisateur :

# ./get_nc.sh

Le répertoire des données

Les données seront stockées dans un répertoire indépendant de celui du serveur pour plus de sécurité. Idéalement, il faudrait que ce répertoire soit sur une partition propre ou un disque indépendant.

Créez le répertoire /data/ncdata et changez son propriétaire :

# mkdir -p /data/ncdata
# chown apache:apache /data/ncdata

Maintenance périodique de Nextcloud

Des tâches de maintenance (nettoyage base de données, vérification des mises à jour…) sont exécutées périodiquement à l'aide d'un script fourni avec Nextcloud.

Nous allons utiliser un 'timer' systemd pour exécuter ce script de façon périodique (toutes les 5 minutes comme requis par Nextcloud).

Il faut créer 2 fichiers : /usr/lib/systemd/system/nextcloudcron.service et /usr/lib/systemd/system/nextcloudcron.timer


Créez ces 2 fichiers en tant que superutilisateur.


/usr/lib/systemd/system/nextcloudcron.service contiendra :

[Unit] Description=Nextcloud cron.php job [Service] User=apache ExecStart=/usr/bin/php -f /var/www/nextcloud/cron.php


/usr/lib/systemd/system/nextcloudcron.timer contiendra :

[Unit] Description=Run Nextcloud cron.php every 5 minutes [Timer] OnBootSec=5min OnUnitActiveSec=5min Unit=nextcloudcron.service [Install] WantedBy=timers.target


Activez et démarrez ce 'timer' en tant que superutilisateur :

# systemctl enable --now nextcloudcron.timer

Gestion du pare-feu

Par CCM, allez sur la configuration du pare-feu et sélectionnez serveur à ouvrir. Se référer à la documentation du pare-feu dans le wiki.

Page de configuration de Nextcloud

C'est la dernière étape avant d'avoir un serveur Nextcloud opérationnel.

Pour cela, avec votre navigateur internet, allez soit à l'adresse http://mon_domaine/nextcloud soit http://192.168.x.y/nextcloud soit http//nextcloud.mon_domaine, selon l'option choisie.


MariaDB

Si vous avez choisi MariaDB, vous obtiendrez une page similaire à :

Wizard mariadb.png

Entrez un nom d'administrateur de votre serveur Nextcloud avec son mot de passe. Entrez ensuite les informations sur le répertoire des données et sur la base de données (conformément aux paramètres utilisés précédemment) :

  • Administrateur Nextcloud, par exemple : ncadmin
  • Mot de passe fort.
  • Répertoire des données : /data/ncdata
  • Utilisateur MariadDB : adminmdb
  • Mot de passe utilisateur MariadDB : pwd-nc
  • Nom de la base de données MariaDB: nextcloud

Cliquez sur 'Terminer'

Remarque :
Votre serveur Nextcloud est maintenant opérationnel. La suite concerne son optimisation en termes de performance et de sécurité.
PostgreSQL

Si vous avez choisi PostgreSQL, vous obtiendrez une page similaire à :

Wizard postgresql.png

Entrez un nom d'administrateur de votre serveur Nextcloud avec son mot de passe. Entrez ensuite les informations sur le répertoire des données et sur la base de données (conformément aux paramètres utilisés précédemment) :

  • Administrateur Nextcloud, par exemple : ncadmin
  • Mot de passe fort.
  • Répertoire des données : /data/ncdata
  • Utilisateur PostgreSQL : adminpgsql
  • Mot de passe utilisateur PostgreSQL : pwd-nc
  • Nom de la base de données PostgreSQL: nextcloud

Cliquez sur 'Terminer'

Remarque :
Votre serveur Nextcloud est maintenant opérationnel. La suite concerne son optimisation en termes de performance et de sécurité.

Optimisations additionnelles

Editez /var/www/nextcloud/config/config.php et collez le bloc ci-dessous avant la dernière parenthèse ); à la fin du fichier. Ajustez bien entendu le fuseau horaire et votre code téléphone en fonction de votre localisation géographique.

'logtimezone' => 'Europe/Paris', 'default_phone_region' => 'FR', 'remember_login_cookie_lifetime' => 0, 'session_keepalive' => false, 'log_rotate_size' => 110000, 'preview_libreoffice_path' => '/usr/bin/libreoffice', 'activity_expire_days' => 1, 'trashbin_retention_obligation' => 'auto, 7',

Redis

Redis permet d'assurer qu'il n'y a pas de perte de données si 2 utilisateurs ouvrent ou sauvegardent le même fichier en même temps. Il permet aussi la gestion d'un cache de données, améliorant la performance.

Toutes les commandes ci-dessous s'exécutent en étant superutilisateur.

Installation

# urpmi redis php-redis

Redémarrage de PHP-FPM car un nouveau module PHP vient d'être installé :

# systemctl restart php-fpm


Activer et démarrer le service Redis :

# sudo systemctl enable --now redis


Redémarrage du serveur Nginx :

# systemctl restart nginx

Le fichier de configuration est /etc/redis.conf

faire une copie du fichier d'origine :

# cp /etc/redis.conf /etc/redis.conf-original


Comme avec PHP, Redis recommande la communication à travers un 'socket'. Editez et modifiez le fichier /etc/redis.conf comme suit :

port 0 unixsocket /tmp/redis.sock unixsocketperm 770

Les options suivantes sont utilisées :

  • 'port 0': Redis écoute le port 6379 par défaut. Ce paramètre est donc changé pour utiliser le 'socket'.
  • 'unixsocket': c'est le nom du 'socket'.
  • 'unixsocketperm': permission pour le 'socket'. 700 est la valeur par défaut mais génèrerait l'erreur suivante avec Nextcloud : 'RedisException: Permission denied in /var/www/nextcloud/lib/private/RedisFactory.php:92'


Pour utiliser Redis, l'utilisateur apache du serveur doit être dans le même groupe que redis. Sinon, cela génère typiquement l'erreur suivante avec Nextcloud : Fatal internal error.

Donc, en tant que superutilisateur, exécutez :

# usermod -a -G redis apache

Redémarrez le service Redis :

# systemctl restart redis

Le fichier de configuration de Nextcloud /var/www/nextcloud/config/config.php doit aussi indiquer que Redis est à utiliser. Ajoutez le bloc ci-dessous avant la dernière parenthèse ');' à la fin du fichier :

'memcache.local' => '\OC\Memcache\APCu', 'memcache.distributed' => '\OC\Memcache\Redis', 'filelocking.enabled' => true, 'memcache.locking' => '\OC\Memcache\Redis', 'redis' => [ 'host' => '/tmp/redis.sock', 'port' => 0, 'dbindex' => 0, 'timeout' => 0.0, ],

Par défaut, Redis garde la connexion ouverte si le client est en pause. Si vous n'aimez pas ce comportement, vous pouvez ajouter un 'timeout'.

Certificat SSL avec Letsencrypt

Jusqu'à maintenant, la connexion au serveur se fait par le protocole non sécurisé HTTP. Cela peut suffire pour un réseau local.

Si vous voulez vous connecter depuis l'extérieur avec un nom de domaine, il est grandement recommandé de se connecter par le protocole sécurisé HTTPS. Pour cela, il faut obtenir un certificat SSL associé à votre nom de domaine ou sous-domaine. Le certificat SSL est le point le plus important pour crypter la connexion par HTTPS.

Letsencrypt est une autorité à but non lucratif et gratuite qui fourni le type de certificat requis. Certbot est le client qui permet d'installer et de garder à jour ce certificat sur votre machine.


Pour communiquer avec Let's Encrypt, le port 80 doit être ouvert. C'est déjà le cas suite à l'installation du serveur Nextcloud mais je me permets de le rappeler. D'ailleurs, même quand Nextcloud ne sera accessible que par HTTPS et le port 443, il faudra garder le port 80 ouvert pour que certbot puisse demander le renouvellement du certificat de façon périodique.

La commande suivante en tant que superutilisateur installe certbot plus un nombre certain de dépendances pour python3.

# urpmi certbot certbot-nginx


Pour obtenir vos certificats SSL/TLS pour votre domaine, remplacer votre email et nom de domaine dans la commande ci-dessous et exécutez-la en tant que superutilisateur. A noter que si vous voulez un certificat pour un sous-domaine du type nextcloud.mon_domaine, c'est ce sous-domaine qu'il faut indiquer et non pas le nom de domaine seul.

# certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email my_email -d my_domain --rsa-key-size 4096

Explication des options :

  • --nginx – utilise le plug-in pour mettre à jour les fichiers de configuration de NGINX.
  • --agree-tos – Acceptation des conditions de service.
  • --redirect – Autorise la redirection de http:// vers https://
  • --hsts – "HTTP Strict Transport Security" indique au navigateur internet de ne jamais faire de demande pour votre site en utilisant HTTP.
  • --staple-ocsp – Active "Online Certificate Status Protocol (OCSP)" qui est une façon rapide et sure de vérifier si un certificat SSL est valide ou pas.
  • --email – Votre email pour recevoir des informations sur l'état de votre certificat.
  • -d – Nom de domaine ou de sous-domaine pour lequel vous souhaitez un certificat (vous pouvez ajouter jusqu'à 100 noms).
  • --rsa-key-size Force de l'algorithme Diffie-Hellman.


Vous obtenez alors :

------------------------------------------------------------------------------- Congratulations! You have successfully enabled https://my_domain You should test your configuration at: https://www.ssllabs.com/ssltest/analyze.html?d=my_domain ------------------------------------------------------------------------------- IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/my_domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/my_domain/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 with the "certonly" option. 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.


En éditant le fichier /etc/nginx/conf.d/nextcloud.conf, vous vous apercevez que certbot a automatiquement mis à jour votre configuration NGINX avec les certificats créés (c'est grâce au plug-in NGINX d'installé et d'activé dans la commande).

Vous noterez aussi que l'utilisation de HTTPS sera automatique. C'est-à-dire, toute requête faite avec HTTP sera automatiquement transformée en une requête HTTPS.

Les clés de cryptages sont stockées dans le répertoire /etc/letsencrypt/options-ssl-nginx.conf

Elles doivent suivre les recommandations de Mozilla best practice


Les certificats sont valides 3 mois et doivent être renouvellés. Lors de l'installation de certbot, un timer systemd de renouvellement a été installé.

Cependant, ce timer envoie une demande de renouvellement tous les jours, à une heure aléatoire.

Faire une demande hebdomadaire est suffisante. De plus, comme il faut arrêter le serveur pour éviter une erreur, il vaut mieux le faire de façon contrôlée quand cela peut gêner le moins.

Il est proposé ci-dessous de faire la demande de renouvellement tous les jeudis à 3:00 du matin ; à vous d'ajuster selon votre besoin.

En tant que superutilisateur, éditez le fichier /usr/lib/systemd/system/certbot-renew.timer et faire les ajustements suivants :

[Timer] OnCalendar=Thu *-*-* 03:00:00 Persistent=true Unit=certbot-renew.service


Comme indiqué précédemment, pour éviter l'erreur 'cannot bind in IPv4 or IPv6' pendant le renouvellement du certificat, il faut arrêter puis redémarrer le serveur NGNIX.

Editez le fichier /etc/sysconfig/certbot et ajustez PRE_HOOK et POST_HOOK :

PRE_HOOK="--pre-hook 'systemctl stop nginx'" POST_HOOK="--post-hook 'systemctl start nginx'"


Pour finir, activez et démarrez le service pour le timer :

# systemctl enable --now certbot-renew.timer

Amélioration de la sécurite avec FAIL2BAN

La page wiki de Fail2ban donnera plus d'information sur ce service.

Pour faire court, c'est un service qui parcours les fichiers *.log d'autres services web (ssh, NGINX,...) pour détecter les adresses IP de machine qui scannent votre serveur ou qui essayent de se connecter de façon illégitime. Fail2ban donnera alors l'instruction à votre pare-feu de bloquer les connexions depuis ces adresses IP.

C'est une façon de ralentir très fortement les attaques par force brute ou par déni de service.

Installation

L'installation se fait par MCC ou en ligne de commande en tant que superutilisateur :

# urpmi fail2ban

Des dépendances pour python3 sont aussi installées.

Activez et démarrez le service par :

# systemctl enable --now fail2ban

Il y a 2 types de fichiers de configuration : *.conf and *.local

Les fichiers *.conf sont fournis à l'installation de Fail2ban et ne doivent pas être modifiés au risque d'être écrasés au moment d'une mise à jour.

A la place les fichiers *.local sont modifiés ou créés pour ajuster la configuration initiale faite par *.conf

Paramétrage général

Créez en tant que superutilisateur le fichier /etc/fail2ban/jail.local et y coller le bloc suivant :


# Do all your modifications to the jail's configuration in jail.local! [DEFAULT] findtime = 1800 # shorewall est le pare-feu de Mageia banaction = shorewall # an email sera envoyé lors du blocage. Support que Dragonfly Mail Agent (DMA) est installé, par exemple action = %(action_mwl)s mta = mail # Pour ne pas bloquer les connexions depuis votre réseau local. A supprimer si votre réseau est utilisé aussi par des inconnus. ignoreip = 192.168.0.0/16

Paramétrage pour Nextcloud

Filtre Nextcloud

Par défaut, le filtre pour Nextcloud n'existe pas.

Il faut donc créer le fichier /etc/fail2ban/filter.d/nextcloud.conf et y coller le bloc suivant, en tant que superutilisateur :

[Definition] failregex = ^.*Login failed: '?.*'? \(Remote IP: '?<HOST>'?\).*$ ^.*\"remoteAddr\":\"<HOST>\".*Trusted domain error.*$ ignoreregx =

Activation du filtre

Créez maintenant le fichier /etc/fail2ban/jail.d/nextcloud.local et y coller le bloc suivant, en tant que superutilisateur :

[nextcloud] backend = auto enabled = true port = 80,443 protocol = tcp filter = nextcloud logpath = /data/ncdata/nextcloud.log maxretry = 4 bantime = 360 action = %(action_mwl)s

Avec cette configuration, votre pare-feu bloquera pendant 1 heure l'adresse IP d'une machine qui n'est pas arrivée à se connecter au bout de 4 tentatives.


Rechargez les règles :

# sudo fail2ban-client reload

Test de Fail2ban

Pour commencer, regardons l'état des règles de blocage.

Exécutez en tant que superutilisateur :

# fail2ban-client status

A moins que vous n'ayez déjà paramétrés Fail2ban pour d'autres beoins (ssh,...), vous obtiendrez le résultat suivant qui indique qu'une seul règle est activée et qu'elle s'appelle Nextcloud.

Status |- Number of jail: 1 `- Jail list: nextcloud


Si vous voulez savoir combien de connexions ont été rejetées et quelles adresse IP ont été bloquées, exécutez la commande suivante :

# fail2ban-client status nextcloud

Si rien n'a été ni infructeux ni bloqué, vous obtenez :

Status for the jail: nextcloud |- Filter | |- Currently failed: 0 | |- Total failed: 0 | `- File list: /data/ncdata/nextcloud.log `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:


Pour testez si Fail2ban fonctionne pour Nextcloud, essayez de vous connecter 2 fois avec un mot de passe erroné.

Exécutez alors la commande suivante :

# fail2ban-regex /data/ncdata/nextcloud.log /etc/fail2ban/filter.d/nextcloud.conf -v

Vous obtiendrez le message indiquant que l'adresse IP ip.x.y.z a échoué de se connecter 2 fois :

Running tests ============= Use failregex filter file : nextcloud, basedir: /etc/fail2ban Use log file : /data/ncdata/nextcloud.log Use encoding : UTF-8 Results ======= Failregex: 2 total |- #) [# of hits] regular expression | 1) [2] ^.*Login failed: '?.*'? \(Remote IP: '?<HOST>'?\).*$ | ip.x.y.z Wed Jan 06 12:29:18 2021 | ip.x.y.z Wed Jan 06 12:29:20 2021 | 2) [0] ^.*\"remoteAddr\":\"<HOST>\".*Trusted domain error.*$
Dragon-head.png Ici sont des dragons !
Il est recommandé de faire ce test à chaque mise à jour majeure de Nextcloud pour s'assurer que son fichier de log n'a pas changé de structure, nécessitant alors d'ajuster le filtre.

Vérification du pare-feu

Nous allons vérifier que Fail2ban banni bien les adresses IP malveillantes.

Si vous faites ce test depuis votre réseau local, vous devez désactiver la fonctionnalité qui empêche le blocage du réseau interne.

Editez le fichier /etc/fail2ban/jail.local en tant que superutilisateur et modifiez le paramètre suivant :

ignoreself = false
Remarque :
Pensez à régler ce paramètre sur 'true' après le test. Sinon, une erreur d'une machine de votre réseau bloquera l'adresse du routeur et donc toutes les machines de votre réseau local.

Maintenant, essayez de vous connecter 4 fois à votre serveur Nextcloud avec un mot de passe erroné.

Fail2ban banni votre adresse IP et vous recevez un email si ce service a été paramétré (avec Dma_Dragonfly_Mail_Agent par exemple).

Vous obtenez aussi cette information par la commande suivante :

# fail2ban-client status nextcloud

qui retourne que 4 tentatives infructueuses ont été faite depuis l'adresse IP ip.x.y.z, qui a été bannie :

Status for the jail: nextcloud |- Filter | |- Currently failed: 1 | |- Total failed: 4 | `- File list: /data/ncdata/nextcloud.log `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: ip.x.y.z


Pour vérifier que le pare-feu a bloqué l'intrus, exécutez la commande :

# shorewall show dynamic

qui retourne :

Shorewall 5.2.8 Chain dynamic at localhost - mer. 06 janv. 2021 15:42:48 CET Counters reset mer. 06 janv. 2021 15:12:22 CET Chain dynamic (1 references) pkts bytes target prot opt in out source destination 0 0 reject all -- * * ip.x.y.z. 0.0.0.0/0


Pour autoriser à nouveau des connexions depuis cette adresse IP ip.x.y.z, exécutez la commande :

# fail2ban-client set nextcloud unbanip ip.x.y.z
Remarque :
Merci de m'avoir suivi jusqu'ici et je vous souhaite d'apprécier votre serveur Nextcloud

Liens utiles