Mise en place d'une infrastructure Nextcloud

Partie A - Installation Serveur Web
Clonage VM Template
On commence par cloner la VM Template à l'aide KVM en choisissant le bridge br2 pour la DMZ.

Changement nom d'hôte
hostnamectl set-hostname web-tp1
Réservation d'adresse DHCP
Sur DHCP 1 & 2 :
nano /etc/dhcp/dhcpd.conf
# dans la partie public
host web-tp1 {
# adresse MAC de web-tp1
hardware ethernet 52:54:00:d9:02:6b;
# adresse réservée pour web-tp1
fixed-address 10.31.200.7;
}
systemctl restart isc-dhcp-server # on redémarre le service dhcp pour appliquer les changements
Sur web-tp1 :
dhclient -r # efface les anciennes configurations dhcp
dhclient -v # effectue une nouvelle requête dhcp
On voit que le serveur Web a bien récupéré l'adresse 10.31.200.7 que le dhcp1 lui a donnée.

Partie B - Installation Serveur BDD
Clonage VM Template
Pareil que pour le serveur web, on commence par cloner la VM Template à l'aide KVM en choisissant le bridge br1 pour le LAN.

Changement nom d'hôte
hostnamectl set-hostname bdd-tp1
Réservation d'adresse DHCP
Sur DHCP 1 & 2 :
nano /etc/dhcp/dhcpd.conf
# dans la partie privée
host bdd-tp1 {
# adresse MAC de bdd-tp1
hardware ethernet 52:54:00:2d:15:bb;
# adresse réservée pour bdd-tp1
fixed-address 10.31.192.8;
}
systemctl restart isc-dhcp-server # on redémarre le service dhcp pour appliquer les changements
Sur bdd-tp1 :
dhclient -r # efface les anciennes configurations dhcp
dhclient -v # effectue une nouvelle requête dhcp
On voit que le serveur de BDD a bien récupéré l'adresse 10.31.192.8 que le dhcp2 lui a donnée.

Installation de MariaDB
apt update # mets à jour les packets apt
apt install mariadb-server # installe le packet mariadb-server
On va désormais lancer le script d'installation sécurisé MySQL et modifier le mot de passe root pour un mot de passe sécurisé.
mysql_secure_installation
Installation Plug-in ed25519
MySQL utilise par défaut l'authentification basée sur SHA-1. Seulement, SHA-1 n'est plus considéré comme un algorithme sécurisé, c'est pourquoi il est important d'utiliser un plug-in d'authentification comme ed25519.
Ce plug-in utilise l’algorithme de signature numérique à courbe elliptique (ECDSA) pour stocker en toute sécurité les mots de passe des utilisateurs et pour authentifier les utilisateurs. L’algorithme ed25519 est le même que celui utilisé par OpenSSH.
mariadb # entre dans l'interface de ligne de commande mariadb
INSTALL SONAME 'auth_ed25519'; # installe le plug-in d'authentification ed25519
Création Base de données
Sur bdd-tp1 :
mysql -u root -p
CREATE DATABASE nextclouddb;
GRANT ALL ON nextclouddb.* TO 'std'@'localhost' IDENTIFIED BY 'drowssap';
GRANT ALL PRIVILEGES ON nextclouddb.* TO 'std'@'10.31.200.7' IDENTIFIED BY 'drowssap' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
Autoriser les connexions distantes
Par défaut, MySQL n'autorise pas les connexions distantes. En effet, MariaDB est en écoute uniquement sur l'adresse de loopback (127.0.0.1). Il faut donc modifier ce paramètre de telle sorte que l'on puisse se connecter à la base de donnée sur une autre machine.
nano /etc/mysql/mariadb.conf.d/50-server.cnf
# on modifie cette ligne pour autoriser l'écoute pour n’importe quelle adresse ipv4
bind-address = 0.0.0.0
systemctl restart mariadb.service # appliquer les changements
netstat -lpn | grep mariadb # vérifie les ports en écoute pour le service mariadb

Partie C - Configuration DNS
On va maintenant créer un enregistrement DNS pour pouvoir accéder au cloud en allant à l'adresse : https://cloud.asie.gsb.org/
Configuration DNS Primaire
Sur ns1-pub :
nano /etc/bind/db.asie.gsb.org # fichier de configuration pour la zone asie.gsb.org
# ajoute un enregistrement A pour rediriger le sous domaine cloud vers le serveur web
cloud IN A 10.31.200.7
systemctl restart bind9
Vérification du Serveur DNS Primaire
dig a cloud.asie.gsb.org
On voit que notre serveur dns répond bien l'adresse de notre serveur web pour cloud.asie.gsb.org.

Configuration DNS Secondaire
Sur le DNS secondaire, il n'y a pas de changements à faire car tout est déjà configuré pour qu'il mette à jour automatiquement sa base pour les zones concernées. Seulement, il est important de changer le numéro de série dans le champ SOA sur le DNS primaire pour signaler au DNS secondaire de mettre à jour sa base de données.
Vérification du Serveur DNS Secondaire
dig a cloud.gsb.org @10.31.200.54
On voit que notre serveur de nom secondaire répond bien l'adresse de notre serveur web pour cloud.asie.gsb.org.

Partie D - Installation d’Apache2 & Nextcloud
Installation Apache2
Sur web-tp1 :
apt update
apt upgrade
apt install apache2 php-mysql libapache2-mod-php php php-gd php-curl php-zip php-dom php-xml php-simplexml php-mbstring
On voit donc avec la commande netstat, que le port 80 est bien sur écoute.
netstat -nlt
n: Afficher les adresses numériques au lieu d'essayer de déterminer les noms symboliques d'hôte, de port ou d'utilisateur.l: Afficher uniquement les sockets en écoute.t: Afficher uniquement les ports TCP.
Création du Vhost
nano /etc/apache2/sites-available/cloud.asie.gsb.org.conf
<VirtualHost *:80>
ServerAdmin webmaster@asie.gsb.org
ServerName cloud.asie.gsb.org
DocumentRoot /home/htdocs/asie.gsb.org/cloud
ErrorLog /var/log/apache2/www-error.log
CustomLog /var/log/apache2/www-access.log combined
<Directory /home/htdocs/asie.gsb.org/cloud>
Require all granted
</Directory>
</VirtualHost>
mkdir -p /home/htdocs/asie.gsb.org/cloud
a2ensite cloud.asie.gsb.org
systemctl restart apache2
Installation Nextcloud
wget https://download.nextcloud.com/server/releases/nextcloud-25.0.4.zip
mv nextcloud-25.0.4.zip /home/htdocs/asie.gsb.org/cloud/
cd /home/htdocs/asie.gsb.org/cloud/
unzip nextcloud-25.0.4.zip
chown -R www-data:www-data /home/htdocs/asie.gsb.org/cloud/
systemctl restart apache2

Partie E - HTTPS
Création d'un certificat pour le serveur web public
Pour créer le certificat de notre serveur web, nous allons utiliser l'outil openssl.
Qu'est-ce qu'OpenSSL ?
OpenSSL est un logiciel open-source qui implémente les protocoles de chiffrement SSL et TLS pour sécuriser les communications sur Internet. Dans notre cas, nous utiliserons OpenSSL pour créer des certificats de chiffrement autosignés. Ces certificats sont signés par l'entité qui les utilise au lieu d'être signée par une autorité de certification (CA) tierce. Ils peuvent être utilisés pour sécuriser les communications sur un réseau privé ou pour des tests de développement, mais ils ne sont généralement pas considérés comme fiables pour les communications sur Internet en raison de leur manque de vérification de l'identité de l'entité qui les utilise. Lors de l'accès à des sites protégés par un certificat autosigné, un message d'avertissement peut être affiché pour indiquer qu'il est impossible de vérifier l'authenticité du certificat.
apt-get install openssl
mkdir /etc/ssl/localcerts
openssl req -new -x509 -sha256 -days 365 -nodes -out /etc/ssl/localcerts/gsb.crt -keyout /etc/ssl/localcerts/gsb.key.org
req: permet de créer et traiter les demandes de certificats-new: permet de générer la demande de certificat-nodes: désactive le chiffrement de la clé privé-keyout: donne le nom ou le fichier ou la clé privée sera créé-out: nom du fichier de sortie (cela correspond au certificat)-days: durée de validité du certificat (en jours)ls /etc/ssl/localcerts # vérifie que le certificat soit bien créé
Adaptation du Vhost et de la configuration d'Apache
Une fois le certificat créé, il faut maintenant modifier la configuration du Vhost afin de lui indiquer de se mettre en écoute sur le port 443 pour faire du HTTPS en utilisant notre certificat et notre clé. A noter qu'on ajoute également la une directive Redirect dans le vhost pour le port 80 dans le but de rediriger les utilisateurs vers la page HTTPS.
nano /etc/apache2/sites-available/cloud.asie.gsb.org.conf
<VirtualHost *:80>
ServerAdmin webmaster@asie.gsb.org
ServerName cloud.asie.gsb.org
DocumentRoot /home/htdocs/asie.gsb.org/cloud
ErrorLog /var/log/apache2/www-error.log
CustomLog /var/log/apache2/www-access.log combined
Redirect permanent / https://cloud.asie.gsb.org/
<Directory /home/htdocs/asie.gsb.org/cloud>
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:443>
ServerAdmin webmaster@asie.gsb.org
ServerName cloud.asie.gsb.org
DocumentRoot /home/htdocs/asie.gsb.org/cloud
ErrorLog /var/log/apache2/www-error.log
CustomLog /var/log/apache2/www-access.log combined
SSLCertificateFile /etc/ssl/localcerts/gsb.crt
SSLCertificateKeyFile /etc/ssl/localcerts/gsb.key.org
<Directory /home/htdocs/asie.gsb.org/cloud>
Require all granted
</Directory>
</VirtualHost>
a2enmod ssl # active ssl
systemctl restart apache2 # redémarre apache2 pour appliquer les changements
netstat -nat # affiche les ports en écoute
Ici, on voit bien que notre serveur web est désormais en écoute sur le port 443.

Vérification HTTPS


Partie F - Activer MFA sur Nextcloud
La MFA (Multi-Factor Authentication) est une méthode de sécurité qui nécessite deux ou plusieurs moyens d'authentification différents pour accéder à un compte. L'objectif est de rendre plus difficile pour les pirates informatiques de compromettre votre compte en exigeant une seconde couche d'authentification. Dans notre cas, nous allons nous servir du service Google Authenticator pour la MFA.
Installation plug-in
Dans l'onglet Applications > Sécurité, installer le module Two-Factor TOTP Provier.

Ensuite, dans l'onglet Paramètres d'administration > Personnel > Sécurité, activer le TOTP :

Désormais, quand un utilisateur tente de se connecter, Nextcloud exigera également son code TOTP

Partie G - Script de sauvegarde
Réalisation du script
J'ai également voulu créer un script de sauvegarde afin de pouvoir restaurer rapidement la base de donnée nexclouddb en cas de problèmes. Pour cela, j'ai décidé d'utiliser bash et la commande mysqldump pour sa facilité d'utilisation.
nano nextcloud-backup.sh
db_password="XXXXXXXXXX"
backup_dir="/root/nextcloud-backup/"
backup_file="nextcloud_$(date +%Y%m%d_%H%M%Sz).sql"
mysqldump --single-transaction -h 10.31.192.8 -u std -p$db_password nextclouddb > $backup_dir/$backup_file
find $backup_dir -type f -mtime +7 -delete
Je commence par déclarer des variables pour pouvoir rapidement changer les paramètres si jamais l'administrateur le décide. Puis j'effectue une backup de la base de donnée avec la commande mysqldump que l'on va stocker le répertoire de la variable backup_dir. Et enfin, j'utilise la commande find pour supprimer les fichiers de backups datant de plus de 7 jours pour pouvoir faire le tri et donc ne pas saturer l'espace de stockage du disque.
chmod +x nextcloud-backup.sh # attribue le droit d'éxécution au script
./nextcloud-backup.sh # éxécute le script
On voit qu'après exécution du script, le fichier de backup a bien été créé.

Cron
Maintenant, le but est d'exécuter le script toutes les 10 minutes pour pouvoir assurer la sécurité de l'application. Pour cela, on va créer une crontab avec l'outil cron.
crontab -e # modifie la configuration des crontabs
# ajouter cette ligne pour exécuter le script toutes les 10 minutes
*/10 * * * * /root/nextcloud-backup.sh
Désormais, le script sera automatiquement exécuter toutes les 10 minutes sur le serveur web.
Partie H - IDS (Fail2Ban) - Nextcloud
On commence par installer Fail2Ban sur le serveur web privé.
Sur web-tp1 :
apt update
apt install fail2ban iptables
cd /etc/fail2ban/
cp jail.conf jail.local # créer une copie du fichier jail.conf
Puis, on ajoute la jail pour nextcloud :
nano jail.local
[nextcloud]
enabled = true # active la jail
filter = nextcloud # le fichier filtre sera nextcloud.conf dans filter.d
port = https # le port 443 sera affecté par l’action entreprise
logpath = /home/htdocs/asie.gsb.org/cloud/data/nextcloud.log # le chemin vers le fichier de logs nextcloud à surveiller
maxretry = 2 # 3ème essai = ban
bantime = 120 # ban pendant 120s
On va maintenant configurer la regex pour indiquer la forme que prends un message d'erreur de connexion pour le service nextcloud.
nano filter.d/nextcloud.conf
[Definition]
_groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*)
failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed:
^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error.
datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"
service fail2ban restart
Phase de Test
On va d'abord vérifier si la jail est bien activé en utilisant la commande fail2ban-client.
fail2ban-client status
On voit bien que la jail pour Nextcloud est bien activé.

Ensuite, on simule une attaque bruteforce en tentant de se connecter au Nextcloud plus de 3 fois.

On affiche les infos sur la jail nextcloud.
fail2ban-client status nextcloud
On voit que notre machine est maintenant banni de notre site nextcloud


