Accès au serveur Web Owncloud à partir de son nom de domaine

Chap 1. Prise en main du RPi et installation de Mate sur un Raspbian
Chap 2. Installation de OwnCloud sur un Raspberry Pi
Chap 3. Sécuriser votre RPi
Chap 4. Accès au serveur Web Owncloud à partir de son nom de domaine
Chap 5. Connection SSH
Chap 6. Les fichiers journaux
Chap 7. Let’s Encrypt (LE)
Chap 8. Ajout d’un disque dur externe et migration de données
Chap 9. Suppression et ajout d’une interface graphique
Chap 10. Rappel sur les différentes étapes pour mettre en place un server dédié à Owncloud

Chap 4. Accès au serveur Web Owncloud à partir de son nom de domaine

Avant d’aller plus loin, je souhaite rappeler que « internet c’est la jungle ». Tout et n’importe quoi peut-y arriver. Il ne faut donc pas prendre la question de sécurité à la légère. Prennez donc toutes les précautions nécessaires, comme mettre régulièrement à jour vos serveurs, etc.

1. Configuration du réseau

Matériel

  • Raspberry Pi 2 B
  • Carte micro SD, Classe 10
  • Câble HDMI
  • Câble Ethernet
  • Télé ou moniteur PC, avec support HDMI (pour l’installation de Raspbian uniquement)
  • Disque dur Externe USB 3 autonome, raccordé à une source d’alimentation (optionnel)
  • Un parefeux (optionnel)

Configuration

  • Adresse IP Publique (internet) statique, ou dynamique (nécessite l’utilisation d’un script)
  • Adresse IP Privée statique (LAN) pour le RPi (optionnelement, pour le parefeux aussi)
  • Nom de domaine (NetLibre, nsupdate)
  • Certificat SSL (OpenSSL)

Topologie du réseau

Pour une meilleure sécurité, assurez-vous d’avoir votre serveur Owncloud dans la zone DMZ (ou zone démilitarizée) de votre réseau. Ceci n’est pas une vulnérabilité, mais bien au contraire. Cette fonctionnalité vous permet de séparer le réseau accessible à partir d’internet, de votre réseau local.

pic1

Une fois le DMZ mis-en place, vous ne devriez pas vous soucier du port forwarding. A moins que vous ne souhaitez accéder à votre site, qu’à partir d’un port autre que les ports 80 et 443.

Si vous n’avez que le RPi sur le DMZ (fig 1), au niveau de la configuration du routeur de votre FAI (fournisseur d’accès à internet), vous devriez avoir l’option d’entrer l’adresse IP de votre RPi. Si par contre, vous avez un parefeux sur votre réseau (fig 2), dans la zone DMZ bien sûr, il vous faudra renseigner l’adresse IP de ce parefeux dans la configuration du DMZ du routeur FAI, puis de faire un NAT pour rediriger le traffic vers vos serveurs. Je ne vais pas rentrer dans les détails ici.

De ce fait, dans les deux cas, assurez vous d’assigner une adresse IP privée fixe au RPi, mais aussi à votre parefeux si vous en avez un.

Assigner une adresse IP fixe au RPi

Brancher votre RPi directement au routeur FAI afin de récupérer les valeurs données par « ip add show dev eth0 » (anciennement connu par « ifconfig’).

$ ip add show
    inet 10.1.2.3/24 brd 10.1.2.255 scope global eth0

Créer ensuite un fichier /etc/network/interfaces.d/eth0, dans lequel on va y ajouter les informations données par la commande précédente. La plus d’information concernant la configuration de l’interface réseau, je vous recommande de lire cet article sur le site officiel debian.

$ sudo vim /etc/network/interfaces.d/eth0 
auto eth0
iface eth0 inet static
     address 10.1.2.3
     netmask 255.255.255.0
     gateway 10.1.2.254

$ sudo ifup -v eth0

2. Accéder à votre server web via un nom de domaine

L’étape suivante serait d’associer un nom facile à retenir, qui va pointer vers l’adresse ip publique de votre routeur, tel que MaPage.monDomaine.fr.

Comme serveur DNS pour avoir un nom de domain, j’ai choisi de m’enregistrer sur NetLib.re (projet francophone), et nsupdate.info (projet anglophone) pour les raisons suivantes:
– Nom de domaine gratuit
– Codes sources du projet en opensource
– Facilité d’inscription
– Aucune compétence particulière nécessaire pour l’utilisation du site

Enregistrement de type « A » (‘A Record’ en anglais)

Notre priorité étant de mapper le domaine MaPage.monDomaine.fr à notre adresse IP publique, il nous faut donc un enregistrement de Type A, si l’adresse IP Publique est sous format IPv4, sinon de Type AAAA pour l’IPv6.
Pour les autres types d’enregistrement (SRV et MX, etc.), je ne vais pas en parler puisqu’on en a pas besoin pour l’instant.

Connectez-vous sur la site NetLibre. Noter qu’il y a déjà deux champs pré-remplis sur cette page, qu’il faut éviter de supprimer : ns0.arn-fai.net. et alsace.tetaneutral.net.

pic2

Remplissez les différents champs comme suit:

Type: A
Nom: @
TTL: 3600
Valeur: <mon adress IP publique>

Une ligne supplémentaire vous confirmant l’ajout de l’information, devrait s’afficher sur la page.

pic3
Une fois que vous avez compris comment çà marche, vous pouvez vous enregistrer aussi sur nsupdate.info puis refaire la même procédure afin d’avoir une adresse en .nsupdate.info.

Vérification de la résolution de nom

Patientez quelques 5-10 minutes, puis vérifier si vous pouvez accéder à votre page en utlisant le nom de domaine. Si rien ne s’affiche, faite un ping ou utiliser cet outil internet.

$ ping .netlib.re

pic4

L’outil internet ci-dessous donne les mêmes résultats qu’une simple commande nslookup.

pic5

Domaine de confiance (Trusted domain)

Ne vous inquiétez pas du message affiché lors de la première connection sur MaPage.monDomaine.fr (.netlib.re), qui nous informe que domaine n’est pas de confiance.

pic6

Pour y remédier, il suffit d’ajouter le nom de domaine de votre page, ainsi que l’adresse IP publique de votre site dans le fichier /var/www/html/owncloud/config/config.php.

$ sudo vim /var/www/html/owncloud/config/config.php
'trusted_domains' =>
  array (
    0 => 'localhost',
    1 => '10.1.2.3',
    2 => 'Mon.Adresse.IP.Publique',
    3 => '.netlib.re',
    4 => '.nsupdate.info',
  ),

$ sudo service apache2 restart

Adresse IP dynamique

Vous ne le savez peut être pas mais, l’adresse IP assignée par les FAIs à notre routeur peut changer à une fréquence très variable. Du genre une fois par jour/mois, etc. A la base, cette règle a été conçu pour empêcher certaines personnes malhonnêtes d’attaque continuellement la même adresse IP.

Je n’ai pas trouvé de solution viable pour l’instant. Je ne vais donc pas me lancer dans les explications sur comment faire pour y remédier au problème d’adresse IP dynamique.

Si vous avez une meilleure solution autre que les scripts proposés sur certains sites qui, généralement envoient les informations de connection non chiffrées à notre serveur de domaine, entre autre le mot-de passe, je suis preneur.

3. Quelques conseils de sécurité

Si vous avez suivit l’étape d’installation de Owncloud sur un RPi dans cet article, vous n’avez plus besoin de réactiver le mode « a2enmod ssl » du server Apache.
Vérifier que vous avez bien accès à votre page en utilisant https://.netlib.re:/owncloud (si vous n’avez pas pas de redirection de port, le lien se résume à https://.netlib.re/owncloud).
Un avertissement s’afficher à l’écran si vous vous connectez en HTTPs, pour vous prévenir que le serveur auquel vous voulez accéder n’a pas de certificat de sécurité valide.

pic7
Pour pouvoir continuer la visite de la page, et faire fi du message, cliquer tout simplement sur Proceed to MaPage.netlib.re (unsafe).

Supprimer les informations sur les versions de vos serveurs

Il y a plusieurs façon d’afficher une page d’erreur sur une page. J’ai choisi une basique, en demandant au navigateur d’afficher la page http://.netlib.re:443/owncloud.

pic8

Pour y remédier, ajouter « ServerSignature Off » à la fin du fichier /etc/apache2/apache2.conf.

Taper ensuite,

$  curl -v http://.netlib.re:/owncloud

pic9

Ici, c’est la commande « ServerTokens Prod » qu’il faut ajouter dans le fichier de configuration de Apache.

En conclusion, pour éviter d’afficher les informations des différents serveurs (type, version, etc.), désactiver leurs signatures dans /etc/apache2/apache2.conf.

$ sudo vim /etc/apache2/apache2.conf
ServerSignature Off
ServerTokens Prod

Ce n’est pas tout, vérifier aussi que l’option d’affichage de la version de php est bien désactivée, ce qui devrait être le cas par défaut.

$ sudo vim /etc/php5/apache2/php.ini

Faite une recherche en tapant

/expose

pic10

Vous devriez avoir « expose_php = Off », si ce n’est pas le cas, remplacer le On par Off.
Redémarrer le serveur Apache.

$ sudo service apache2 restart

4. Avant d’aller plus loin

Je vous propose de lire l’article « Développement et administration des services réseaux« , à partir duquel j’ai retirré les informations ci-dessous.

apache2.conf : le fichier de configuration générale (ancien httpd.conf). C’est à partir de lui que tous les autres fichiers sont chargés

envvars : le fichier utilisé pour définir des variables d’environnement propres à Apache

ports.conf : le fichier qui contient la directive listen qui spécifie les adresses et les ports d’écoutes

mods-available/ : le dossier contenant les modules disponibles

mods-enabled/ : le dossier contenant les modules activés

sites-available/ : le dossier contenant les fichiers de configuration des sites disponibles (la liste des vhosts installés)

sites-enabled/ : le dossier contenant les fichiers de configuration des sites activés (la liste des vhosts utilisés)

Vhosts fait référence aux hôtes virtuels.

Nous allons ensuite associer l’adresse IP publique de notre serveur Owncloud à un nom de domaine sur internet (de préférence, choisissez-en deux au cas où l’un des URLs devient inaccessible).
Je me suis enregistré sur netlib.re, puis nsupdate.info pour les raisons suivantes. Un, à cause de la facilité d’utilisation pour les débutants. Deux, pour leurs gratuités. Et trois, à cause de la disponibilité de leurs codes sources.

Pour accéder à mon serveur, je n’ai donc plus qu’à taper

.netlib.re
.nsupdate.info

5. Accéder à Owncloud en SSL (HTTPS)

Pour rappel, le HTTPS est une combinaison entre les protocoles HTTP et SSL/TLS, pour chiffrer les informations échangées entre notre poste et le serveur visité. Ceci justement, dans le but de créer une connection avec une sécurité « résonnable » à travers le réseau pour protéger les utilisateurs, ainsi que les données qui y transitent.

Si vous avez besoin de plus de sécurité, vous devriez utiliser un certificat signé par une authorité de certification (CA).

Création d’un certificat SSL

Ci-dessous la marche à suivre pour mettre en place un Site Web sécurisé via protocole SSL. J’ai choisi la méthode de création de Certificat auto-signé, option « -x509 » avec l’utilisation de la commande openssl, qu’on va placer dans le dossier /etc/ssl.

$ ssh .netlib.re
$ sudo mkdir -p /etc/ssl/localcerts
$ sudo openssl req -new -x509 -days 365 -nodes -out /etc/ssl/localcerts/owncloud.pem -keyout /etc/ssl/localcerts/owncloud.key

pic11

Le certificat créé avec option « -days 365 », sera valide pour 1an. Si comme moi, vous ne souhaitez pas protéger votre clé privée par un mot de passe, ajouter l’option « – nodes » à la commande openssl.
Modifier ensuite les permissions du dossier /etc/ssl/localcerts, qui contient les deux clés owncloud.key et owncloud.pem, afin que personne d’autre que le proprétaire du dossier (ici Root), n’a accès à son contenu.

$ ls -l /etc/ssl/localcerts/
total 8
-rw-r--r-- 1 root root 1704 Mar 25 06:03 owncloud.key
-rw-r--r-- 1 root root 1440 Mar 25 06:03 owncloud.pem
$ sudo chmod 600 /etc/ssl/localcerts/owncloud*
$ ls -l /etc/ssl/localcerts/
total 8
-rw------- 1 root root 1704 Mar 25 06:03 owncloud.key
-rw------- 1 root root 1440 Mar 25 06:03 owncloud.pem

/!\ Les permissions pour accéder à ces clés tel que présenté ci-dessus, a pour but de limiter leurs accès à une tierce personne. Il ne faut surtout, mais SURTOUT pas partager votre clé privée, ni la perdre d’ailleur.

Activer le mode ssl,

$ sudo a2enmod ssl

Un message s’affichera avec la liste des dépendances activées, si le mode ssl est déjà activé.

Considering dependency setenvif for ssl:

Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Module socache_shmcb already enabled
Module ssl already enabled

Configuration de Apache2

Il n’y a rien à modifier au niveau des ports d’écoute, puisque Apache2 est configuré par défaut pour écouter sur les ports 80 et 443.

$ cat /etc/apache2/ports.conf 
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf
Listen 80

    Listen 443



    Listen 443

Sauvegarde des fichiers de configuration

N’oubliez pas de faire une sauvegarde de vos fichiers de configuration, quelqu’il soit (owncloud.conf, config.php, apache2.conf, etc.), avant de les modifier.

1. Fichier de configuration de owncloud

$ sudo cp /etc/apache2/sites-available/owncloud.conf /etc/apache2/sites-available/owncloud.bak

2. Fichier de configuration du serveur web

$ sudo cp /etc/apache2/apache2.conf /etc/apache2/sites-available/apache2.bak

3. Tableau de configuration PHP du serveur owncloud

$ sudo cp /var/www/html/owncloud/conf/config.php /var/www/html/owncloud/conf/config.bak

4. Fichier .htaccess

Dans la liste de fichiers de configuration, il faut absolument ne pas toucher au fichier .htaccess comme indiqué sur dans le tutoriel de Apache. Par contre, rien ne vous empêche d’en faire une copie de sauvegarde.
A titre d’information, dans le dossier contenant l’option « AllowOverride All », /var/www/html/owncloud/ par exemple (cf. « Sécuriser notre Hôte Virtuel » qu’on verra un peu plus tard dans ce chapitre), les règles données par .htaccess vont être prioritaires aux directives du serveur Apache.

    AllowOverride All

Ce qui n’empêche pas le serveur Apache d’y appliquer d’autres règles qui ne rentrent pas en conflit avec ceux du .htaccess, dans le même dossier.

Recharger la configuration d’Apache

Si vous modifier l’un des fichiers de configuration de votre serveur, n’oublier pas de redémarrer le serveur Apache.

$ sudo service apache2 restart

Configuration SSL

Vérifier dans un premier temps la version de chacun de vos serveurs.

Version de Apache:

$ apachectl -V
Server version: Apache/2.4.10 (Raspbian)

$ aptitude show apache2
Version: 2.4.10-10+deb8u4

Version de OpenSSL:

$ openssl version
OpenSSL 1.0.1k 8 Jan 2015

$ aptitude show openssl
Version: 1.0.1k-3+deb8u4

Version du PHP:

$ php --version
PHP 5.6.17-0+deb8u1 (cli) (built: Jan 24 2016 12:25:22)

$ aptitude show php5
Version: 5.6.17+dfsg-0+deb8u1

Générer ensuite une configuration SSL convenable, en fonction de la version de vos serveurs, à partir de ce lien.

pic12

Sécuriser notre Hôte Virtuel

Rediriger tous les traffics HTTP (port 80) vers HTTPS (port 443).
Pour ce faire, je vous suggère de supprimer tout le contenu du fichier /etc/apache2/sites-available/owncloud.conf, puis de le remplacer par celui ci-dessous, en l’adaptant à vos besoins.

Pour rappel, mon adresse IP publique est liée à deux URLs différents. Un en netlib.re, puis l’autre en nsupdate.info.

$ sudo vim /etc/apache2/sites-available/owncloud.conf
# Force port redirecting (HTTP to HTTPS)

    ServerName .netlib.re
    Redirect permanent / https://.netlib.re



    ServerName .nsupdate.info
    Redirect permanent / https://.nsupdate.info


# Web server configuration


    ServerName .netlib.re
    ServerAlias .nsupdate.info
    DocumentRoot /var/www/html/owncloud/
    # SSL configuration

    SSLEngine on
    SSLCertificateFile /etc/ssl/localcerts/owncloud.pem 
    SSLCertificateKeyFile /etc/ssl/localcerts/owncloud.key
    #SSLCACertificateFile /path/to/all_ca_certs
    # Restrict/deny/allow access to certain directories

    
        Options +FollowSymLinks
        AllowOverride All
        
            Dav off
        

    SetEnv HOME /var/www/html/owncloud
    SetEnv HTTP_HOME /var/www/html/owncloud
    

    
        # just in case if .htaccess gets disabled
        Require all denied
    
 

# modern configuration, tweak to your needs
SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite          ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
SSLHonorCipherOrder     on
SSLCompression          off

# OCSP Stapling, only in httpd 2.3.3 and later
SSLUseStapling          on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache        shmcb:/var/run/ocsp(128000)

Quelques notes concernant cette configuration:

  • DocumentRoot définit la racine des documents pour chaque hôte virtuel
  • SSLEngine doit être activé, afin que le server web puisse utiliser le SSL
  • SSLCertificateFile et SSLCertificateKeyFile définit le chemin d’accès à nos certificats et clés
  • SSLCACertificateFile à acitiver, si vous avec un certificat signé par un CA

6. Sécurités et avertissements sur les configurations

L’ajout de la règle en HSTS dans l’hôte virtuel n’est pas une bonne idée. D’autant plus que celà ne va pas supprimer l’avertissement qui s’affiche dans la page d’administration de votre Owncloud.

HSTS-warning

Dans /etc/apache2/apache2.conf, ajouter

$ sudo vim /etc/apache2/apache2.conf
#
# Force all traffic to remain on HTTPS
# HSTS (mod_headers is required) (15768000 seconds = 6 months)
#

      Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"


# 
# Force people coming to your site to use HTTPS
#
# 1. Enable the Rewrite capabilities
#
RewriteEngine On
#
# 2. Check to make sure the connection is not already HTTPS
#
RewriteCond %{HTTPS} !=on
#
# 3. Redirect users from their original location, to the same location but using HTTPS.
# i.e.  http://www.example.com/foo/ to https://www.example.com/foo/
# The leading slash is made optional so that this will work either in httpd.conf
# or .htaccess context
#
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

Profitons-en par la même occasion pour régler aussi le problème de Mémoire cache.
$ sudo apt-get install php5-apcu

$ aptitude show php5-apcu
Version: 4.0.7-1

Sans passer par l’interface graphique, une méthode pour vérifier si le memcache est configuré, le résultat de la commande ci-dessous doit être égale à 1 si c’est activé. Sinon, on devrait avoir 0.

$ sudo cat /var/www/html/owncloud/config/config.php | grep -ci -m1 "'memcache.local'"
0

Dans le fichier /var/www/html/owncloud/config/config.php, ajouter la ligne ci-dessous, puis revérifier le memcache, qui devrait maintenant avoir pour valeur 1:

'memcache.local' => '\OC\Memcache\APCu',

pic13

Vérifier de nouveau que tous est maintenant rentré dans l’ordre dans la page d’administration de votre serveur Owncloud.

pic14

7. Différents Tests

Test d’accès en HTTP à votre page

Après avoir supprimé les caches et cookies de votre navigateur, entrer l’url de votre site en HTTP, puis vérifier le résultat.
Si tout s’est bien passé, vous devriez désormais avoir accès à votre page de manière sécurisée, en HTTPS.

pic15

Et voilà. Apprécier votre nouveau « Dropbox-like ». Mais, attendez, ce n’est pas tout!

Test de sécurité du serveur

Pour le fun, effectuer un test de sécurité de votre page sur Quallys SSL Lab.

pic16

Le résultat du test nous donne un T à cause d’un problème de certificat. Sans celà, le site mérite un A. Ce qui fait que notre site est digne de « confiance ».

Vous pouvez également vérifier quels ports sont ouverts avec Pentest-tools.

pic17

Amusez-vous bien!

 

Références et Ressources:

Netlibre, un nom de domaine gratuit, facilement administrable
Principes de base du système DNS
Hardening and Security Guidance
How to turn off server signature on Apache web server
Tutoriel: Virtualhosts avec Apache2
Atelier 3 partie 4 – Installer son serveur à la maison
Self-Signed_Certificate (Debian)
Certificates and Encodings
What is a Pem file and how does it differ from other OpenSSL Generated Key File Formats?
Enable SSL for Owncloud 8 on Ubuntu
Redirect Request to SSL
Common Apache Missconfigurations
How To Configure Apache 2
Configuring Memory Caching
Sécuriser son serveur Linux
Protéger son site Internet des cyberattaques