Installer Nextcloud correctement n’est pas forcément aussi simple que l’on pourrait le croire. Nous allons donc ici détailler l’installation et la configuration d’un serveur Nextcloud avec chiffrement, authentification double facteur ainsi qu’une mise en cache avec redis.
Installer Nextcloud : Pré-requis
Afin de pouvoir installer et configurer correctement Nextcloud doivent être installés sur votre serveur :
- Un serveur MySQL : ici MariaDB
- Un serveur web : ici NGinx
- php : ici php7
- Redis : si vous souhaitez profiter du cache
Installer Nextcloud : Configuration du serveur MySQL
Nous allons devoir modifier la configuration de notre serveur MySQL sans quoi il serait impossible d’installer Nextcloud. MySQL conserve un journal des transactions en écritures effectuées (insert et update) et cette journalisation peut s’effectuer selon différents modes :
- mode statement : les données sont journalisées sous forme de requêtes (par défaut)
- mode row : les données sont journalisées sous forme de lignes
- mode mixed : MySQL détermine en fonction du contexte si la journalisation doit se faire en mode statement ou row
Or Nextcloud requiert que le mode mixte soit activé, modifions alors le fichier de configuration MySQL
sudo nano /etc/mysql/my.cnf
Dans le bloc [mysqld] ajoutons
binlog-format=mixed
Redémarrons maintenant MariaDB
sudo systemctl restart mariadb
Installer Nextcloud : Création de la base de données
Nous allons créer une base de données et un utilisateur MySQL dédiés à l’utilisation de Nextcloud. Dans cette exemple nous utiliserons nextcloud_db
comme bdd, nextcloud_user
comme utilisateur et nextcloud_password
comme mot de passe.
mysql -u root -p <mysql root password> mysql> CREATE DATABASE nextcloud_db; mysql> GRANT ALL PRIVILEGES ON nextcloud_db.* TO 'nextcloud_user'@'localhost' -> IDENTIFIED BY 'nextcloud_password'; mysql> FLUSH PRIVILEGES;
Installer Nextcloud : Configuration du serveur web
Passons maintenant à la configuration de NGinx. Commencons par ajouter un vhost
sudo nano /etc/nginx/sites-enabled/cloud.mondomaine.tld
Copions puis collons la configuration suivante dans notre nouveau vhost. N’oubliez pas de la modifier en fonction de vos besoins et de votre version de NGinx.
#------------------------------------------------------------------------ # REDIRECTION HTTPS # server { listen 80; server_name cloud.mondomaine.tld; return 301 https://cloud.mondomaine.tld$request_uri; location '/.well-known/acme-challenge' { root /var/www/html/www.mondomaine.tld/; allow all; try_files $uri /$1;} } #------------------------------------------------------------------------ # BLOCK SERVEUR HTTPS # server { listen 443 ssl http2; server_name cloud.mondomaine.tld; root /var/www/html/cloud.mondomaine.tld; index index.php index.html index.htm; #------------------------------------------------------------------------ # SSL # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ecdh_curve secp384r1; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305-D:ECDHE-RSA-CHACHA20-POLY1305-D:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA384'; ssl_prefer_server_ciphers on; ssl_certificate /etc/nginx/ssl/cloud.mondomaine.tld/privatekey.key; ssl_certificate_key /etc/nginx/ssl/cloud.mondomaine.tld/chain.pem; ssl_trusted_certificate /etc/nginx/ssl/cloud.mondomaine.tld/chain.pem; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.4.4 8.8.8.8 valid=300s; resolver_timeout 5s; add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"; add_header Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'" always; add_header X-Content-Type-Options nosniff always; add_header X-Xss-Protection "1; mode=block" always; add_header X-Robots-Tag none; add_header X-Download-Options noopen; add_header X-Permitted-Cross-Domain-Policies none; #------------------------------------------------------------------------ # PHP # location = /robots.txt { allow all; log_not_found off; access_log off; } # The following 2 rules are only needed for the user_webfinger app. # Uncomment it if you're planning to use this app. #rewrite ^/.well-known/host-meta /public.php?service=host-meta last; #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json # last; location = /.well-known/carddav { return 301 $scheme://$host/remote.php/dav; } location = /.well-known/caldav { return 301 $scheme://$host/remote.php/dav; } # set max upload size client_max_body_size 512M; # Disable gzip to avoid the removal of the ETag header gzip off; # Uncomment if your server is build with the ngx_pagespeed module # This module is currently not supported. #pagespeed off; error_page 403 /core/templates/403.php; error_page 404 /core/templates/404.php; location / { rewrite ^ /index.php$uri; } location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ { deny all; } location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { deny all; } location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) { include fastcgi_params; fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param HTTPS on; #Avoid sending the security headers twice fastcgi_param modHeadersAvailable true; fastcgi_param front_controller_active true; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_intercept_errors on; fastcgi_request_buffering off; } location ~ ^/(?:updater|ocs-provider)(?:$|/) { try_files $uri/ =404; index index.php; } location ~* \.(?:css|js)$ { try_files $uri /index.php$uri$is_args$args; add_header Cache-Control "public, max-age=7200"; access_log off; } location ~* \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ { try_files $uri /index.php$uri$is_args$args; # Optional: Don't log access to other assets access_log off; } #------------------------------------------------------------------------ # LETSENCRYPT # location '/.well-known/acme-challenge' { root /var/www/html/www.mondomaine.tld/; allow all; try_files $uri /$1;} }
Installer Nextcloud : Téléchargement de Nextcloud
Téléchargeons et décompressons Nextcloud à la racine de notre serveur web puis renommons le dossier Nextcloud en fonction de nos besoins.
cd /var/www/html/ sudo wget https://download.nextcloud.com/server/releases/nextcloud-10.0.1.zip sudo unzip nextcloud-10.0.1.zip sudo mv nextcloud cloud.mondomaine.tld
Accordons les droits à notre serveur web sur ce dossier
sudo chown -R www-data.www-data /var/www/html/cloud.mondomaine.tld
Installer Nextcloud : Installation de Nextcloud
Connectons nous sur notre domaine Nextcloud tel que configuré sur notre vhost NGinx. Choisissons un nom d’utilisateur et un mot de passe pour l’administrateur du serveur puis indiquons les paramètres de connexion à notre base de données
Installer Nextcloud : Optimiser Nextcloud avec Redis
Nous allons à présent configurer redis comme serveur de cache pour Nextcloud, nous devons donc modifier la configuration de notre serveur Nextcloud
sudo nano /var/www/html/cloud.loktby.me/config/config.php
A la fin de ce fichier ajoutons avant la dernière ligne );
le code suivant
'memcache.local' => '\\OC\\Memcache\\Redis', 'filelocking.enabled' => 'true', 'memcache.distributed' => '\\OC\\Memcache\\Redis', 'memcache.locking' => '\\OC\\Memcache\\Redis', 'redis' => array ( 'host' => 'localhost', 'port' => 6379, 'timeout' => 0, 'dbindex' => 0, ),
Enfin vérifiez que tout fonctionne correctement via l’interface cli de redis
sudo redis-cli monitor
En parallèle connectez vous à votre instance de NextCloud. Si tout fonctionne correctement vous devriez voir en temps réel votre serveur redis répondre a des requêtes depuis le cache.
root@noobunbox:~$ redis-cli monitor OK 1475405848.235951 [0 127.0.0.1:47048] "GET" "xxxxxxxxxxxxxxxxx/AutoloaderOC_User" 1475405848.241654 [0 127.0.0.1:47048] "GET" "xxxxxxxxxxxxxxxxx/AutoloaderOC_Hook" 1475405848.246273 [0 127.0.0.1:47048] "GET" "xxxxxxxxxxxxxxxxx/AutoloaderOC_Helper" 1475405848.247115 [0 127.0.0.1:47048] "GET" "xxxxxxxxxxxxxxxxx/AutoloaderOC_Response" 1475405848.248164 [0 127.0.0.1:47048] "GET" "xxxxxxxxxxxxxxxxx/AutoloaderOC_Defaults"
Installer Nextcloud : Mise en place du chiffrement
Nextcloud nous permet de chiffrer les données, coté serveur seulement. Afin de configurer le chiffrement ajoutons une application.
Naviguons vers l’onglet Désactivées et activons l’extension Default encryption module
Une fois l’extension activée rendons nous dans le panel d’administration puis naviguons vers l’onglet Encryption. Enfin cochons la case Activer le chiffrement côté serveur.
Déconnectons et reconnectons nous afin d’initialiser nos clefs. A noter qu’une fois reconnecté vous pouvez si vous le souhaitez configurer une clé de récupération, c’est à dire une clé supplémentaire utilisée pour chiffrer les fichiers. Elle permet de récupérer les fichiers des utilisateurs s’ils oublient leur mot de passe (si et seulement ils activent l’option Activer la récupération du mot de passe sur leur compte).
Installer Nextcloud : Mise en place de l’authentification double facteur
Afin de mieux sécuriser notre installation nous allons mettre en place une authentification double facteur sur notre serveur Nextcloud. Commençons donc par ajouter une nouvelle application. Puis naviguons vers l’onglet Tool et activons l’extension TOTP TwoFactor (Google Authenticator)
Désormais chaque utilisateur utiliser la double authentification après l’avoir activée dans les options de son compte