Le serveur Nextcloud est positionné en DMZ (192.168.1.11). Cette position permet d'exposer le service vers Internet tout en maintenant une isolation vis-à-vis du VLAN Serveurs. Les communications entre Nextcloud et les autres serveurs (AD, Serveur de fichiers) passent par des règles firewall ciblées sur PFSense.
| Composant | IP / VLAN | Rôle |
|---|---|---|
| Serveur Nextcloud | 192.168.1.11 (DMZ) | Serveur applicatif Nextcloud |
| Serveur AD/DNS | 172.30.10.11 (VLAN Serveurs) | Authentification LDAP |
| Serveur de Fichiers | 172.30.10.13 (VLAN Serveurs) | Stockage SMB/CIFS |
| PFSense (x2) | Passerelle DMZ/LAN | Firewall & routage inter-VLAN |
Vérifier la configuration réseau de la VM Nextcloud avant de commencer :
# Vérifier la configuration réseau
ip a
# Vérifier la connectivité vers l'AD (important pour la suite)
ping 172.30.10.11
# Vérifier la connectivité vers le serveur de fichiers
ping 172.30.10.13
Éditer le fichier /etc/network/interfaces si nécessaire :
auto ens18
iface ens18 inet static
address 192.168.1.11/24
gateway 192.168.1.254.254
dns-nameservers 172.30.10.11
dns-search cbaudiment.fr
Note : Remplacer ens18 par le nom de l'interface réseau réel (vérifié avec 'ip a'). Adapter le gateway à celui de la DMZ.
systemctl restart networking
apt update && apt upgrade -y
apt install -y curl wget gnupg2 lsb-release apt-transport-https ca-certificates
Installation des composants nécessaires au fonctionnement de Nextcloud : serveur web Apache, PHP 8.4 et ses extensions, et le serveur de base de données MariaDB.
apt install -y apache2
systemctl enable apache2
systemctl start apache2
Info : Nextcloud Hub 8 nécessite PHP 8.1 minimum. PHP 8.4 est recommandé sur Debian 12.
apt install -y php8.4 php8.4-cli php8.4-common php8.4-fpm \
php8.4-mysql php8.4-zip php8.4-gd php8.4-mbstring \
php8.4-curl php8.4-xml php8.4-bcmath php8.4-intl \
php8.4-imagick php8.4-ldap php8.4-smbclient \
php8.4-apcu php8.4-redis libapache2-mod-php8.4
Vérifier la version PHP installée :
php -v
Éditer le fichier /etc/php/8.4/apache2/php.ini avec les valeurs suivantes :
memory_limit = 512M
upload_max_filesize = 10G
post_max_size = 10G
max_execution_time = 300
max_input_time = 300
date.timezone = Europe/Paris
opcache.enable = 1
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.memory_consumption = 128
opcache.save_comments = 1
opcache.revalidate_freq = 1
apt install -y mariadb-server
systemctl enable mariadb
systemctl start mariadb
# Sécurisation de MariaDB
mariadb-secure-installation
Note : Lors du mariadb-secure-installation : définir un mot de passe root fort, supprimer les utilisateurs anonymes, désactiver le login root distant, supprimer la base test.
Créer la base de données pour Nextcloud :
mysql -u root -p
CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'MotDePasseForce2024!';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Note : Choisir un mot de passe fort et le noter soigneusement. Il sera nécessaire lors de l'installation de Nextcloud.
cd /tmp
wget https://download.nextcloud.com/server/releases/latest.tar.bz2
wget https://download.nextcloud.com/server/releases/latest.tar.bz2.sha256
# Vérification de l'intégrité du fichier
sha256sum -c latest.tar.bz2.sha256
Info : Le résultat doit afficher 'OK'. Si ce n'est pas le cas, retélécharger l'archive.
tar -xjf latest.tar.bz2 -C /var/www/
chown -R www-data:www-data /var/www/nextcloud
chmod -R 755 /var/www/nextcloud
# Créer le répertoire de données en dehors du webroot
mkdir -p /var/nextcloud-data
chown -R www-data:www-data /var/nextcloud-data
chmod 770 /var/nextcloud-data
Info : Stocker les données en dehors du répertoire web (/var/www) est une bonne pratique de sécurité.
a2enmod rewrite
a2enmod headers
a2enmod env
a2enmod dir
a2enmod mime
a2enmod ssl
systemctl restart apache2
Puisque l'infrastructure dispose d'un AD CS sur le serveur Windows (172.30.99.11), il est préférable d'utiliser une PKI interne plutôt qu'un certificat auto-signé. Le certificat émis par l'AD CS sera automatiquement approuvé par tous les postes membres du domaine via la GPO, sans avertissement navigateur.
Info : Avant de commencer, s'assurer que la règle firewall PFSense autorise le flux HTTP (port 80) entre le serveur Nextcloud (172.30.99.32) et le serveur AD (172.30.99.11) pour accéder à l'interface certsrv.
La clé privée et la CSR sont générées en une seule commande OpenSSL avec l'option -newkey. Cela garantit leur compatibilité — c'est la méthode recommandée.
Bonne pratique : Toujours générer la clé privée et la CSR ensemble avec -newkey. Les générer séparément peut produire des paires incompatibles difficiles à diagnostiquer.
mkdir -p /etc/ssl/nextcloud
cd /etc/ssl/nextcloud
printf '[req]\ndistinguished_name = req_distinguished_name\nreq_extensions = v3_req\nprompt = no\n\n[req_distinguished_name]\nC = FR\nST = Auvergne-Rhone-Alpes\nL = Paris\nO = BTS SIO\nCN = nextcloud.cbaudiment.fr\n\n[v3_req]\nkeyUsage = keyEncipherment, digitalSignature\nextendedKeyUsage = serverAuth\nsubjectAltName = @alt_names\n\n[alt_names]\nDNS.1 = nextcloud.cbaudiment.fr\nIP.1 = 172.30.99.32\n' > /etc/ssl/nextcloud/openssl.cnf
cat /etc/ssl/nextcloud/openssl.cnf
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = FR
ST = Auvergne-Rhone-Alpes
L = Paris
O = BTS SIO
CN = nextcloud.cbaudiment.fr
[v3_req]
keyUsage = keyEncipherment, digitalSignature
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = nextcloud.cbaudiment.fr
IP.1 = 192.168.1.11
Note : Si le fichier ne s'affiche pas correctement ou contient des caracteres etranges, le supprimer (rm openssl.cnf) et recommencer avec la commande printf ci-dessus. Ne pas utiliser nano pour creer ce fichier — les problemes de copier-coller peuvent corrompre la syntaxe.
openssl req -new -newkey rsa:2048 -nodes \
-keyout /etc/ssl/nextcloud/nextcloud.key \
-out /etc/ssl/nextcloud/nextcloud.csr \
-config /etc/ssl/nextcloud/openssl.cnf
ls -la /etc/ssl/nextcloud/
# Doit afficher nextcloud.key et nextcloud.csr avec une taille > 0
Erreur connue — fichier .cnf corrompu : Si openssl retourne 'Error on line 2... missing equal sign', le fichier openssl.cnf contient des caractères invisibles. Supprimer le fichier et le recréer avec la commande printf. Ne jamais utiliser nano ou un copier-coller direct pour créer ce fichier.
Avant de soumettre la CSR à l'AD CS, vérifier qu'elle contient les bonnes informations :
openssl req -text -noout -in /etc/ssl/nextcloud/nextcloud.csr
Vérifier la présence des éléments suivants dans la sortie :
Afficher le contenu brut de la CSR pour le copier dans certsrv :
cat /etc/ssl/nextcloud/nextcloud.csr
Copier l'intégralité du bloc, de -----BEGIN CERTIFICATE REQUEST----- jusqu'à -----END CERTIFICATE REQUEST----- inclus.
La soumission se fait depuis un poste Windows membre du domaine ou directement depuis le serveur AD. Le serveur Nextcloud n'a pas besoin de contacter certsrv directement.
Erreur connue — 403.4 SSL requis : Si une erreur HTTP 403.4 apparaît en accédant à certsrv, IIS exige HTTPS mais aucun certificat n'est encore installé. Solution : ouvrir le Gestionnaire IIS sur le serveur AD > sélectionner CertSrv > double-cliquer sur Paramètres SSL > décocher 'Requérir SSL' > Appliquer > lancer iisreset en invite administrateur. Réactiver SSL après déploiement du certificat.
| Champ | Valeur |
|---|---|
| URL | http://172.30.10.11/certsrv |
| Navigateur recommandé | Microsoft Edge ou Internet Explorer |
| Modèle de certificat | Serveur Web (Web Server) |
| Format de téléchargement | Base 64 |
Note : Utiliser Edge ou IE — Brave, Chrome et Firefox ne gèrent pas bien l'authentification Windows intégrée (Kerberos/NTLM) et peuvent provoquer des erreurs 401 ou 403.
| Fichier | Description | Nom à utiliser |
|---|---|---|
| certnew.cer | Certificat Nextcloud signé par l'AD CS | nextcloud.crt |
| ca.cer | Certificat racine de l'AC cbaudiment.fr | ca.crt |
Depuis le poste Windows ou le serveur AD, transférer les deux fichiers vers le serveur Nextcloud via SCP :
# Depuis un poste Windows avec OpenSSH installé
scp certnew.cer cedric@192.168.1.11:/home/cedric/nextcloud.crt
scp ca.cer cedric@192.168.1.11:/home/cedric/ca.crt
Puis depuis le serveur Nextcloud, déplacer les fichiers :
mv /home/cedric/nextcloud.crt /etc/ssl/nextcloud/nextcloud.crt
mv /home/cedric/ca.crt /etc/ssl/nextcloud/ca.crt
Méthode alternative — copier-coller : Si SCP n'est pas disponible, afficher le contenu du certificat sur Windows et le coller manuellement dans nano sur Debian :
nano /etc/ssl/nextcloud/nextcloud.crt # coller le contenu de certnew.cer
nano /etc/ssl/nextcloud/ca.crt # coller le contenu de ca.cer
Pour que Debian fasse confiance à la PKI interne cbaudiment.fr — indispensable pour les connexions LDAPS vers l'AD et pour que les outils système valident le certificat Nextcloud.
# Installer le paquet ca-certificates si absent
apt install -y ca-certificates
# Copier la CA dans le magasin système
cp /etc/ssl/nextcloud/ca.crt /usr/local/share/ca-certificates/cbaudiment-ca.crt
# Mettre à jour le magasin
update-ca-certificates
Info : Cette étape est indispensable pour que Nextcloud puisse valider le certificat de l'AD lors des connexions LDAPS (port 636).
Avant de configurer Apache, vérifier que la clé privée et le certificat forment bien une paire valide. Si les md5sum sont différents, le serveur web refusera de démarrer.
# Vérifier les fichiers présents
ls -la /etc/ssl/nextcloud/
# Doit afficher : nextcloud.key nextcloud.crt ca.crt openssl.cnf
# Vérifier la cohérence clé / certificat
openssl x509 -noout -modulus -in /etc/ssl/nextcloud/nextcloud.crt | md5sum
openssl req -noout -modulus -in /etc/ssl/nextcloud/nextcloud.csr | md5sum
# Les deux md5sum doivent être identiques
# Vérifier le contenu du certificat (SAN, dates, usage)
openssl x509 -in /etc/ssl/nextcloud/nextcloud.crt -text -noout
# Sécuriser la clé privée
chmod 600 /etc/ssl/nextcloud/nextcloud.key
chown root:root /etc/ssl/nextcloud/nextcloud.key
Erreur connue — md5sum différents : La clé privée et le certificat ne correspondent pas. Cela arrive si la CSR a été régénérée après la signature, ou si la clé a été écrasée. Recommencer depuis l'étape 1 en supprimant tous les fichiers existants :
rm /etc/ssl/nextcloud/nextcloud.key /etc/ssl/nextcloud/nextcloud.csr
Créer le fichier /etc/apache2/sites-available/nextcloud.conf :
<VirtualHost *:80>
ServerName nextcloud.cbaudiment.fr
Redirect permanent / https://nextcloud.cbaudiment.fr/
</VirtualHost>
<VirtualHost *:443>
ServerName nextcloud.cbaudiment.fr
DocumentRoot /var/www/nextcloud
SSLEngine on
SSLCertificateFile /etc/ssl/nextcloud/nextcloud.crt
SSLCertificateKeyFile /etc/ssl/nextcloud/nextcloud.key
<Directory /var/www/nextcloud>
Options +FollowSymlinks
AllowOverride All
Require all granted
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
ErrorLog ${APACHE_LOG_DIR}/nextcloud_error.log
CustomLog ${APACHE_LOG_DIR}/nextcloud_access.log combined
</VirtualHost>
a2ensite nextcloud.conf
a2dissite 000-default.conf
apache2ctl configtest
systemctl reload apache2
Ouvrir un navigateur et accéder à https://172.30.99.32 (ou https://nextcloud.cbaudiment.fr). Renseigner les informations suivantes :
| Champ | Valeur |
|---|---|
| Compte administrateur | admin (ou prénom.nom) |
| Mot de passe admin | Choisir un mot de passe fort |
| Dossier de données | /var/nextcloud-data |
| Type de base de données | MySQL/MariaDB |
| Utilisateur BDD | nextcloud |
| Mot de passe BDD | (celui défini lors de la création MariaDB) |
| Nom de la BDD | nextcloud |
| Hôte BDD | localhost |
Note : L'installation peut prendre 1 à 3 minutes. Ne pas rafraîchir la page.
Après l'installation, éditer /var/www/nextcloud/config/config.php pour vérifier ou compléter les paramètres suivants :
<?php
$CONFIG = array (
'instanceid' => 'oc0cw81rqwe9',
'passwordsalt' => '9Uf4CD8/wbgTa98pF++CoDs1QJrEqS',
'secret' => 'iIxZQDHNvbzH3jX7YlXj3nQUwTfsCTF9ewalWNViLCaE>
'trusted_domains' => array (
0 => 'localhost',
1 => '192.168.1.11',
2 => 'nextcloud.cbaudiment.fr',
),
'datadirectory' => '/var/nextcloud-data',
'dbtype' => 'mysql',
'version' => '33.0.0.16',
'overwrite.cli.url' => 'http://nextcloud.cbaudiment.fr',
'overwriteprotocol' => 'http',
'trusted_proxies' => ['192.168.0.1'],
'dbname' => 'nextcloud',
'dbhost' => 'localhost', 'dbtableprefix' => 'oc_',
'mysql.utf8mb4' => true,
'dbuser' => 'nextcloud',
'dbpassword' => 'squall969*',
'installed' => true,
);
Note : Ne jamais laisser de mot de passe en clair dans un document de procédure. Le fichier config.php réel contiendra les valeurs définies lors de l'installation.
Principe général : tout est bloqué par défaut, on n'ouvre que ce qui est strictement nécessaire. Les règles sont appliquées de haut en bas dans PFSense — la première règle qui correspond s'applique.
| Source | Destination | Port | Protocole | Action | Justification |
|---|---|---|---|---|---|
| Internet | 192.168.0.1 | 443 | TCP | Autoriser | Accès HTTPS Nextcloud |
| Internet | 192.168.0.1 | 80 | TCP | Autoriser | Redirection vers HTTPS |
| 192.168.0.1 (DMZ) | 172.30.10.11 (AD) | 389 / 636 | TCP | Autoriser | LDAP / LDAPS vers l'AD |
| 192.168.0.1 (DMZ) | 172.30.10.13 (Fichiers) | 445 | TCP | Autoriser | SMB vers serveur de fichiers |
| 192.168.0.1 (DMZ) | VLAN Serveurs | any | any | Bloquer | Isolation DMZ par défaut |
| VLAN Clients | 192.168.0.1 (DMZ) | 443 | TCP | Autoriser | Accès interne via VPN/LAN |
Note : Tester chaque règle après sa création avec les outils Diagnostics > Ping et Diagnostics > Packet Capture de PFSense.
Cette étape permet aux utilisateurs de se connecter à Nextcloud avec leurs identifiants Windows Active Directory.
Aller dans Paramètres > Administration > LDAP/AD Integration :
| Paramètre | Valeur |
|---|---|
| Hôte | 172.30.10.11 |
| Port | 389 (LDAP) ou 636 (LDAPS) |
| DN de l'utilisateur de liaison (bind DN) | CN=svc-nextcloud,CN=Users,DC=cbaudiment,DC=fr |
| Mot de passe de liaison | (mot de passe du compte de service) |
| DN de base | DC=cbaudiment,DC=fr |
Résolution — Connexion LDAP/LDAPS Nextcloud vers Active Directory
Symptôme
La configuration LDAP dans Nextcloud affiche "Connection to LDAP server could not be established" ou "Bind failed: Strong(er) authentication required" malgré une connectivité réseau correcte.
Diagnostic préalable
Vérifier que le port LDAP est joignable depuis Nextcloud :
nc -zv 172.30.10.11 389
nc -zv 172.30.10.11 636
Tester la connexion LDAP simple (port 389) :
LDAPTLS_REQCERT=never ldapsearch -x -H ldap://172.30.10.11 \
-D "CN=svc-nextcloud,CN=Users,DC=cbaudiment,DC=fr" \
-w "TON_MOT_DE_PASSE" \
-b "DC=cbaudiment,DC=fr" \
"(sAMAccountName=svc-nextcloud)"
Si le résultat est Strong(er) authentication required → l'AD exige une connexion sécurisée, passer sur LDAPS (port 636).
Tester la connexion LDAPS (port 636) avec vérification du certificat désactivée :
echo "TLS_REQCERT never" >> /etc/ldap/ldap.conf
LDAPTLS_REQCERT=never ldapsearch -x -H ldaps://172.30.10.11 \
-D "CN=svc-nextcloud,CN=Users,DC=cbaudiment,DC=fr" \
-w "TON_MOT_DE_PASSE" \
-b "DC=cbaudiment,DC=fr" \
"(sAMAccountName=svc-nextcloud)"
Si result: 0 Success → LDAPS fonctionne, le problème vient de la configuration Nextcloud.
Erreur connue — "Strong(er) authentication required" sur port 389 : Cause : Windows Server 2022 exige par défaut la signature LDAP ou SSL/TLS. Le port 389 sans chiffrement est refusé. Solution : utiliser LDAPS sur le port 636 à la place de LDAP sur 389.
Erreur connue — LDAPS échoue depuis PHP/Nextcloud malgré turnOffCertCheck=1 : Cause : Nextcloud préfixe automatiquement le host avec ldap:// au lieu de ldaps:// même sur le port 636, ce qui empêche l'établissement du tunnel TLS. Solution : spécifier explicitement le préfixe ldaps:// dans le champ hôte :
cd /var/www/nextcloud
php occ ldap:set-config s01 ldapHost "ldaps://172.30.10.11"
php occ ldap:set-config s01 ldapPort 636
php occ ldap:set-config s01 ldapTLS 0
php occ ldap:set-config s01 turnOffCertCheck 1
php occ ldap:set-config s01 ldapLoginFilter "(&(objectClass=user)(sAMAccountName=%uid))"
php occ ldap:set-config s01 ldapUserFilter "(&(objectClass=person)(objectClass=user))"
php occ ldap:test-config s01
Le résultat doit être : The configuration is valid and the connection could be established!
Erreur connue — Serveur backup inaccessible : Cause : Si un serveur backup est configuré (ex: 172.30.20.10) mais inaccessible, Nextcloud tente de s'y connecter après l'échec du principal. Solution temporaire : vider le backup le temps de configurer LDAP :
php occ ldap:set-config s01 ldapBackupHost ""
php occ ldap:set-config s01 ldapBackupPort ""
Le remettre une fois LDAPS fonctionnel :
php occ ldap:set-config s01 ldapBackupHost "ldaps://172.30.20.10"
php occ ldap:set-config s01 ldapBackupPort 636
Vérification finale
php occ ldap:test-config s01
# Doit retourner : The configuration is valid and the connection could be established!
Sur le serveur Windows AD (172.30.10.11), ouvrir Utilisateurs et ordinateurs Active Directory :
Dans l'onglet 'Utilisateurs' de la configuration LDAP, utiliser ce filtre pour ne récupérer que les utilisateurs du bon groupe :
(&(objectClass=person)(memberOf=CN=Nextcloud-Users,OU=Groupes,DC=cbaudiment,DC=fr))
Info : Créer le groupe 'Nextcloud-Users' dans l'AD et y ajouter les utilisateurs autorisés à accéder à Nextcloud.
(objectClass=group)
| Paramètre | Valeur |
|---|---|
| Attribut de connexion | sAMAccountName |
| Attribut de nom d'affichage | displayName |
| Attribut email | |
| Chiffrement | STARTTLS (recommandé) ou None en lab |
Cliquer sur 'Tester la connexion' — le résultat doit être positif avant de continuer.
Cette configuration permet aux utilisateurs de voir les partages du serveur de fichiers directement dans Nextcloud.
Aller dans Paramètres > Administration > Stockage externe. Cliquer sur 'Add external storage' :
| Paramètre | Valeur |
|---|---|
| Nom du dossier | Fichiers |
| Stockage externe | SMB / CIFS |
| Hôte | 172.30.10.13 |
| Partage | Fichiers |
| Domaine | cbaudiment.fr |
| Utilisateur | $user (variable dynamique) |
| Mot de passe | Laisser vide si auth AD gérée par LDAP |
Note : Si le serveur de fichiers impose une authentification par utilisateur, sélectionner 'Identifiants de connexion, enregistrés dans la session'. L'utilisateur saisira ses credentials AD la première fois.
Sur le serveur Nextcloud, tester la connectivité SMB manuellement :
apt install -y smbclient
smbclient -L //172.30.10.13 -U 'cbaudiment.fr\admin.cbaudiment'
# Tester l'accès à un partage spécifique
smbclient //172.30.10.13/Fichiers -U 'cbaudiment.fr\admin.cbaudiment'
S'assurer que les permissions SMB sur le serveur de fichiers sont correctement configurées :
Info : Les permissions Nextcloud et les permissions SMB sont cumulatives. Un fichier inaccessible côté SMB sera également inaccessible dans Nextcloud.
| Test | Commande | Résultat attendu |
|---|---|---|
| Ping vers l'AD | ping 172.30.10.11 |
Réponse OK |
| Ping vers serveur fichiers | ping 172.30.10.13 |
Réponse OK |
| LDAPS vers AD | ldapsearch -H ldap://172.30.10.11 -x -b 'DC=...' |
Connection succeeded |
| SMB vers fichiers | smbclient -L //172.30.10.13 |
Liste des partages |
| HTTPS Nextcloud | curl -k https://192.168.0.1 |
HTML de Nextcloud |
# Logs Nextcloud
tail -f /var/nextcloud-data/nextcloud.log
# Logs Apache
tail -f /var/log/apache2/nextcloud_error.log
# Logs système
journalctl -u apache2 -f
# Via CLI (recommandé)
cd /var/www/nextcloud
sudo -u www-data php occ upgrade
sudo -u www-data php occ maintenance:mode --off
Info : La mise à jour est également disponible via l'interface web : Paramètres > Administration > Vue d'ensemble.
Configurer le cron système pour les tâches de fond Nextcloud :
crontab -u www-data -e
# Ajouter cette ligne :
*/5 * * * * php /var/www/nextcloud/cron.php
Dans Nextcloud, aller dans Paramètres > Administration > Paramètres de base et sélectionner 'Cron' comme méthode de tâches de fond.
Inclure dans la stratégie de sauvegarde VEEAM (172.30.10.22) :
mysqldump -u root -p nextcloud > backup_nextcloud.sql
Info : Le serveur de fichiers (172.30.10.13) est déjà sauvegardé par VEEAM — les fichiers montés via SMB sont donc couverts.
Le serveur Zabbix (172.30.99.3) peut monitorer Nextcloud via :