Pour les besoins de mes épreuves de BTS, ma documentation doit être disponible en ligne et accessible pour le jury. Pour la section réseau, cela implique de devoir mettre ses documentations sur google drive, dropbox, ou tout autre service de Cloud. De mon côté, en développement, je me suis dit « pourquoi ne pas me faire mon propre cloud, hébergé juste à côté de mon serveur web ? ». Même si mes documentations sont disponibles sur ce site, j’aime savoir que le cloud mis en place me permet d’accéder à ma documentation depuis n’importe où afin de la modifier / compléter à tout moment.

Prérequis :

Afin de commencer dans de bonnes conditions, voici ce qu’il faut avoir :

  • Un Raspberry Pi avec OS Raspbian d’installé
  • Une connexion internet
  • Clavier et souris

CE TUTORIEL FONCTIONNE EGALEMENT POUR TOUT SERVEUR WEB (WordPress, Drupal, etc…)

Connexion SSH :

La connexion SSH va vous permettre de vous connecter au terminal du Raspberry depuis un ordinateur distant connecter au réseau local.

Pour commencer, connecter vous en local sur le raspberry, clavier et souris branchés. Il y a deux possibilité : soit vous utilisez l’interface graphique (ce qui est mon cas), soit vous utilisez uniquement le terminal. Les deux méthodes vont être expliquées.

Activer SSH dans l’interface graphique

Vous pouvez activer la fonction SSH en allant dans Paramètre > Configuration du Pi > Onglet Interfaces. A partir de là, activez le service SSH

Activer SSH via le gestionnaire de configuration

Depuis le terminal, saisissez la commande :

sudo raspi-config

Vous obtenez alors cet affichage :

Utilisez les flèches directionnelles pour vous placer sur « Interfacing Options », appuyez sur Entrée. De la même façon, placez-vous sur SSH. Après avoir appuyé sur Entrée, on vous demandera de confirmer que vous voulez bien activer le SSH. Choisissez Oui. Si tout s’est bien passé, vous devriez avoir une fenêtre pour vous avertir que le monde d’accès SSH est activé est opérationnel.

Connaitre l’adresse IP

Pour connaitre l’adresse IP de votre Pi, ouvrez un terminal et tapez la commande :

sudo ifconfig

Résultat :

Se connecter

Contrairement au Mac qui intègre un terminal avec client SSH, Windows nécessite l’installation d’un client tiers : Putty. Téléchargez donc Putty et lancez le client. Dans l’espace Host Name, tapez l’adresse IP récupérée précédemment et cliquez sur Open.

Connectez-vous avec l’utilisteur par défaut pi. Mot de passe : raspberry. Nous changerons cette accès dans un instant. Vous voilà connectés en SSH. On peut maintenant mettre de côté le clavier et la souris du Raspberry de côté, nous n’en n’avons plus besoin. Depuis l’accès SSH, on va en profiter pour mettre à jour le système et le redémarrer

sudo apt-get update
sudo apt-get upgrade
sudo reboot

Puis reconnectez-vous en SSH.

Protection du Pi :

Préserver la carte SD

Afin de préserver la carte SD, on va mettre les fichiers temporaires en mémoire vive pour ne pas trop la surcharger d’information. On va dans un premier temps modifier le fichier fstab :

sudo nano /etc/fstab

en y ajoutant les deux lignes suivantes :

tmpfs /tmp tmpfs defaults,noatime,nosuid,size=100m 0 0
tmpfs /var/tmp tmpfs defaults,noatime,nosuid,size=30m 0 0

Nous allons ensuite installer l’utilitaire log2ram qui permet de placer les logs en mémoire vive et de ne les sauvegarder que toutes les heures :

cd
mkdir download
cd download
sudo apt install git
git clone https://github.com/azlux/log2ram.git
cd log2ram
chmod +x install.sh
sudo ./install.sh

Pour indiquer au serveur apache de démarrer après log2ram, éditez le fichier /etc/systemc/system/log2ram.service :

sudo nano /etc/systemc/system/log2ram.service

Modifier la ligne contenant « Before » par celle-ci :

Before=syslog.target mysql.service fail2ban.service nginx.service rsyslog.service apache2.service

Redémarrez le raspberry et vérifiez que vous avez bien ces 4 dernières lignes avec la commande df -h :


Sécurisation du serveur

Nouvel utilisateur

Comme le raspberry est visible sur le net, il est fortement conseillé de créer un nouvel utilisateur et de supprimer l’utilisateur pi.

Pour créer un nouvel utilisateur :

sudo adduser nomUtilisateur

Il vous est demandé ensuite un mot de passe. Veuillez à choisir un mot de passe fort, avec au moins 8 caractères alphanumériques et des caractères spéciaux. Si les mots de passe saisis sont identique, une nouvelle étape va vous demander plusieurs informations que vous pouvez passer en appuyant sur Entrée.

On va maintenant lui donner les droits super admin afin qu’il puisse installer des logiciels par la suite. Actuellement vous êtes loggués avec pi. Tapez la commande suivante :

sudo visudo

Ajoutez en bas du fichier :

nomUtilisateur ALL=(ALL:ALL) ALL

Ce qui nous donne ceci :

Normalement, l’utilisateur pi apparait encore dans la liste. Nous le supprimerons par la suite. Pour tester le nouveau compte sudo, on va se déconnecter et se connecter avec ce nouveau compte. Avec ce nouveau compte, on accède de nouveau au fichier visudo et on supprime la ligne concernant l’utilisateur pi. On enregistre le fichier et on supprime l’user pi.

sudo deluser –remove-home pi

Sécurisation SSH

Pour sécuriser la connection en SSH, modifiez les paramètres suivant du fichier /etc/ssh/sshd_config :


# Logging
SyslogFacility AUTH
LogLevel VERBOSE

# Authentication:
LoginGraceTime 20
PermitRootLogin no
StrictModes yes

#UseLogin no
MaxStartups 10:30:60
#Banner /etc/issue.net

# Add allowed users
AllowUsers myuser

Après quoi on restreint le service SSH à l’IPV4 puis on redémarre le service :

echo ‘AddressFamily inet’ | sudo tee -a /etc/ssh/sshd_config
sudo systemctl restart ssh
sudo systemctl status ssh

Installation serveur mail

Nous allons installer nullmailer afin que le serveur puisse nous envoyer des mails d’avertissement ou autre.

sudo apt-get install nullmailer mailutils

Pendant l’installation, renseigner le nom de la boite mail (qui doit être une boite mail existante). Pour ma part, j’ai créé une adresse mail spécifique sur gmail. Mais vous pouvez utiliser une adresse mail de votre domaine. A la suite, fournissez les paramètres SMTP de la boite mail en question. Pour gmail :

smtp.gmail.com smtp –port=465 –auth-login –user=votreadressemail@gmail.com –pass=motdepassedevotreboitemail –ssl

Chacune de ses informations est modifiables dans les fichiers du dossier /etc/nullmailer/.

Nous allons maintenant forcer l’expéditeur webmaster@mydomain.com (l’adresse mail renseignée) afin de ne pas être arrêté par le serveur smtp.

sudo mv /usr/sbin/sendmail /usr/sbin/sendmail-bin
sudo echo webmaster@mydomain.com > /etc/nullmailer/forced-from

Créez un fichier /usr/sbin/sendmail dans lequel mettre :

#!/bin/bash
/usr/sbin/sendmail-bin $@ -f `cat /etc/nullmailer/forced-from` </dev/stdin

On le rend ensuite exécutable : sudo chmod +x /usr/sbin/sendmail

On peut ensuite tester l’envoie de mail :

echo « Un mail de test » | mail s « test nullmailer » destinataire@pourletest.com

Fail2ban, une couche de sécurité supplémentaire :

Fail2ban est une application qui analyse les logs des services en cherchant des correspondances entre des motifs définis dans ses filtres et les éntrées des logs. Cette application cherche également des tenatives répétées de connexions infructueuses dans les fichiers journaux et procède à un bannissement en ajoutant une règle au pare-feu pour bannir l’adresse ip de la source.

Pour commencer, installez fail2ban :

sudo apt-get install fail2ban

Editez ensuite la première ligne du fichier /etc/hosts :

127.0.0.1 localhost localhost.localdomain myserver

myserver correspond au nom de votre raspberry. Dans mon cas, il s’agit de piHost.

On va ensuite créer un nouveau fichier de configuration :

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

On édite ensuite le fichier créé /etc/fail2ban/jail.local comme suit :


ignoreip = 127.0.0.1/8 192.168.0.0/24

# « bantime » is the number of seconds that a host is banned.
Bantime = 3600

#
# Destination email address used solely for the interpolations in
# jail.{conf,local} configuration files.
destemail = webmaster@mydomain.com

#
# Name of the sender for mta actions
sendername = Fail2Ban

# Email address of the sender
sender = webmaster@mydomain.com

# Choose default action. To change, just override value of ‘action’ with the
# interpolation to the chosen action shortcut (e.g. action_mw, action_mwl, etc) in $
# globally (section [DEFAULT]) or per specific section
action = %(action_mwl)s

[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3

[pam-generic]
enabled = true
filter = pam-generic
port = all
banaction = iptables-allports
logpath = /var/log/auth.log
maxretry = 3

On relance ensuite le service fail2ban :
sudo systemctl restart fail2ban
sudo systemctl status fail2ban

Configuration du réseau

On va maintenant ouvrir les ports nécessaires pour les sites http et https. Tout ceci se passe dans la configuration de votre box internet.

Tout d’abord, configurez une réservation DHCP pour que le raspberry conserve la même adresse IP en cas de redémarrage.

Redirigez ensuite les ports entrant 80 (HTTP) et 443(HTTPS) en TCP sur eux-même pour l’adresse IP de votre raspberry.

Ensuite, choisissez un port au hasard pour le rediriger sur lui-même en TCP pour l’adresse IP de votre raspberry. Retenez ce port, il nous servira dans la configuration SSH.

On retourne ensuite dans le terminal et on édite le fichier /etc/ssh/sshd_config pour changer le Port avec celui que l’on a ouvert juste avant. Si la ligne est commentée, la décommentée.

Une fois fait, on va s’intéresser au nom de domaine.

Configuration nom de domaine

Pour utiliser un nom de domaine gratuitement, je vous conseille no-ip.com . Inscrivez vous sur le site et créez un hostname. Il est valable 30 jours, il est nécessaire de le valider pour le réutiliser 30 jours supplémentaires.

Lors de la création de l’hostname, choisissez comme record type « DNS Host (A) ». Choisissez un Hostname ainsi qu’un Domain parmi la liste de ceux proposés. Renseignez ensuite l’adresse IPv4 publique de votre box (que vous pouvez trouver ici).

Si tout s’est bien déroulé, vous pouvez dorénavant vous connecter en SSH grâce au nom de domaine et au port modifié.

Installation du Cloud

Nous arrivons enfin à la partie du projet qui nous intéresse. Nous allons donc installer la base de données ainsi que le serveur web puis le passer en HTTPS. Une fois fait, il ne nous restera plus qu’à installer les fichiers Nextcloud et à déployer l’application.

Installation Base de données

Nous allons installer le gestionnaire de bases de données mariadb, qui se base sur MySQL 5.1.

sudo apt-get install mariadb-server
sudo mysql_secure_installation

La deuxième commande permet de sécuriser l’installation, notamment en définissant le mot de passe root (si ce n’est déjà fait lors de l’installation) ainsi que ses modalités d’accès depuis local.

Après quoi il va falloir créer la base de données pour nextcloud :

mysql -u root -p
Enter password:

MariaDB [(none)]> create database myclouddb;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create user myclouduser@localhost identified by ‘S3cUr1tY_firST’;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on myclouddb.* to myclouduser@localhost;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> exit;
Bye

myclouddb est donc le nom de la base de données, myclouduser est l’identifiant de connexion et le mot de passe est donc S3cUr1tY_firST. Ces valeurs sont arbitraires vous pouvez les définir comme vous le souhaitez mais n’oubliez pas de mettre un mot de passe sécurisé.

Installation Serveur web

Votre serveur ne sait toujours pas afficher une page web. C’est pourquoi nous allons installer apache et php.

sudo apt install apache2 libapache2-mod-php php-json php-gd php-mysql php-curl php-intl php-mcrypt php-imagick php-apcu
sudo systemctl restart apache2
sudo systemctl status apache2

Une fois que tout est bien installé, nous allons le vérifier en créant un fichier test :

sudo nano /var/www/html/info.php

Dans ce fichier nous allons mettre le code suivant, qui affiche les informations php :

<?php phpinfo(); ?>

Enregistrez le fichier puis ouvrez un navigateur internet et accéder aux deux liens successivement :

http://192.168.0.100/info.php
http://mycloud.mydomain.com/info.php

Une page avec toutes les informations de php doivent apparaitre, indiquant que php est bien installé. Vous pouvez maintenant supprimer le fichier, si un utilisateur malveillant tombait dessus, il pourrait récolter toutes les informations nécessaires, ce qui pourrait être facheux pour votre site.

sudo rm /var/www/html/info.php

On va maintenant sécuriser apache. Modifiez les paramètres suivants du fichier /etc/apache2/conf-available/security.conf :

ServerTokens Prod
ServerSignature Off

ServerTokens Prod permet d’afficher le minimum d’information nécessaire dans l’entête des requête. ServerSignature Off, moins importante si ServerTokens est correctement configuré, n’affiche ni le nom de domaine et le port utilisé.

On se rend ensuite dans le fichier /etc/php/7.0/apache2/php.ini pour modifier les lignes suivantes :
post_max_size = 20M
upload_max_filesize = 20M
mysql.connect_timeout = 180
allow_url_fopen = Off  

Une fois enregistrer, ouvrez le fichier /etc/apache2/apache2.conf pour rajouter la ligne suivante à la fin :

# Cookie HTTP header flag with HTTPOnly & Secure to protect website from XSS attacks
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure

Comme indiqué en commentaire, cela protège des attaques XSS contre votre site web. Cependant, pour que cela fonctionne, il faut activer les headers :

sudo a2enmod headers

On peut maintenant redémarrer apache2 :

sudo systemctl reload apache2
sudo systemctl status apache2

Configuration HTTPS

Nous allons maintenant configurer le site web en HTTPS. A partir de là, faites bien attention à renseigner le bon nom de domaine/sous-domaine. Nous allons installer certbot et créer un certificat pour le sous-domaine :

cd
mkdir download
cd download
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto certonly –webroot -w /var/www/html -d mycloud.mydomain.com

On vérifie ensuite que le certificat est créé :

sudo ls -l /etc/letsencrypt/live/mycloud.mydomain.com

On ajoute ou on modifie les paramètres suivants dans /etc/apache2/sites-available/default-ssl :

ServerName mycloud.myserver.com
SSLCertificateFile /etc/letsencrypt/live/mycloud.myserver.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mycloud.myserver.com/privkey.pem

Vous enregistrez et vous ouvrez votre navigateur puis tapez l’adresse : https://mycloud.mydomain.com/

Si tout fonctionne, désactivez les virtualhost apache par défaut et relancez le service :

sudo a2dissite 000-default.conf
sudo a2dissite default-ssl.conf
sudo systemctl reload apache2
sudo systemctl daemon-reload
sudo systemctl status apache2

Fichiers Nextcloud

On va maintenant télécharger les fichiers nécessaires à l’installation de Nextcloud :

cd ./download
wget https://download.nextcloud.com/server/releases/latest.zip
wget https://download.nextcloud.com/server/releases/latest.zip.sha256
sha256sum -c latest.zip.sha256

La dernière ligne permet de vérifier l’intégrité des fichiers. Si une erreur apparait à ce moment là, il faudra peut être renommer le fichier latest.zip par celui recherché par latest.zip.sha256.

On décompresse le zip et on place les fichiers au bon endroit avec les bons droits :

unzip latest.zip
sudo cp -r nextcloud /var/www/
sudo chown www-data:www-data /var/www/nextcloud/ -R
sudo mkdir /var/www/data
sudo chown www-data:www-data /var/www/data

Hôte Apache pour Nextcloud

Comme on a supprimé les virtualhost par défaut, on va recréer un virtualhost spécifique à Nextcloud. On commence par modifier le fichier /etc/apache2/apache2.conf :

<Directory /var/www/ >
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

On crée ensuite le fichier qui contiendra le virtualhost /etc/apache2/sites-available/nextcloud.conf et on le remplit comme suit (attention au nom de domaine et au répertoire des certificats) :

# Forward HTTP to HTTPS
<VirtualHost *:80>
ServerName mycloud.mydomain.com
Redirect / https://mycloud.mydomain.com/
</VirtualHost>

# HTTPS config
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName mycloud.mydomain.com
ServerAdmin myuser@localhost

DocumentRoot /var/www/nextcloud

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on

# A self-signed (letsencrypt) certificate
SSLCertificateFile /etc/letsencrypt/live/mycloud.mydomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mycloud.mydomain.com/privkey.pem

SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:!aNULL:!MD5
SSLHonorCipherOrder on

<IfModule mod_headers.c>
Header always set Strict-Transport-Security « max-age=15768000; includeSubDomains; preload »
</IfModule>

# SSL Engine Options
<FilesMatch « \.(cgi|shtml|phtml|php)$ »>
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>

# SSL Protocol Adjustments
BrowserMatch « MSIE [2-6] » \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
# MSIE 7 and newer should be able to use keepalive
BrowserMatch « MSIE [17-9] » ssl-unclean-shutdown

</VirtualHost>
</IfModule>

Il ne reste plus qu’à activer ce virtualhost, et à redémarrer Apache2 :

sudo ln -s /etc/apache2/sites-available/nextcloud.conf /etc/apache2/sites-enabled/nextcloud.conf
sudo a2enmod rewrite headers env dir mime
sudo a2enmod ssl
sudo a2ensite nextcloud
sudo systemctl reload apache2
sudo systemctl daemon-reload
sudo systemctl status apache2

Finitions

Vous pouvez dès à présent accéder au cloud via l’adresse :

https://mycloud.mydomain.com/

A partir de là, la configuration Nextcloud commence. Il est possible qu’il manque des extensions PHP. Si tel est le cas, vous pouvez les installés comme un package (apt-get install).

Une fois tous les packages d’installés :

  • Définissez un compte administrateur avec un bon mot de passe sécurisé
  • Définissez le répertoire des données : /var/www/data
  • Configurez la base de données que nous avons définie plus haut

Nextcloud est maintenant utilisable et opérationnel.


Sources :

Autohébergement d’un serveur nextcloud sur raspberry pi de scratch

Création d’un utilisateur pour le Raspberry-Pi

Téléchargement

Vous pouvez télécharger le tutoriel ici.

Catégories : Raspberry PiTutoriels

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Help-Desk