Aller au contenu principal
Sujet: Tuto d'installation serveur Nextcloud sous Leap 15.1 (Lu 6912 fois) sujet précédent - sujet suivant

Tuto d'installation serveur Nextcloud sous Leap 15.1

Bonjour à toutes et à tous.

Grâce à l’aide reçue sur ce forum, j’ai pu finaliser l’installation de mon serveur Nextcloud.
En fait, il y a beaucoup de tutos pour ubuntu mais très peu pour Opensuse. D’ailleurs, je n’ai rien trouvé pour Leap 15.x
Donc, sans prétentions, je poste ce tuto car j’ai passé beaucoup de temps à adapter les tutos des autres distributions à Opensuse (je ne suis pas un pro!). Si cela peut aider d’autres personnes, j’en serai ravi.
De plus, si les experts de ce forum ont des idées d’améliorations ou si j’ai fait des choses qui exposent mon serveur à la malveillance, je suis preneur de toute remarque.

Avant de commencer, voici les sources qui m’ont bien aidé :
https://www.c-rieger.de/nextcloud-installation-guide-ubuntu-18-04/
https://decatec.de/home-server/nextcloud-auf-ubuntu-server-18-04-lts-mit-nginx-mariadb-php-lets-encrypt-redis-und-fail2ban/
https://www.howtoforge.com/tutorial/owncloud-nginx-opensuse-leap-42.1/
https://nextcloud.com/support/
et notre cher sogal sur Alionet !

Installation de NGINX et PHP
J’ai choisi d’installer une autre version de php-fpm que celle d’origine de Leap 15.1 car le module password de Nextcloud ne va bientôt plus supporter php-fpm7.2.
La version 7.3 sera installée grâce à (php7-apcu et imagick sont dans extensions) :
zypper addrepo https://download.opensuse.org/repositories/devel:languages:php:php73/openSUSE_Leap_15.1/devel:languages:php:php73.repo
zypper addrepo https://download.opensuse.org/repositories/server:php:extensions:php7/php7_openSUSE_Leap_15.1/server:php:extensions:php7.repo
zypper refresh

Je garde les versions par défaut de nginx et mariadb car, d’après sogal, Opensuse Leap recevra les mises à jour de sécurité.

Installation de nginx
zypper in nginx 

Installation de PHP
En disséquant la documentation de Nextcloud, j’ai abouti à la liste et l’installation des modules suivants :
sudo zypper in php7 php7-APCu php7-bz2 php7-ctype php7-curl php7-dom php7-exif php7-fileinfo php7-fpm php7-gd php7-gmp php7-iconv php7-imagick php7-intl php7-json php7-ldap php7-mbstring php7-mysql php7-opcache php7-openssl php7-pcntl php7-pdo php7-posix php7-tokenizer php7-xmlreader php7-xmlwriter php7-zip  php7-zlib ffmpeg-3 

Tests initiaux NGINX et PHP-FPM
Test de NGINX
Créer  /srv/www/htdocs/index.html avec
<html>
<body>
<h1> NGINX fonctionne </h1>
</body>
</html>

Modifier /etc/nginx/nginx.conf
Ajouter index.php dans la ligne ci-dessous vers le début du fichier :
        
index  index.html index.htm index.php;

enlever les symboles # de commentaire pour la bloc ci-dessous :
location ~ \.php$ {
    root           /srv/www/htdocs/;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    include        fastcgi_params;
 }

Tester la syntaxe des modifications avec la commande ci-dessous qui ne doit pas renvoyer d’erreur :
sudo nginx -t
Démarrer le service
sudo systemctl enable nginx
sudo systemctl start nginx

Dans navigateur taper : localhost et le message « NGINX fonctionne » doit apparaître

Test PHP-FPM
 Créer /srv/www/htdocs/info.php avec
<?php
phpinfo();
?>

Initialiser les fichiers de configuration
sudo cp /etc/php7/fpm/php-fpm.conf.default  /etc/php7/fpm/php-fpm.conf
sudo cp /etc/php7/fpm/php-fpm/php-fpm.d/www.conf.default /etc/php7/fpm/php-fpm/php-fpm.d/www.conf

modifier php-fpm.conf en enlevant le symbole # de la ligne ci-dessous :
error_log = log/php-fpm.log

modifier www.conf  comme ci-dessous, en changeant user et group, et en enlevant le symbole de commentaire qui est cette fois ; pour d’autres:
user = nginx
group = nginx

listen.owner = nginx
listen.group = nginx
listen.mode = 0660

pour améliorer la performance, modifier www.conf de façon à écouter un socket et non un port. Pour cela, commenter la ligne listen = 127.0.0.1:9000 et ajouter une ligne pour pointer vers un socket :
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm.sock

Revenir sur /etc/nginx/nginx.conf et modifier comme suit le bloc location ~ \.php$ en ajoutant la ligne fastcgi_pass pointant le même socket que dans www.conf :
 location ~ \.php$ {
             root           /srv/www/htdocs/;
             #fastcgi_pass   127.0.0.1:9000;
             fastcgi_pass   unix:/var/run/php-fpm.sock;
             fastcgi_index  index.php;
             fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
             include        fastcgi_params;
         }

Initialiser le service :
sudo systemctl enable php-fpm
sudo systemctl start php-fpm

Taper localhost/info.php pour avoir des informations sur la configuration php installée.
https://www.alionet.org/index.php?action=dlattach;sa=tmpattach;attach=post_tmp_33_2337f2e0a91756b5c1bf10c2d55698d9;topic=0

Maintenant que nous nous sommes assurés que NGINX et PHP-FPM fonctionnent, nous allons avancer dans leur optimisation et finir l’installation de NEXTCLOUD

Optimisation de NGINX

Modification du fichier /etc/nginx/nginx.conf
    • user : utilisateur du serveur web : nginx
    • worker_processes : nombre de coeurs du CPU : auto
    • pid : j’ai décommenté la ligne mais je n’ai pas trouvé d’explication. Je suis preneur d’information !
    • server_tokens : mettre à off pour la sécurité en limitant les informations fournies par nginx.
    • TCP_NOPUCH, TCP_NODELAY, SENDFILE : en les combinant on peut gagner jusqu’à 0,2s lors de l’envoi des données.

En repartant du fichier nginx.conf juste modifié, ajuster les lignes comme suit :
user  nginx;
worker_processes  auto;

pid        /var/run/nginx.pid;

tcp_nopush     on;
tcp_nodelay     on;

server_tokens off;

Test & Restart NGINX
sudo nginx -t 
sudo systemctl restart nginx

Optimisation de PHP
Modification de /etc/php7/fpm/php-fpm.d/www.conf

J’ai limité pm.max_children à 150 en utilisant la formule ci-dessous :
Total Max Processes = (Total Ram - (Used Ram + Buffer)) / (Memory per php process)
En allouant 5Go de ram à mon serveur et avec une taille de 35Mo par requête PHP, cela donne : (1024*5) / 35 = 146.
    • user / group : à mettre en consistence avec le serveur = nginx
    • Listen : pointer vers le même socket que les autres fichiers = /run/php/php-fpm.sock
    • Environment Variables: NEXTCLOUD à besoin de ces variables = bloc à décommenter.
    • Prévention d’un timeout de nextcloud à l’installation avec request_terminate_timeout = 300
     
Ajuster les lignes du fichier comme suit :
user = nginx
group = nginx

;listen = 127.0.0.1:9000
listen = /var/run/php-fpm.sock

listen.owner = nginx
listen.group = nginx
listen.mode = 0660

pm.max_children = 150

pm.start_servers = 20

pm.min_spare_servers = 10

pm.max_spare_servers = 20

pm.max_requests = 500

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

;ajout de la ligne ci-dessous
request_terminate_timeout = 300

modification de /etc/php7/cli/php.ini
    • cgi.fix_pathinfo : pour améliorer la sécurité = 0
    • expose_php = off évite d’avoir accès à la version de php depuis l’extérieur
    • Plus d’autres paramètres d’optimisation de fonctionnement (memory_limit = 512M est demandé par NEXTCLOUD).

Le fichier php.ini existe déjà dans le répertoire /etc/php7/cli ; ajuster les lignes du fichier comme suit :
 
implicit_flush = Off

expose_php = Off

max_execution_time = 1800

max_input_time = 3600
 
memory_limit = 512M
 
html_errors = On
 
register_argc_argv = Off

post_max_size = 10240M
 
cgi.fix_pathinfo=0
 
upload_max_filesize = 10240M
 
max_file_uploads = 100
 
date.timezone = Europe/Paris

opcache.enable=1
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


Création de /etc/php7/fpm/php.ini
A l’installation, ce fichier n’existe pas. J’ai donc juste copié le fichier php.ini du répertoire /etc/php7/cli que nous venons de modifier.
sudo cp /etc/php7/cli/php.ini /etc/php7/fpm

Modification de /etc/php7/fpm/php-fpm.conf
Pour faire redémarrer FPM en cas d’erreurs répétées dans un laps de temps.
Ajuster les lignes du fichier comme suit :
pid = /var/run/php-fpm.pid

error_log = /var/log/php-fpm.log
 
emergency_restart_threshold = 10
 
emergency_restart_interval = 1m
 
process_control_timeout = 10s

Mise à jour permission
Important car a empêché la connexion dans Nextcloud malgré les bons nom d’utilisateur et mot de passe.
sudo chown nginx:nginx /var/lib/php7

Création hôte virtuel Nextcloud dans NGINX
A noter que mon serveur nextcloud sera appelé par un sous-répertoire de mon nom domaine : https://mon_domaine/nextcloud
Mon fournisseur internet (free) me permet de créer gratuitement un nom de domaine (avec extension hd.free.fr) qui pointe vers mon serveur. Il ne faudra pas oublier sur la freebox de faire un transfert de port vers l’adresse IP de la machine qui sert de serveur.
Créer le fichier /etc/nginx/vhosts.d/nextcloud.conf (c’est une version sans certificat SSL car certbot s’en chargera ensuite) comme suit et en modifiant mon_domaine par votre nom de domaine :

https://www.alionet.org/index.php?action=dlattach;sa=tmpattach;attach=post_tmp_33_83030c2fc6f295c1024556022389228a;topic=0

Pare-feu
Avec Yast, autoriser http et https

Install Letsencrypt avec Certbot
On peut obtenir un certificat SSL gratuitement grâce à Let’s Encrypt.
Installation du client certbot conseillé par Let’s Encrypt. J’installe aussi le plugin nginx qui fera la modification du fichier nextcloud.conf
sudo zypper in python3-certbot-nginx

Pour obtenir le certificat, lancer la commande suivante et en remplaçant mon_email et mon_domaine par les vôtres :
sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email[color=red] mon_email[/color] -d [color=red]mon_domaine[/color] --rsa-key-size 4096

Modification du ficher SSL créé par CERTBOT
Recommendation de sites comme SSLAB d’arrêter d’utiliser TLSv1
sudo nano /etc/letsencrypt/options-ssl-nginx.conf

remplacer :
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
par :
ssl_protocols TLSv1.3 TLSv1.2;

cron de renouvellement des certificats
En effet, au bout de 3 mois le certificat expire. Il faut le renouveler et pour cela un script cron est créé (source : sogal)
Créer script cron certbot à placer dans /etc/cron.weekly/

sudo nano /etc/cron.weekly/certbot

#!/bin/sh
# Stop nginx first
systemctl stop nginx
# Renew certs
certbot --standalone renew
# Restart nginx
systemctl start nginx

Penser à le rendre exécutable:
chmod +x /etc/cron.weekly/certbot

MariaDB

Installation par :
zypper in mariadb

puis initialiser par :
sudo rcmysql start

Securisation de MariaDB
sudo mysql_secure_installation
Vous allez devoir répondre aux questions comme suit :
Switch to unix_socket authentication [Y/n] N
Enter current password for root (enter for none): <ENTER>
Set root password? [Y/n] Y
[i]Entrer votre mot de passe et s’en rappeler[color=red][/color][/i]
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

Création de la base de données
    • Nom de la base de données : nextcloud
    • Son administrateur nextcloud_admin
    • le mot de passe associé admin_password

sudo mysql -uroot -p
> CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER nextcloud_admin@localhost IDENTIFIED BY 'admin_password'; GRANT ALL PRIVILEGES on nextcloud.* to nextcloud_admin@localhost; FLUSH privileges; quit;

Installation serveur Nextcloud
    • Télécharger l’archive depuis le site de Nextcloud et la décompresser
    • Copier le répertoire nextcloud dans /srv/www (ATTENTION : l’archive décompressée contient un sous-répertoire avant celui de nextcloud…)
    • Puis donner le bon propriétaire (nginx) :
       
chown -R nginx:nginx /var/www/nextcloud

J’ai placé la base de données nextcloud dans un répertoire en-dehors de /srv/www/nextcloud
J’ai créé le répertoire /data/nextcloud_data   pour cela :
sudo mkdir /data/nextcloud_data
puis   
sudo chown -R nginx:nginx /data/nextcloud_data

Lancer ensuite un navigateur internet (firefox par exemple) et taper l’adresse : https://mon_domaine/nextcloud

Vous obtiendrez l’interface de configuration de nextcloud.
Il faut créer l’utilisateur administrateur et entrer les informations de la configuration de la base de données mysql créée précédemment dans la section mariadb.

Ajout d’un cronjob pour Nextcloud
   
su -
crontab -u nginx -e
et taper :
*/5 * * * * php -f /srv/www/nextcloud/cron.php > /dev/null 2>&1

APCU cache pour Nextcloud
Pour améliorer les performances, ajouter dans le fichier /srv/nextcloud/config/config.php :
'memcache.local' => '\OC\Memcache\APCu',

FAIL2BAN
C’est pour bannir les adresses IP de personnes malveillantes qui tenteraient de s’identifier sur le serveur.
Au bout de 3 tentatives infructueuses de connexion, l’adresse IP sera bannie.

Installation de fail2ban :
zypper in fail2ban

(7 paquets d'installés :  ed fail2ban libgamin-1-0 python2-pyinotify python2-systemd python-gamin whois)

Ajouter des lignes suivantes dans /etc/fail2ban/filter.d/nextcloud.conf

[Definition]
failregex=^{"reqId":".*","remoteAddr":".*","app":"core","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)","level":2,"time":".*"}$
            ^{"reqId":".*","level":2,"time":".*","remoteAddr":".*","app":"core".*","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)".*}$
            ^.*\"remoteAddr\":\"<HOST>\".*Trusted domain error.*$

Création d’un nouveau fichier prison pour nextcloud :
nano /etc/fail2ban/jail.d/nextcloud.local

et y copier les lignes suivantes :
[nextcloud]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 3
bantime = 36000
findtime = 36000
logpath = /data/nextcloud_data/nextcloud.log
[nginx-http-auth]
enabled = true 

Redémarrer fail2ban-service et vérifier son statut :
sudo systemclt restart fail2ban
sudo fail2ban-client status nextcloud
Qui donne le résultat suivant :
Status for the jail: nextcloud
|- Filter
|  |- Currently failed: 0
|  |- Total failed: 0
|  `- File list: /data/nextcloud_data/nextcloud.log
`- Actions
   |- Currently banned: 0
   |- Total banned: 0
   `- Banned IP list:

Pour contrôler les IP bannies
sudo fail2ban-client status nextcloud 

Pour autoriser à nouveau une IP
sudo fail2ban-client set nextcloud unbanip ip_address

Vous pouvez aussi par la suite faire en sorte que fail2ban vous envoie un email en cas de blocage (configurer postfix pour cela).

Et voilà. Pour moi cela fonctionne du tonnerre.  8)
J’espère que cela pourra aider quelqu’un à se lancer !
N’oublier pas de faire des sauvegardes régulières de vos données et serveurs (voir documentation sur nextcloud.com).
Bien entendu, comme dit la maxime de nos jours, je me dois de décliner toute responsabilité en cas de perte de données ou de réinstallation du système...

A bientôt !

Christian

 

Re : Tuto d'installation serveur Nextcloud sous Leap 15.1

Répondre #1
Super tuto, merci bien ! Ça mériterai d'être converti en Markdown pour être publié sur le blog Alionet ;)

En terme de sécurité, je suppose que tu as pris la config nginx recommandée dans la doc Nextcloud, mais à toutes fins utiles voici quelques en-têtes HTTP qu'il est important de définir:

        add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
        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 Referrer-Policy no-referrer;
        add_header X-Frame-Options "SAMEORIGIN";

afin d'assurer notamment les politiques en matière de SSL, de protection contre le cross-site scripting, l'intégration de frames etc...

Bravo pour la configuration de fail2ban, c'est pas toujours facile de le paramétrer. Si ce n'est pas fait, penser à ajouter ton IP à la liste blanche ;)
À noter que Nextcloud embarque nativement un module de sécurité anti brute-force permettant de retarder de 30 secondes les connexions en provenance d'une IP suspecte. Si tu as un proxy devant, il pourrait se retrouver bloqué par ce mécanisme (puisque toutes les requêtes seront vues comme émanant de son IP), penser alors à le whitelister en ajouter ces lignes au fichier config.php de Nextcloud:

  'trusted_proxies' => array('<IP.DU.PROXY/NET>'),
  'forwarded_for_headers' => array('HTTP_X_FORWARDED_FOR'),

En tout cas bravo et merci du partage !

Re : Tuto d'installation serveur Nextcloud sous Leap 15.1

Répondre #2
Bonjour et merci Sogal

Je vais regarder l'histoire des entêtes. Effectivement, j'ai pris le fichier recommandé dans le manuel Nextcloud.

Pour fail2ban, je vais regarder aussi la liste blanche ; je n'ai pas réalisé que cela existait.

J'ai désactivé l'extension Force Brute de Nextcloud car j'ai lu quelques part que FAIL2BAN bloquerait ce type d'attaque. Ai-je bien fait ?

Tu mentionnes en intro un format Markdown pour ce post. Si cela peut aider, je veux bien regarder. Par contre, je ne sais pas du tout ce que c'est :-[
Il faudrait m'indiquer au moins une doc à regarder.

A bientôt


Re : Tuto d'installation serveur Nextcloud sous Leap 15.1

Répondre #3
Salut,

Pour la liste blanche fail2ban, dans ton jail.local tu peux ajouter, dans la section [DEFAULT]

ignoreip = 127.0.0.1/8 xxx.xxx.xxx.xxx

xxx.xxx.xxx.xxx est une IP ou une liste d'IP séparées par des espaces

Concernant Nextcloud, je ne pense pas que ça pose de problème. La fonctionnalité de détection / blocage d'attaque par Force Brute fait très certainement la même chose que ta configuration fail2ban mais uniquement au niveau applicatif. Via fail2ban, tu le fais en amont au niveau du système avec un blocage via iptables mais en te basant au final sur les logs.
Je fais un peu différemment. Mes Nextcloud sont installés via Docker devant lesquels il y a un reverse proxy (HAProxy en l'occurence). Je laisse le module Brute Force de Nextcloud activé et j'active fail2ban pour repérer les attaques par déni de service sur les logs de HAProxy. De la sorte ma config fail2ban protège tous les sites servis par HAProxy et non uniquement Nextcloud (ce dernier dispose en plus de la protection de son module BruteForce).

Pour le Markdown, c'est très simple, c'est un langage à balise ultra simplifié. Voir ici pour débuter: https://commonmark.org/help/
C'est le format qu'on utilise pour publier les articles du blog. Si tu as 5 min pour copier/coller ton post, mettre les balises qui vont bien au bon endroit, je le publierai ensuite.

Re : Tuto d'installation serveur Nextcloud sous Leap 15.1

Répondre #4
Merci sogal.

Pour les headers, j'ai bien ceux que tu préconises. Il y a juste l'option preload qui n'est pas présente pour Strict-Transport-Security.
En fait, tous les headers étaient activés dans le fichier fourni par la documentation NEXTCLOUD. Le Strict-Transport-Security a lui été mis en place par CERTBOT dans le fichier NGINX de mon hôte Nextcloud ; et donc sans l'option preload.
Cette option preload semble controversée et j'avoue humblement que je ne sais pas quoi en penser...

Pour la liste blanche, effectivement, j'ai trouvé cela dans la doc de FAIL2BAN et c'est bien cohérent avec ce que tu suggères.

Je vais regarder ce que je peux faire pour mettre au "format" Markdown. Y a-t-il aussi une limite de 20000 caractères comme pour un post sur le forum ? Je te passe cela comment ? Par MP ?

A+

Re : Tuto d'installation serveur Nextcloud sous Leap 15.1

Répondre #5
Coucou,  tu as de tres bon programmes qui te permettent de juste copier le html pour que ça te le sorte en markdown, ou sinon directement de "comme on le vois à l'écran" vers du markdown, dans ce cas, tu peux regarder Typora (c'est pas libre juste la version de dev est plus ou moins libre de mémoire). https://www.typora.io/

Re : Tuto d'installation serveur Nextcloud sous Leap 15.1

Répondre #6
Merci

En fait j’ai fait cela à la mano puis vérifié et corrigé avec Remarkable
J’ai envoyé un lien vers le fichier en MP à Sogal mais je me demande s’il l’a reçu. Je n’ai pas de nouvelles et je ne trouve pas de dossier Message envoyé dans la messagerie.

Sogal, as-tu reçu quelque chose ?

A+

Re : Tuto d'installation serveur Nextcloud sous Leap 15.1

Répondre #7
Un bon boulot, vraiment !

Félicitations !

Re : Tuto d'installation serveur Nextcloud sous Leap 15.1

Répondre #8
Merci silfax. J’apprécie d’autant que je ne suis pas un pro (et j’y ai donc passé du temps !  :P ).
D’ailleurs, n’hésite pas à me suggérer des améliorations.

A+


Re : Tuto d'installation serveur Nextcloud sous Leap 15.1

Répondre #10
Merci sogal.
Je suis trop honoré  :-[

Re : Tuto d'installation serveur Nextcloud sous Leap 15.1

Répondre #11
Super boulot ! Merci pour le partage

Re : Tuto d'installation serveur Nextcloud sous Leap 15.1

Répondre #12
Superbe !

DIVISER: Installation de Remarkable

Répondre #13
Un ou plusieurs messages de ce sujet ont été déplacés vers openSUSE - Général : https://www.alionet.org/index.php?topic=74.0
Motif: pas de rapport avec l'installation de Nextcloud, nombre de messages hors sujet suffisant pour justifier la création d'un nouveau sujet.