dimanche 26 mars 2017

Installation de Nextcloud sur un Raspberry Pi

Dans ce tuto, nous allons installer Nextcloud, fork de ownCloud, sur un raspberrypi. Les données seront stockées sur une clé usb, la base de donnée utilisée est mariadb la version de php installée sera php7. Le serveur sera securisé grâce à fail to ban et ufw (uncomplicated fire wall). La connexion sera sécurisée grâce à un certificat let's encrypt. Ce tuto part du principe que vous avez déjà un nom de domaine. Si vous n'en avez pas, vous pouvez utiliser no-ip ou un autre fournisseur de ce type de service et adapter le tuto à vos besoins (très simple).

Premièrement la clé usb qui acceuillera vos données doit etre insérée et montée automatiquement à chaque (re)boot.

1) Brancher votre clé ou votre disque externe.

2) Ma clé était formatée en NTFS, installons le paquet qui permet de travailler avec ce système de fichiers:
sudo apt-get install ntfs-3g

3) Créer le répertoire qui va accueillir le "mount" du disque:
sudo mkdir /media/cloudata

4) Monter le disque dans notre répertoire fraichement créé au point précédent (cette commande est valable pour le système de fichiers NTFS, pour tout autre système de fichier que vous souhaitez utiliser, changer la commande comme il se doit):
sudo mount -t ntfs-3g -o uid=1000,gid=1000,umask=007 /dev/sda1 /media/cloudata

5) Trouver le UUID du disque USB que nous venons de brancher au point 18, c'est une suite de chiffres ressemblant à ça:4264E66D64E66361 normalement en bleu et associé à sda1 avec la commande ci-dessous:
ls -l /dev/disk/by-uuid/

6) Si comme moi, vous êtes nul et que vous avez de gros doigts gras qui ne vous obéissent pas toujours comme vous le souhaiteriez, choisir la sécurité et faire un backup du fichier fstab:
sudo cp /etc/fstab /etc/fstab.backup

7) Editer fstab et ajouter le UUID de votre clé ou disque externe USB que vous avez trouvé au point 22 (vous suivez?):
sudo nano /etc/fstab

Ne pas effacer ce qui est déjà dans le fichier, mais copier-coller cette ligne tout en bas (remplacer le UUID de cette ligne par celui de votre disque)
UUID=4264E66D64E66361 /media/owncloud ntfs-3g uid=1000,gid=1000,umask=007 0 0

8) Reboot du Pi et vérifier si la clé est montée correctement
mount

9) Installer Apache2
sudo apt-get install apache2 -y

10) Pour installer PHP7 il faut ajouter le dépôt
sudo nano /etc/apt/sources.list

11) ajouter la ligne suivante
deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi

12) Créer un fichier pour continuer
sudo nano /etc/apt/preferences

13) Coller ces lignes
Package: *
Pin: release n=jessie
Pin-Priority: 600

14) Installer php7 et tout ce qu'il faut pour que la cache soit activée et que ça fonctionne avec mariadb, exécuter les commandes suivantes dans l'ordre:
sudo apt-get update
sudo apt-get install -t stretch php7.0 php7.0-curl php7.0-gd php7.0-fpm php7.0-cli php7.0-opcache php7.0-mbstring php7.0-xml php7.0-zip -y
sudo apt-get install php7.0-APC -y
sudo apt-get install mysql-server php7.0-mysql -y
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php7.0-fpm
sudo service apache2 reload
sudo apt-get install libxml2-dev php-zip php-dom php-xmlwriter php-xmlreader php-gd php-curl php-mbstring -y
sudo a2enmod rewrite
sudo service apache2 restart

15) Installer MariaDB:
sudo apt-get install mariadb-server -y
   
16) Créer une redirection vers l'installation de Nextcloud
cd /var/www/html
sudo nano index.html

Ajouter la ligne suivante où "nextcloud.nomdedomaine.com." doit être l'adresse qui pointe sur votre serveur.
    <meta http-equiv="refresh" content="0; URL='http://nextcloud.nomdedomaine.com/nextcloud'" />

17) Installer Nextcloud:
cd /var/www/
sudo wget https://download.nextcloud.com/server/releases/nextcloud-10.0.0.zip
sudo unzip nextcloud-10.0.0.zip
sudo rm nextcloud-10.0.0.zip
cd /

18) Ajuster les permissions grâce à un script:
cd /home/pi
nano permissions.sh

Coller le code suivant dans le fichier créé
#!/bin/bash

ocpath='/var/www/nextcloud'

htuser='www-data'

htgroup='www-data'

rootuser='root'


printf "Creating possible missing Directories\n"

mkdir -p $ocpath/data

mkdir -p $ocpath/assets

mkdir -p $ocpath/updater


printf "chmod Files and Directories\n"

find ${ocpath}/ -type f -print0 | xargs -0 chmod 0640

find ${ocpath}/ -type d -print0 | xargs -0 chmod 0750


printf "chown Directories\n"

chown -R ${rootuser}:${htgroup} ${ocpath}/

chown -R ${htuser}:${htgroup} ${ocpath}/apps/

chown -R ${htuser}:${htgroup} ${ocpath}/assets/

chown -R ${htuser}:${htgroup} ${ocpath}/config/

chown -R ${htuser}:${htgroup} ${ocpath}/data/

chown -R ${htuser}:${htgroup} /media/cloudata

chown -R ${htuser}:${htgroup} ${ocpath}/themes/

chown -R ${htuser}:${htgroup} ${ocpath}/updater/

chown -R ${htuser}:${htgroup} /tmp


chmod +x ${ocpath}/occ


printf "chmod/chown .htaccess\n"

if [ -f ${ocpath}/.htaccess ]

then

 chmod 0644 ${ocpath}/.htaccess

 chown ${rootuser}:${htgroup} ${ocpath}/.htaccess

fi
 
if [ -f ${ocpath}/data/.htaccess ]

then

 chmod 0644 ${ocpath}/data/.htaccess

 chown ${rootuser}:${htgroup} ${ocpath}/data/.htaccess

fi

Rendre le script exécutable et le lancer
chmod +x permissions.sh
sudo ./permissions.sh

19) Configurer Apache2 en modifiant le fichier nextcloud.conf
cd /etc/apache2/sites-available
nano nextcloud.conf

Coller ceci dans le fichier:
Alias /nextcloud "/var/www/nextcloud/"

<Directory /var/www/nextcloud/>
 Options +FollowSymlinks
 AllowOverride All

<IfModule mod_dav.c>
 Dav off
</IfModule>

SetEnv HOME /var/www/nextcloud
SetEnv HTTP_HOME /var/www/nextcloud

</Directory>

Puis lancer dans l'ordre les commandes suivantes:
ln -s /etc/apache2/sites-available/nextcloud.conf /etc/apache2/sites-enabled/nextcloud.conf

a2enmod headers

a2enmod env

a2enmod dir

a2enmod mime

a2enmod ssl

a2ensite default-ssl

service apache2 reload

20) Mettre en place la base de données en commençant par se loguer en root à la base de données:
mysql -u root -p

Puis lancer les commandes suivantes dans l'ordre. Je vous conseille fortement de remplacer MOTDEPASSE par un mot de passe fort de votre cru, souvenez-vous en, nous en aurons besoin plus tard.
CREATE DATABASE nextcloud;

CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'MOTDEPASSE';

GRANT ALL PRIVILEGES ON nextcloud.* TO nextclouduser@localhost;

EXIT

21) Mettre en place le certificat ssl de let's encrypt:
sudo apt install git -y

cd /etc

sudo git clone https://github.com/letsencrypt/letsencrypt

cd letsencrypt

sudo ./letsencrypt-auto

crontab -e

Copier la ligne suivante au bas du fichier:
30 1 * * 1 root /etc/letsencrypt/certbot-auto renew --quiet

22) Si tout s'est bien passé, nous sommes prêts à nous connecter à notre interface pour terminer l'installation de Nextcloud par la génération des fichiers de configuration.
Ouvrir votre navigateur préféré et taper l'adresse qui devrait vous amener à votre cloud. Créer un utilisateur d'administration et changer le chemin des données pour pointer le disque usb.
/media/cloudata

En ce qui concerne la base de données, renseigner les champs comme ceci, en utilisant le mot de passe que vous avez choisi à l'étape 20
nextclouduser

MOTDEPASSE

nextcloud
   
Si il y a un message d'erreur signalant que le dossier des données ne peut pas être écrit, ça m'est arrivé, essayer ceci:
sudo usermod -a -G pi www-data

23) Activer le Mem Cache, cela peut paraître facultatif et le serveur fonctionnera sans, mais ce sera plus lent et vous aurez des messages d'erreur dans la console d'administration...
sudo nano /var/www/nextcloud/config/config.php


Juste avant ); insérer:
'memcache.local' => '\OC\Memcache\APC',

24) Un petit "clean" qui ne fera pas de mal... ;)
sudo apt-get clean

25) Définir la taille maximale de fichiers
cd /var/www/nextcloud

sudo nano .htaccess

Trouver la ligne php_value upload_max_filesize 512M et la ligne php_value post_max_size 512M
Changer les deux valeurs à celle souhaitée, si souhaité utiliser G pour gigas à la place de M
sudo nano .user.ini

Trouver la ligne upload_max_filesize=512M et post_max_size=512M
Changer les valeurs par la même que défini à l'étape précédente et ne pas oublier de changer le M en G, si besoin...

26) Éviter les attaques de l'homme du milieu:
cd /etc/apache2
sudo nano apache2.conf

A la fin du fichier, ajouter ce qui suit:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
</IfModule>

27) Reboot et vérification que tout fonctionne bien
sudo reboot

Félicitations! Vous avez fait un grand pas pour vous éloigner des GAFAM! La route n'a pas été si difficile, n'est-ce pas?
Maintenant, avec plus d'indépendance et de liberté, viennent immanquablement plus de responsabilités. Vous êtes responsables de votre matériel et de vos données. A vous de faire en sorte que tout fonctionne comme souhaité et que vos données soient raisonnablement protégées contre les regards indiscrets. La suite du tutoriel est à votre on vouloir et n'est en aucun cas obligatoire pour que le serveur fonctionne bien. Cependant, je vous encourage vivement de le suivre. Je ne suis pas un expert en sécurité et il y a peut-être des aberrations (merci de les relever dans les commentaires)... Faites vos propres recherches et agissez en fonction.


28) Installer et activer fail2ban pour les logins (Basé sur: https://forum.owncloud.org/viewtopic.php?f=8&t=28678):
sudo apt-get install fail2ban

Puis créer un fichier nextcloud.conf:
sudo nano /etc/fail2ban/filter.d/nextcloud.conf

Coller dans ce fichier les lignes suivantes:
[Definition]
failregex={"reqId":".*","remoteAddr":".*","app":"core","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)","level":2,"time":".*"}

ignoreregex =

Créer un fichier jail.local:
sudo nano /etc/fail2ban/jail.local

Coller dans ce fichier les lignes suivantes:   
[nextcloud]
enabled = true
filter  = nextcloud
# selectionner http, https ou les deux, en fonction de vos besoins:
port    =  http,https
# modifier le chemin des logs si besoin:
logpath = /var/www/nextcloud/data/nextcloud.log

Activer fail2ban par cette suite de commandes:
sudo service fail2ban start
sudo service fail2ban reload
sudo service fail2ban status

Vérifier périodiquement les logs de fail2ban:
nano /var/log/fail2ban.log

29) Installer ufw (uncomplicated firewall):
sudo apt install ufw

Rejeter par défaut tous les paquets:
sudo ufw default deny

Il peut être utile de désactiver les IP v6, à voir si cela vous est utile...
sudo nano /etc/default/ufw
Changer la ligne 7:
IPV6=no

Permettre la connexion SSH depuis le réseau local uniquement. Si votre réseau local n'est pas 192.168.1.0/24 , il faut modifier le code suivant à votre convenance.
sudo ufw allow proto tcp from 192.168.1.0/24 to any port 22

Permettre le port 443 pour le https depuis internet.
sudo ufw allow 443/tcp

Activer le firewall:
sudo ufw enable

Vérifier le statut de ufw:
sudo ufw status

Aucun commentaire:

Enregistrer un commentaire