vendredi 11 septembre 2015

Raspberry Pi 2: installation d'un serveur owncloud 8.x

Ce tuto vise à obtenir un serveur owncloud 8 sur un Raspberry Pi 2 modèle B. Pourquoi encore un tuto la dessus, il y en a plein à travers le net... Oui, mais il y a quelques petites subtilités avec la version 8.1 et il s'agit ici de créer un serveur utilisable (pas seulement pour tester) et un minimum sécurisé, autant au niveau de la sauvegarde des données que des menaces externes.
Globalement, la base de donnée est MySQL qui permet de gérer plusieurs utilisateurs. Les données sont placées sur une clé USB (un disque dur USB fera aussi très bien l'affaire), les données sont dupliquées sur une autre clé USB et automatiquement mises à jour régulièrement (PARTIE DU TUTO A VENIR - pas terminée...) et naturellement le serveur est accessible depuis tout l'internet mondial de la planète par une connexion sécurisée SSL (https) avec un certificat autosigné.

Matériel:

  • RPI2 et ce qu’il faut pour le faire fonctionner (carte mico-sd, alimentation, ...)
  • Clé ou disque USB

1) Installer Raspian

2) Allumer le Raspberry, se loguer avec l'utilisateur Pi et réaliser les premières manipulations: changer le mot de passe de pi, définissez le hostname, changer la valeur du split GPU memory à 16 et surtout activez le ssh.

Si vous avez déjà effectué certaines manipulations lors d'une installation précédente, il est possible de rappeler l'outil d'initialisation: 
sudo raspi-config

3) Mettre à jour:
sudo apt-get update && sudo apt-get upgrade

4) Ajouter les utilisateurs au groupe www-data:
sudo usermod -a -G www-data www-data
5) Installer les paquets requis (le serveur nginx, MySQL, ...):
sudo apt-get install nginx openssl ssl-cert php5-cli php5-sqlite php5-gd php5-common php5-cgi sqlite3 php-pear php-apc libapr1 libtool curl php5-curl libcurl4-openssl-dev php-xml-parser php5 php5-dev php5-gd php5-fpm memcached php5-memcache varnish mysql-server php5-mysql
Vous pouvez aller vous faire un thé detox, manger une pomme tout en regardant les lignes défiler poétiquement. On prend soin de notre vie privée, de nos petits serveurs, autant aussi prendre soin de soi-même!

6) Installer MySQL de façon sécurisée, répondre attentivement à toutes les questions, il n'est pas nécessaire de changer le mot de passe root de MySQL puisqu'il est demandé en premier. Ainsi, il est possible de répondre: n - y - y - y - y
sudo mysql_secure_installation
7) Lancer MySQL en ligne de commande et saisir le mot de passe root de MySQL défini à l'étape précédente:
mysql -uroot -p
8) Créer une base de données (ici elle est nommée "owncloud"):
CREATE DATABASE owncloud;
9) Créer un utilisateur pour la base de données et remplacez moi ce "mot_de_passe" par un mot de passe de votre cru:
GRANT ALL ON owncloud.* TO 'owncloud'@'localhost' IDENTIFIED BY 'mot_de_passe';
Quitter ensuite MySQL
quit
9 bis - FACULTATIF) La configuration de PHP avec MySQL et pointer les socket correctement peut aider à avoir de meilleures performances:
sudo nano /etc/php5/conf.d/mysql.ini
et tout remplacer par cela:

# configuration for PHP MySQL module
extension=pdo_mysql.so
extension=mysql.so

[mysql]
mysql.allow_local_infile=On
mysql.allow_persistent=On
mysql.cache_size=2000
mysql.max_persistent=-1
mysql.max_links=-1
mysql.default_port=
mysql.default_socket=/var/run/mysqld/mysqld.sock
mysql.default_host=
mysql.default_user=
mysql.default_password=
mysql.connect_timeout=60
mysql.trace_mode=Off

 
10) La base de données est en place, occupons nous du serveur nginx et des certificats ssl. Ici, les certificats durent 730 jours, sentez vous libre de mettre ce que vous souhaitez. Mais éviter si possible de mettre des durées délirantes comme 100 ans...
sudo openssl req $@ -new -x509 -days 730 -nodes -out /etc/nginx/cert.pem -keyout /etc/nginx/cert.key
11) Modifier les privilèges des deux fichiers:
sudo chmod 600 /etc/nginx/cert.pem
sudo chmod 600 /etc/nginx/cert.key
12) Accéder à la configuration du serveur web (nginx):
sudo nano /etc/nginx/sites-available/default
13) Remplacer le contenu par ce qui suit en remplaçant mon IP locale (192.168.0.18) par celle de votre PI ou votre IP publique si vous souhaitez pouvoir accéder depuis l'extérieur:
upstream php-handler {
  server 127.0.0.1:9000;
  #server unix:/var/run/php5-fpm.sock;
  }

server {
  listen 80;
  server_name 192.168.0.18;
  # enforce https
  return 301 https://$server_name$request_uri;
  }

server {
  listen 443 ssl;
  server_name 192.168.0.18;

  ssl_certificate /etc/nginx/cert.pem;
  ssl_certificate_key /etc/nginx/cert.key;

  # Add headers to serve security related headers
  add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
  add_header X-Content-Type-Options nosniff;
  add_header X-Frame-Options "SAMEORIGIN";
  add_header X-XSS-Protection "1; mode=block";
  add_header X-Robots-Tag none;

  # Path to the root of your installation
  root /var/www/owncloud/;
  # set max upload size
  client_max_body_size 10G;
  fastcgi_buffers 64 4K;

  # 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;

  rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
  rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
  rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

  index index.php;
  error_page 403 /core/templates/403.php;
  error_page 404 /core/templates/404.php;

  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
    }

  location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
    deny all;
    }

  location / {
   # The following 2 rules are only needed with webfinger
   rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
   rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

   rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
   rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

   rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

   try_files $uri $uri/ /index.php;
   }

   location ~ \.php(?:$|/) {
   fastcgi_split_path_info ^(.+\.php)(/.+)$;
   include fastcgi_params;
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   fastcgi_param PATH_INFO $fastcgi_path_info;
   fastcgi_param HTTPS on;
   fastcgi_param modHeadersAvailable true; #Avoid sending the security headers twice
   fastcgi_pass php-handler;
   }

   # Optional: set long EXPIRES header on static assets
   location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
       expires 30d;
       # Optional: Don't log access to assets
         access_log off;
   }

  }

14) Editer php.ini pour permettre la prise en charge de fichiers jusqu'à 2GB:
sudo nano /etc/php5/fpm/php.ini
Rechercher "upload_max_filesize" et changer la valeur à 2000M
Rechercher "post_max_size" et changer la valeur à 2000M

15) Configurer PHP en changeant les valeurs dans les deux fichiers suivants:
sudo nano /etc/php5/fpm/pool.d/www.conf
Et changer:
listen = /var/run/php5-fpm.sock
à :
listen = 127.0.0.1:9000
sudo nano /etc/dphys-swapfile
Et changer:
CONF_SWAPSIZE=100
à :
CONF_SWAPSIZE=512

16) Reboot du Pi:
sudo reboot
17) Installation d'owncloud: télécharger la version actuelle d'owncloud. La version peut varier, au moment de la rédaction de ce tuto, la dernière version est owncloud-8.1.1.
Installer owncloud par cette suite de commandes:
sudo mkdir -p /var/www/owncloud
sudo wget https://download.owncloud.org/community/owncloud-8.1.1.tar.bz2
sudo tar xvf owncloud-8.1.1.tar.bz2
sudo mv owncloud/ /var/www/
sudo chown -R www-data:www-data /var/www
sudo rm -rf owncloud owncloud-8.1.1.tar.bz2
18) Brancher votre clé ou votre disque externe.

19) Ma clé était formatée en NTFS et je ne l'ai pas reformatée. Avec le recul, le format ext4 aurait été mieux adapté. Mais bon, continuons donc avec NTFS et installons le paquet qui permet de travailler avec ce système de fichiers:
sudo apt-get install ntfs-3g
20) Créer le répertoire qui va permettre de "mount" le disque:
sudo mkdir /media/owncloud
21) 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/owncloud
22) 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/
23) 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
24) 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 le votre, soyez pas niais!)
UUID=4264E66D64E66361 /media/owncloud ntfs-3g uid=1000,gid=1000,umask=007 0 0
25) Reboot du Pi (voir point 16)

26) Attribuer les permissions pour le groupe www-data:
sudo usermod -a -G pi www-data
27) Petit gourmand que vous êtes, les valeurs de taille de fichier par défaut ne vous suffiront pas. Il faut donc modifier les valeurs de taille de fichier maximum autorisées dans les fichiers .htaccess et .user.ini:
cd /var/www/owncloud
sudo nano .htaccess
changer les valeurs à 2000M pour les paramètres suivants:
Php_value upload_max_filesize
Php_value post_max_size
Php_value memory_limit
sudo nano .user.ini
changer les valeurs à 2000M pour les paramètres suivants:
upload_max_filesize
post_max_size
memory_limit


28) Reboot du Pi (voir point 16)

29) Ouvrir votre navigateur préféré et visiter l'ip locale du Pi. Terminer l'installation en créant un compte administrateur et faisant bien attention de sélectionner la base de données MySQL en cliquant sur "avancé".

30) Pour accéder à votre serveur depuis une IP externe, vous devez l'ajouter dans la config PHP:
sudo nano var/www/owncloud/config/config.php
et modifiez le fichier en ajoutant une ligne pour votre IP publique ou, si vous possédez un nom de domaine, avec votre nom de domaine associé à l'IP publique du serveur Owncloud.
...
'trusted_domains' =>;
  array (
    0 =>; '192.168.0.18', # IP locale
    1 =>; 'xxx.xxx.xxx.xxx', # IP publique ou nom de domaine à mettre ici
...

31) Faire la redirection de ports (port forwarding) dans votre routeur. Cette manipulation simple est différente pour chaque routeur, je vous laisse donc voir avec votre propre matériel. Ainsi, vous pouvez accéder à Owncloud depuis le l'internet mondial (jcfrog si tu nous lit).

32) Maintenant que votre serveur est accessible du net, il convient de définir les règles d'iptables. Pour commencer, il faut voir quelles sont les règles actives:
sudo iptables -L
Normalement, si vous suivez ce tuto depuis une installation fraiche de rasbian, il ne devrait pas y avoir de règles affichées.

33) On va donc créer des règles minimales:
sudo nano /etc/iptables.firewall.rules
Il faut ensuite remplir le fichier comme suit:
*filter
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p udp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-unreachable

COMMIT

34) Activation des règles:
sudo iptables-restore < /etc/iptables.firewall.rules
35) On vérifie que les règles ont bien été prises en compte en listant les règles actives (voir point 32). Les nouvelles règles devraient alors apparaitre.

36) Pour s'assurer que les règles seront bien prises en compte même après avoir redémarré, il faut écrir un petit script:
sudo nano /etc/network/if-pre-up.d/firewall
Puis copier-coller ceci:
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.firewall.rules


37) Changer les permissions du script:
sudo chmod +x /etc/network/if-pre-up.d/firewall
38) Comme on est un peu paranos, en tout cas moi je le suis! On va aussi installer fail2ban:
sudo apt-get install fail2ban
39) Pour voir si tout fonctionne bien, reboot du Pi (voir point 16)

Voilà, si tout s'est bien passé, votre serveur doit être fonctionnel, un minimum sécurisé (je suis pas un spécialiste, si j'ai oublié quelque chose ou fait une connerie, lapidez-moi dans les commentaires) et atteignable, ce qui est plutôt positif pour un serveur. 
Attention, ce tuto n'est pas tout à fait terminé, il faut que je vérifie que tout marche bien car je ne l'ai pas fait dans cet ordre. De plus, les données sont relativement peu en sécurité car exposées à la faillite de la clé USB.
Dans la suite du tuto que j'ai pas encore rédigé, on verra comment dupliquer les données sur une autre clé ou sur la carte sd pour avoir une redondance. La syncronisation se fera à base de rsync et de cron, mais il faut encore que je travaille sur tout ça...

Je ne suis pas un gourou de linux, donc je me suis basé sur plusieurs sources par de vrais pros. Je me suis grandement basé sur ce tuto:
Pour le reste, en vrac: