Skip to content
Landinux
  • Accueil
  • Agenda
  • L’association
    • Qui sommes nous ?
    • Contact / Accès
    • Adhérer
  • Docs
    • Docs Utilisateurs
      • Install-party : Linux pour toutes et tous
        • Préparer sa venue pour l’install party
      • Conférence : Libérez vos ordinateurs
      • Initiation : Utiliser GNU/Linux Ubuntu
      • Sur la route des Logiciels Libres
    • Docs Administrateurs
      • Trucs & Astuces
      • Le CHATONS de Landinux
  • Home
  • /
  • Création d’un CHATONS – 2 / 5 : déploiement du serveur LAMP

Création d’un CHATONS – 2 / 5 : déploiement du serveur LAMP

Après avoir décrit les grandes lignes de la mission qui nous incombe dans l’épisode précédent Création d’un CHATONS – 1 / 5 : Généralités, nous allons à présent nous attaquer au vif du sujet sur le plan technique pour le déploiement et la configuration des divers services à mettre en place pour constituer un serveur de type L.A.M.P. requis pour le fonctionnement de NextCloud.

Table des matières

Toggle
  • Système d’exploitation : Debian
    • Installation
    • Outils administrateurs
    • EtcKeeper
    • Grappe de disques RAID
      • Création des partitions
      • Création de l’aire RAID
    • Serveur SSH
    • Résolutions des noms : contexte DNS
    • Pare-feu
      • Config. provisoire UFW
      • Tests fonctionnels
      • Sauvegardes
  • Services essentiels
    • Serveur de dossiers partagés NFS
      • Côté serveur
      • Côté clients
    • Serveur de mail Postfix
    • Annuaire des utilisateurs : OpenLDAP
      • Installation
      • Configuration
        • Config réseau
        • Config LDAP du système
        • Modifier des permissions (ACL’s)
        • Extensions « MemberOf »
        • Peupler l’annuaire LDAP
        • Sécurisations TLS (ldapS)
        • Ouvrir les session shell avec des utilisateurs LDAP
          • Sur le serveur
          • Créer automatiquement le dossier /home
          • Sur les postes clients
        • JXplorer : gestionnaire de comptes LDAP graphique
        • LAM : gestionnaire de comptes LDAP www
    • Quotas de disque
  • Le L.A.M.P.
    • Base de donnée : MariaDB
    • Serveur www Apache2
      • Installation du serveur www Apache2 + PHP8-FPM
      • Configuration du serveur www Apache2
        • Configuration de PHP8.4-FPM pour Apache2
        • Activation des modules Apache2
        • Ajout de l’hôte virtuel
      • Test fonctionnels
  • La suite … 3/5 : NextCloud server

Système d’exploitation : Debian

Debian est l’une des plus anciennes distribution GNU/Linux.

Debian se distingue de la plupart des distributions fondées sur elle par son caractère non commercial et par le mode de gouvernance coopératif de l’association qui gère la distribution.

Installation

Installation standard Debian netinst 11 sans X-Windows sur la carte microSD installée (/dev/sde), en s’appuyant sur le document de référence fourni par le fondation Debian : Manuel d’installation pour la distribution Debian GNU/Linux

Outils administrateurs

Bases :

sudo apt-get update
sudo apt install dnsutils net-tools htop iftop screen etckeeper mercurial git vim mailutils ethtool debian-goodies pwgen

Aussi

sudo apt-get install ca-certificates apt-transport-https software-properties-common wget curl lsb-release

EtcKeeper

Afin de garder un historique des modifications effectuées dans l’arborescence /etc/* ; il faut à chaque changement soumettre ses modifications à EctKeeper qui dans l’exemple s’appuie sur le système de versioning Mercurial.

Modifier le fichier : /etc/etckeeper/etckeeper.conf :

VCS="hg"
#VCS="git"

# [...]

AVOID_DAILY_AUTOCOMMITS=1

Ensuite, il faut initialiser le système, et éventuellement signaler la première version (bloc ci-dessous) :

cd /etc && sudo etckeeper init

À chaque modification des configurations, afin de consigner les changements validés, il faut soumettre les modifs :

sudo etckeeper commit

Si l’on souhaite savoir où on en est :

cd /etc/ && sudo hg status

Ou encore obtenir le log des modifs :

cd /etc/ && sudo hg log
 changeset: 0:09a9c9ebb03a
 tag: tip
 user: ba*****@***********ux.lan
 date: Wed May 03 19:10:24 2023 +0200
 summary: INIT

Grappe de disques RAID

Nous choisissons le RAID de niveau 5, étant donné que nous avons 4 disques et que c’est le mode proposant un ratio capacité/sécurité le plus optimal.

Nous nous baserons sur ces deux tutoriaux/documentations :

  • WikiPedia [fr] : RAID (informatique)
  • TecMint [en] : tutoriel détaillé : How to Manage Software RAID’s in Linux with ‘Mdadm’ Tool
  • Wiki Debian [fr] : exemple de construction d’une aire RAID 1 : SofwareRAID

Tout d’abord, créer les partitions sur chaque disque :

Création des partitions

Ce tutoriel décris assez bien les bases du partitionnement via la ligne de commande :

  • IT-Connect [fr] : Debian : Partitionner un disque avec fdisk et mkfs

Il est conseillé de vérifier la présense des divers volumes avec des commandes telles que : lsblk, df -h, mount

Nous allons donc initialiser les 4 tables de partitions pour les 4 disques /dev/sda, sdb, sdc et sdd :

sudo fdisk /dev/sdX

La taille importante des disques impose la création d’une table de partitions de type GPT. Il faut ensuite changer le type pour « Linux RAID » (43). Au final nous devons avoir ceci pour sda, sdb, sdc et sdd :

Disque /dev/sda : 3,64 TiB, 4000787030016 octets, 7814037168 secteurs
Modèle de disque : TOSHIBA HDWT840 
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 4096 octets
Type d'étiquette de disque : gpt
Identifiant de disque : 88172725-B843-AA44-BA0C-F7F0A65BE5C1

Périphérique Début Fin Secteurs Taille Type
/dev/sda1 2048 7814037134 7814035087 3,6T RAID Linux

Il faudra donc répéter l’opération pour les 4 disques …

Création de l’aire RAID

Nous installons mdadm :

sudo apt install mdadm

Pour pouvoir créer l’aire RAID5 sur les 4 disques de 4To chacuns :

sudo mdadm --create /dev/md0 --level=5 --raid-devices=4 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1

L’exécution est immédiate :

mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

La construction de l’aire RAID prend beaucoup, beaucoup, beaucoup de temps (presque 6 heures dans le cas présent). Nous pouvons en observer l’évolution via /proc/mdadm :

cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid5 sdd1[4] sdc1[2] sdb1[1] sda1[0]
11720655360 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [UUU_]
[>....................] recovery = 0.0% (329756/3906885120) finish=1184.6min speed=54959K/sec
bitmap: 30/30 pages [120KB], 65536KB chunk

unused devices: <none>

L’opération est terminée une fois que nous avons cette sortie [4/4] [UUUU] :

md0 : active raid5 sdd1[4] sdc1[2] sdb1[1] sda1[0]
11720655360 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
bitmap: 0/30 pages [0KB], 65536KB chunk

unused devices: <none>

À ce moment, il est fortement recommandé de redémarrer le serveur avant d’utiliser la nouvelle aire RAID. Pour une raison que j’ignore /dev/md0 est renommé en /dev/md127

Nous pouvons à présent créer et formater la partition :

$ sudo fdisk /dev/md127
Le périphérique ne contient pas de table de partitions reconnue.
La taille du disque est 10,9 TiB (12001951088640 octets). Ce format de table de partitions DOS ne peut pas être utilisé sur des disques pour des volumes plus grands que 2199023255040 octets pour des secteurs de 512 octets. Utilisez le format de table de partitions à GUID (GPT).

Création d'une nouvelle étiquette pour disque de type DOS avec identifiant de disque 0xf15aa0ee.

Commande (m pour l'aide) : g
Une nouvelle étiquette de disque GPT a été créée (GUID : E52DF8C1-70EF-464B-B3F2-F1E19A22D459).

Nous pouvons créer la partition à proprement parler :

Commande (m pour l'aide) : n
Numéro de partition (1-128, 1 par défaut) : 
Premier secteur (3072-23441310686, 3072 par défaut) : 
Dernier secteur, +/-secteurs ou +/-taille{K,M,G,T,P} (3072-23441310686, 23441310686 par défaut) :

Une nouvelle partition 1 de type « Linux filesystem » et de taille 10,9 TiB a été créée.

Et vérifier avant de valider les modifications :

Commande (m pour l'aide) : p
Disque /dev/md127 : 10,92 TiB, 12001951088640 octets, 23441310720 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 524288 octets / 1572864 octets
Type d'étiquette de disque : gpt
Identifiant de disque : E52DF8C1-70EF-464B-B3F2-F1E19A22D459

Périphérique Début Fin Secteurs Taille Type
/dev/md127p1 3072 23441310686 23441307615 10,9T Système de fichiers Linux

Nous pouvons quitter en écrivant la table de partitions déjà crée :

Commande (m pour l'aide) : w
La table de partitions a été altérée.
Appel d'ioctl() pour relire la table de partitions.
Synchronisation des disques.

Maintenant, nous formatons cette vaste partition au standard ext4 :

$ sudo mkfs.ext4 /dev/md127p1 
mke2fs 1.46.2 (28-Feb-2021)
Creating filesystem with 2930163451 4k blocks and 366272512 inodes
Filesystem UUID: 46f704a2-911b-4ec9-882a-f37c2c7b0cec
Superblock backups stored on blocks: 
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
102400000, 214990848, 512000000, 550731776, 644972544, 1934917632, 
2560000000

Allocating group tables: done 
Writing inode tables: done 
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

Ensuite, nous sauvegardons les données utilisateur qui pourraient être présentes dans le dossier /home actuel.
Fermer toutes les sessions utilisateur et se connecter directement en root. Au préalable, vérifier qu’il n’y ait pas d’autres sessions ouvertes :

w
14:37:20 up 1:00, 1 user, load average: 0,00, 0,01, 0,05
UTIL. TTY DE LOGIN@ IDLE JCPU PCPU QUOI
root pts/0 192.168.69.69 14:37 0.00s 0.00s 0.00s w

Nous comparons l’espace disponible dans le répertoire de destination et le poids du dossier /home :

df -h /
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/sde3 50G 1,9G 45G 4% /
du -hs /home
48K /home

Nous pouvons sauvegarder ce répertoire très léger :

cp -Ra /home /root/

Et puis, après avoir vérifié qu’il ne contenait pas de fichiers cachés, supprimer tout le contenu de /home :

ls -a /home/
. ..
rm -R /home/*

Nous récupérons l’ID de la partition :

sudo blkid /dev/md127p1 
/dev/md127p1: UUID="46f704a2-911b-4ec9-882a-f37c2c7b0cec" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="55c3e13e-fd2e-fd4a-b3c8-6f2f84322128"

Il est temps de la monter dans le répertoire /home en ajoutant ces lignes à la configuration des montages : /etc/fstab :

# /home is RAID area /dev/md127
UUID=46f704a2-911b-4ec9-882a-f37c2c7b0cec /home ext4 defaults 0 2

Nous n’avons pas besoin de redémarrer, cependant ça peut être utile pour s’assurer que le montage s’effectue correctement au boot.

sudo mount /home
sudo df -h /home
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/md127p1 11T 28K 11T 1% /home

sudo reboot

C’est tout bon : La grappe de disques est à présent pleinement fonctionnelle !

Serveur SSH

Afin de s’épargner une masse importante de tentatives de connections intempestives ; il est choisi de modifier le port SSH par défaut 22 pour, par exemple, 2402 :

/etc/ssh/sshd_config :

Port 2424
#Port 22

Appliquer les changements en redémarrant le service (à noter que celui-ci à la délicatesse de garder les sessions déjà ouvertes sur le port 22)

sudo service ssh restart

Résolutions des noms : contexte DNS

Durant l’installation et la configuration, nous souhaitons être accessible uniquement à l’intérieur du LAN.

Ainsi il convient que la résolution des noms soit correctement configurées sur le DNS utilisé sur le LAN. Un vrai routeur saurait être trop conseillé pour ce faire …

!!! SRV _ldap_ !!!

Il conviendra d’y renseigner un enregistrement de type A dans la config DNS utilisé sur le LAN, par exemple sur un routeur OpenWRT : /etc/hosts :

192.168.69.10 cloud.landinux.lan
/etc/init.d/dnsmasq restart

Pare-feu

Afin de se simplifier la vie, nous allons utiliser l’interface de gestion de pare-feu netfilter/iptables Uncomplicated Firewall, plus connu sous le diminutif ufw.

https://www.it-connect.fr/configurer-un-pare-feu-local-sous-debian-11-avec-ufw/

Config. provisoire UFW

sudo apt install ufw

Ensuite, l’établissement des règles est assez simple, du moins pour l’instant, nous souhaitons ouvrir en entrée les services/ports suivants :

Depuis n’importe où :

  • HTTP : 80
  • HTTPS : 443
  • SSH : 2424 (port 22 par défaut modifié juste au dessus)

Uniquement accessibles depuis le LAN landinux.lan / 192.168.41.0/24 :

  • NFS : 2049
  • LDAP : 389 –provisoire–
  • LDAPS : 636
# Interdire tous le traffic entrant
sudo ufw default deny incoming
# Autoriser tous le traffic sortant
sudo ufw default allow outgoing

# Autoriser certains services :
# HTTP
sudo ufw allow http
# HTTPS
sudo ufw allow https
# SSH (port non-standard : 2424)
sudo ufw limit 2424/tcp
# NFS (2049)
sudo ufw allow from 192.168.41.0/24 to 192.168.41.10 port 2049
# LDAP --provisoire-- (389)
sudo ufw allow from 192.168.41.0/24 to 192.168.41.10 port 389
# LDAPS (636)
sudo ufw allow from 192.168.41.0/24 to 192.168.41.10 port 636

# Lancer le tout !
sudo ufw enable
  Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
  Firewall is active and enabled on system startup

Nous pouvons activer cette configuration :

sudo ufw enable
  Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
  Firewall is active and enabled on system startup

Nous pouvons vérifier le résultat qui doit ressembler à cela :

sudo ufw status numbered
 Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 80/tcp                     ALLOW IN    Anywhere                  
[ 2] 443/tcp                    ALLOW IN    Anywhere                  
[ 3] 2442/tcp                   LIMIT IN    Anywhere                  
[ 4] 192.168.41.107 2049        ALLOW IN    192.168.41.0/24           
[ 5] 192.168.41.10 389          ALLOW IN    192.168.41.0/24           
[ 6] 192.168.41.10 636          ALLOW IN    192.168.41.0/24

Si l’on souhaite supprimer l’une des règles, il faut indiquer son numéro présenté dans la liste précédente, par exemple :

sudo ufw delete 6

La modification est immédiate !
Éventuellement … :

sudo ufw reload

Tests fonctionnels

Depuis un autre hôte présent sur le LAN, nous allons effectuer quelques vérifications …

La base : vérifier si ça répond aux pings :

ping -c 2 cloud.landinux.lan
PING cloud.landinux.lan (192.168.41.10) 56(84) bytes of data.
64 octets de cloud.landinux.lan (192.168.41.10) : icmp_seq=1 ttl=64 temps=0.205 ms
64 octets de cloud.landinux.lan (192.168.41.10) : icmp_seq=2 ttl=64 temps=0.178 ms

--- statistiques ping cloud.landinux.lan ---
2 paquets transmis, 2 reçus, 0 % paquets perdus, temps 1026 ms
rtt min/moy/max/mdev = 0,178/0,191/0,205/0,013 ms

Et surtout faire un scan de ports :

nmap -p 0-4096 cloud.landinux.lan
  Starting Nmap 7.80 ( https://nmap.org ) at 2023-05-06 18:28 CEST
  Nmap scan report for cloud.landinux.lan (192.168.41.10)
  Not shown: 4091 filtered tcp ports (no-response)
  PORT     STATE  SERVICE
  80/tcp   open   http
  389/tcp  open   ldap
  443/tcp  closed https
  636/tcp  closed ldapssl
  2049/tcp open   nfs
  2442/tcp open   netangel

  Nmap done: 1 IP address (1 host up) scanned in 12.40 seconds

Sauvegardes

Blabla …

Services essentiels

Serveur de dossiers partagés NFS

Côté serveur

Nous commençons par utiliser ce protocole fiable et éprouvé pour permettre à nos postes clients d’accéder aux ressources présentes dans le dossier /home.

Nous verrons par la suite que ceci peut poser problème avec certains applicatifs exigeant des accès fréquents et volumineux au répertoire personnel. D’autres méthodes seront explorée plus loin, à savoir :

  • AutoFS – montage automatique de systèmes de fichier
  • NextCloud VFS (Virtual File System)

L’installation et la configuration sont assez simples !

apt install nfs-common nfs-kernel-server
systemctl start nfs-kernel-server.service

Il faudra éditer le fichiers /etc/exports :

# Example for NFSv4:
#/home 192.168.41.0/24 (rw,no_root_squash,no_subtree_check,async)
/home 192.168.41.0/24(rw,sync,no_subtree_check)

Nous appliquons cette config :

exportfs -a

Côté clients

À priori, il y a déjà au moins un dossier utilisateur dans le dossier /home des postes clients. Nous allons le(s) déplacer dans un autre dossier, par exemple « lhome » (pour Local Home), en ouvrant une session directement avec utilisateur root (provisoirement l’option « PermitRootLogin yes » dans /etc/ssh/sshd_config ) :

mkdir /lhome
mv /home/user1 /lhome

Nous modifions /etc/passwd en conséquence :

user1:x:1000:1000:User 1 LOCAL,,,:/lhome/user1:/bin/bash

Nous installons le support NFS :

apt install nfs-common

Pour enfin éditer /etc/fstab en ajoutant cette ligne afin d’accéder au dossier /home présent sur le serveur :

192.168.41.10:/home /home nfs rw,hard,intr,rsize=8192,wsize=8192,timeo=14	0	0

Serveur de mail Postfix

Cet aspect est détaillé sur le blog BB Systèmes & Réseaux : RelayHost SMTP avec Postfix

Annuaire des utilisateurs : OpenLDAP

Installation

Basé sur cette série de tutoriels :

  • https://blog.debugo.fr/openldap-installation-configuration/
  • https://fr.linux-console.net/?p=30696
  • …

Installer les packages :

sudo apt install slapd ldap-utils ldapscripts

Nous avons besoin de reprendre la config de base du serveur LDAP (slapd)

Il s’agit de spécifier le base DN qui nomme votre organisation, par exemple pour monEtab.monDomaine.fr :

dc=monEtab,dc=monDomaine,dc=fr


Dans notre cas, évidemment notre organisation est : Landinux.Org ! Par conséquent, notre base DN sera :

dc=landinux,dc=org
sudo dpkg-reconfigure slapd

Saisir 2 fois le mot de passe de l’administrateur LDAP :

 Backing up /etc/ldap/slapd.d in /var/backups/slapd-2.5.13+dfsg-5... done.                                                                                                                   
  Moving old database directory to /var/backups:
  - directory unknown... done.
  Creating initial configuration... done.
  Creating LDAP directory... done.

Éventuellement relancer le service slapd et vérifier son status :

sudo service slapd restart && sudo service slapd status
● slapd.service - LSB: OpenLDAP standalone server (Lightweight Directory Access Protocol)
     Loaded: loaded (/etc/init.d/slapd; generated)
    Drop-In: /usr/lib/systemd/system/slapd.service.d
             └─slapd-remain-after-exit.conf
     Active: active (running) since Sun 2025-08-31 19:25:11 CEST; 4s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 12915 ExecStart=/etc/init.d/slapd start (code=exited, status=0/SUCCESS)
      Tasks: 3 (limit: 4572)
     Memory: 5.3M
        CPU: 40ms
     CGroup: /system.slice/slapd.service
             └─12922 /usr/sbin/slapd -h "ldap:/// ldapi:///" -g openldap -u openldap -F /etc/ldap/slapd.d

août 31 19:25:11 kane systemd[1]: Starting slapd.service - LSB: OpenLDAP standalone server (Lightweight Directory Access Protocol)...
août 31 19:25:11 kane slapd[12921]: @(#) $OpenLDAP: slapd 2.5.13+dfsg-5 (Feb  8 2023 01:56:12) $
                                             Debian OpenLDAP Maintainers <pk****************@*****************an.org>
août 31 19:25:11 kane slapd[12922]: slapd starting
août 31 19:25:11 kane slapd[12915]: Starting OpenLDAP: slapd.
août 31 19:25:11 kane systemd[1]: Started slapd.service - LSB: OpenLDAP standalone server (Lightweight Directory Access Protocol).

Configuration

Config réseau

Généralement ceci se configure du côté du routeur au chapitre serveur DHCP/DNS. Ce n’est pas l’objet de ce tutoriel.

Nous devons donc disposer d’une résolution de noms valides pour notre serveur ldap ,vérifier cela de préférence sur un poste client :

ssh landinux8
[...]
nslookup ldap.landinux.lan ns.landinux.lan
  Server:		ns.landinux.lan
  Address:	192.168.41.254#53

  Name:	ldap.landinux.lan
  Address: 192.168.41.10

Lequel doit être actif et, du moins pour l’instant, mettre à disposition son port ldap 389/tcp :

# PING
ping -c 1 ldap.landinux.lan
PING ldap.landinux.lan (192.168.41.10) 56(84) bytes of data.
64 bytes from kane.landinux.lan (192.168.41.10): icmp_seq=1 ttl=64 time=0.146 ms

--- ldap.landinux.lan ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.146/0.146/0.146/0.000 ms

# Port 389
nmap -Pn -p 389 ldap.landinux.lan
Starting Nmap 7.94SVN [...]

PORT    STATE SERVICE
389/tcp open  ldap

Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds

Dans l’immédiat, les échanges entre le LAN et le serveur LDAP passent en clair, ce qui n’est pas recommandé. Il nous faudra ultérieurement mettre en place le protocole ldapS 636/tcp …

Config LDAP du système

Nous modifions le fichier /etc/ldap/ldap.conf (sur certains distributions, il est placé dans /etc/ldap.conf ) :

#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

BASE    dc=landinux,dc=org
URI     ldap://localhost

SIZELIMIT      5000
TIMELIMIT      15
DEREF          never

# TLS certificates (needed for GnuTLS)
# !!! WARNING !!!  Don't modify now, will be done after ...
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt

Ainsi il ne sera plus nécessaire de spécifier le base dn ainsi que l’hôte dans nos prochaines requêtes …

Modifier des permissions (ACL’s)

Inspiré de ce tutoriel : Les ACL dans OpenLDAP par Vincent Liefooghe

Nous souhaitons modifier quelques réglages afin de :

  • Autoriser les utilisateurs à modifier leur propre mot-de-passe
  • Empêcher les utilisateurs de lire les mots-de-passes qui ne leur appartiennent pas

Nous écrivons un fichier baseACL.ldif :

# Allow users to change only his own password
dn: olcDatabase={1}mdb,cn=config
changeType: modify

add: olcAccess
olcAccess: to attrs=userPassword by self write by anonymous auth by dn.base="cn=admin,dc=landinux,dc=org" write by * none

add: olcAccess
olcAccess: to * by self write by dn.base="cn=admin,dc=landinux,dc=org" write by * read

Que nous pouvons insérer :

ldapadd -x -D 'cn=admin,dc=landinux,dc=org' -w '<AdminPassword>' -f baseACL.ldif

Enfin vérifier le bon fonctionnement avec un utilisateur fonctionnel :

# Connect with current password
ssh -p 2424 manager@localhost
manager@localhost's password:
Linux kane 6.1.0-38-amd64 [...]

# change the password
manager@kane:~$ passwd
(current) LDAP Password: 
Nouveau mot de passe : 
Retapez le nouveau mot de passe : 
passwd : mot de passe mis à jour avec succès
manager@kane:~$ exit

# Try new password
ssh -p 2424 manager@localhost
manager@localhost's password:
Linux kane 6.1.0-38-amd64 [...]

manager@kane:~$
# Hurra !!!
Extensions « MemberOf »

/usr/lib/ldap/memberof.lall /e

Peupler l’annuaire LDAP

Nous allons créer les groupes racine en éditant un fichier base.ldif : vim people.ldif & group.ldif :

# people.ldif
dn: ou=People,dc=landinux,dc=org
objectClass: organizationalUnit
ou: people
# group.ldif
dn: ou=Groups,dc=landinux,dc=org
objectClass: organizationalUnit
ou: groups

Que l’on insère dans l’annuaire :

ldapadd -x -D 'cn=admin,dc=landinux,dc=org' -w '<AdminPassword>' -f people.ldif
ldapadd -x -D 'cn=admin,dc=landinux,dc=org' -w '<AdminPassword>' -f group.ldif

Nous faisons une recherche simple :

ldapsearch -H ldap://localhost -D 'cn=admin,dc=landinux,dc=org' -b 'dc=landinux,dc=org' -x -w '<AdminPassword>'

# extended LDIF
#
# LDAPv3
# base <dc=landinux,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# landinux.org
dn: dc=landinux,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: landinux.org
dc: landinux

# People, landinux.org
dn: ou=People,dc=landinux,dc=org
objectClass: organizationalUnit
ou: People

# Groups, landinux.org
dn: ou=Groups,dc=landinux,dc=org
objectClass: organizationalUnit
ou: groups

# search result
search: 2
result: 0 Success

# numResponses: 4
# numEntries: 3

Attention !!!
Bien veiller à ce que les noms des utilisateurs/groupes que nous allons insérer dans l’annuaire LDAP ne soient pas pas déjà présents dans /etc/passwd et /etc/group !!!

Dans un premier temps, nous ajoutons des groupes POSIX : admins, ladmins, users :

# admins.ldif
dn: cn=admins,ou=groups,dc=landinux,dc=org
objectClass: top
objectClass: posixGroup
gidNumber: 200001
cn: admins
# ladmins.ldif
dn: cn=ladmins,ou=groups,dc=landinux,dc=org
objectClass: top
objectClass: posixGroup
gidNumber: 200002
cn: ladmins
# users.ldif
dn: cn=users,ou=groups,dc=landinux,dc=org
objectClass: top
objectClass: posixGroup
gidNumber: 200003
cn: users

On remarque qu’il faut incrémenter les id de +1 à chaque fois, ce qui peut être problématique pour créer des users par la suite …

Nous les insérons :

ldapadd -x -D 'cn=admin,dc=landinux,dc=org' -w '<AdminPassword>' -f  admins.ldif
adding new entry "uid=admins,ou=People,dc=landinux,dc=org"

ldapadd -x -D 'cn=admin,dc=landinux,dc=org' -w '<AdminPassword>' -f  ladmins.ldif
adding new entry "uid=ladmins,ou=People,dc=landinux,dc=org"

ldapadd -x -D 'cn=admin,dc=landinux,dc=org' -w '<AdminPassword>' -f  users.ldif
adding new entry "uid=users,ou=People,dc=landinux,dc=org"

Nous pouvons vérifier la présence de ces groupes dans l’annuaire :

ldapsearch -H ldap://localhost -b 'dc=landinux,dc=org' -x '(objectClass=posixGroup)'
# extended LDIF
# [...]

# admins, Groups, landinux.org
dn: cn=admins,ou=Groups,dc=landinux,dc=org
objectClass: top
objectClass: posixGroup
gidNumber: 200001
cn: admins
memberUid: admins

# ladmins, Groups, landinux.org
dn: cn=ladmins,ou=Groups,dc=landinux,dc=org
[...]

Puis nous créer les 3 premiers utilisateurs appartenant aux 3 groupes créés précédemment :

# ladm.ldif
dn: uid=ladm,ou=People,dc=landinux,dc=org
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uidNumber: 100001
gidNumber: 200002
homeDirectory: /home/ladm
loginShell: /bin/bash
givenName: Admin
sn: Local
cn: Admin Local
uid: ladm
userPassword: UnMotDePasse
ldapadd -x -D 'cn=admin,dc=landinux,dc=org' -w '<AdminPassword>' -f ladm.ldif
adding new entry "uid=ladm,ou=People,dc=landinux,dc=org"
# manager.ldif
dn: uid=manager,ou=People,dc=landinux,dc=org
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uidNumber: 100002
gidNumber: 200001
homeDirectory: /home/manager
loginShell: /bin/bash
givenName: Manager
sn: Total
cn: Manager Total
uid: manager
userPassword: UnMotDePasse
ldapadd -x -D 'cn=admin,dc=landinux,dc=org' -w '<AdminPassword>' -f manager.ldif
adding new entry "uid=manager,ou=People,dc=landinux,dc=org"
# user.test.ldif
dn: uid=user.test,ou=People,dc=landinux,dc=org
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uidNumber: 100003
gidNumber: 200003
homeDirectory: /home/user.test
loginShell: /bin/bash
givenName: User Test
sn: Total
cn: User Test
uid: user.test
userPassword: UnMotDePasse
ldapadd -x -D 'cn=admin,dc=landinux,dc=org' -w '<AdminPassword>' -f user.test.ldif
adding new entry "uid=user.test,ou=People,dc=landinux,dc=org"

Ensuite nous ajoutons ce premier utilisateur « user.test » au groupe « users » , nous créons un fichier users–user.test.ldif :

# users--user.test.ldif
dn: cn=users,ou=groups,dc=landinux,dc=org
changetype: modify
add: memberuid
memberuid: user.test
ldapadd -x -D 'cn=admin,dc=landinux,dc=org' -w '<AdminPassword>' -f users--user.test.ldif

Nous vérifions que cet utilisateur fasse bien partie du groupe users :

getent group | grep users
  users:*:200003:user.test

Nous vérifions la présence de ces entrées dans l’annuaire :

ldapsearch -H ldap://localhost -b 'dc=landinux,dc=org' -x '(objectClass=posixAccount)'
# extended LDIF
#
# [...]

# ladm, People, landinux.org
dn: uid=ladm,ou=People,dc=landinux,dc=org
objectClass: inetOrgPerson
objectClass: posixAccount
[...]
Sécurisations TLS (ldapS)

Inspiré de ce tutoriel : Mise en place d’un serveur OpenLdap sécurisé avec TLS par Nicolas Housset

Ouvrir les session shell avec des utilisateurs LDAP
Sur le serveur

Nous allons en premier lieu connecter l’authentification de notre serveur sur cette base pour permettre aux utilisateurs de se loguer en SSH …

sudo apt install libnss-ldapd libpam-ldapd nscd nslcd nslcd-utils

Il nous faut modifier /etc/nsswitch.conf :

# /etc/nsswitch.conf
# [...]

passwd:         files systemd ldap
group:          files systemd ldap
shadow:         files systemd ldap
gshadow:        files systemd

hosts:          files dns ldap

Puis vérifier que les ajouts que nous venons d’effectuer apparaissent, côté utilisateurs (passwd) :

getent passwd | tail -3
ladm:x:100001:200002:Admin Local:/home/ladm:/bin/bash
manager:x:100002:200001:Manager Total:/home/manager:/bin/bash
user.test:x:100003:200003:User Test:/home/user.test:/bin/bash

Et côté groupes :

getent group | tail -3
admins:*:200001:admins
ladmins:*:200002:ladmins
users:*:200003:users

Pour l’instant, la création des dossiers /home/$USER n’est pas automatique, il nous faut le créer manuellement, ce qui au passage va nous permettre de vérifier le bon fonctionnement de nsswitch :

HOME_DIR=$(getent passwd | grep ladm | awk -F ':' '{print $6}') \
 sudo cp -Ra /etc/skel $HOME_DIR && \
 sudo chown -R ladm:ladmins $HOME_DIR && \
 sudo chmod -R ug+rwX $HOME_DIR && \
 sudo chmod -R o-rwX $HOME_DIR

Il nous reste à tenter d’ouvrir une session shell :

ssh ladm@kane
ladm@192.168.69.66's password: 
Linux deb12 6.1.0-38-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.147-1
[...]

Nous pouvons au passage vérifier l’environnement, les permissions, … :

ladm@deb12:~$ pwd
/home/ladm
ladm@deb12:~$ ll -a
total 32
drwxrwx--- 2 ladm ladmins 4096  5 sept. 13:11 ./
drwxr-xr-x 4 root root    4096  5 sept. 13:19 ../
-rw-rw---- 1 ladm ladmins  220 19 avril 00:47 .bash_logout
-rw-rw---- 1 ladm ladmins 5866  5 sept. 13:11 .bashrc
Créer automatiquement le dossier /home

Nous allons modifier la configuration de l’authentification PAM en ajoutant cette ligne en bas du fichier /etc/pam.d/common-session :

session required pam_mkhomedir.so skel=/home/_misc/skel umask=077

Évidemment le dossier /home/_misc/skel doit être présent (copié depuis /etc/skel afin de le rendre accessible au réseau)

Nous testons cette fonctionnalité avec l’utilisateur « user.test » dédié à ce type d’usage, d’autant plus que nous n’avons pas encore ouvert de session avec ce compte :

ssh -p 2424 user.test@localhost
  user.test@localhost's password: 
  Creating directory '/home/user.test'.
  Linux kane 6.1.0-38-amd64 [...]

# Current dir
user.test@kane:~$ pwd
  /home/user.test
# Location of home dir
user.test@kane:~$ echo $HOME
  /home/user.test
# Check permissions for this home dir
user.test@kane:~$ ll /home | grep user.test
drwx------  2 user.test users     4096 28 sept. 23:56 user.test
Sur les postes clients

Nous reprenons le même setup que ce que nous avons précédemment configuré sur le serveur :

sudo apt install libnss-ldapd libpam-ldapd nscd nslcd nslcd-utils ldap-utils

Attention : ldap://ldap.landinux.lan/

Il nous faut aller modifier /etc/nsswitch.conf :

passwd:         files systemd ldap
group:          files systemd ldap
shadow:         files systemd ldap
gshadow:        files

hosts:          files mdns4_minimal [NOTFOUND=return] dns ldap
networks:       files

[...]

Ainsi que /etc/ldap/ldap.conf en précisant l’URI accessible sur le réseau LAN (pas localhost !) :

#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

BASE    dc=landinux,dc=org
URI     ldap://ldap.landinux.lan

SIZELIMIT      5000
TIMELIMIT      15
DEREF          never

# TLS certificates (needed for GnuTLS)
# !!! WARNING !!!  Don't modify now, will be done after ...
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt

Comme nous l’avons fait côté serveur, afin de créer automatiquement le répertoire $HOME, nous ajoutons vers la fin du fichier : /etc/pam.d/common-session :

session required pam_mkhomedir.so skel=/home/_misc/skel umask=077

Aussi : /etc/nslcd.conf :

[...]
# The location at which the LDAP server(s) should be reachable.
uri ldap://ldap.landinux.lan

# The search base that will be used for all queries.
base dc=landinux,dc=org

# The LDAP protocol version to use.
ldap_version 3
[...]

Il faut relancer le serveur nslcd pour appliquer les changements :

service nslcd restart

Enfin vérifier si les identifiants/groupes du serveur LDAP remontent :

getent passwd
[...]
user.test:x:100003:200004:User Test:/home/user.test:/bin/bash
[...]
user.modele:x:100005:200004:User Modele:/home/user.modele:/bin/bash
[...]
getent group
[...]
ladmins:*:200002:ladm
users:*:200003:bastien.baltazar,user.test
[...]

Éventuellement vérifier si le partage NFS /home est bien monté :

df -h /home
Sys. de fichiers    Taille Utilisé Dispo Uti% Monté sur
192.168.41.10:/home    11T    148G   11T   2% /home

Nous tentons d’abord de nous connecter via SSH avec un utilisateur LDAP …

Puis on se le tente depuis le poste en graphique !

Hurra !!

JXplorer : gestionnaire de comptes LDAP graphique

Un client graphique (GUI) pour explorer des arbres LDAP.

Nous l’installons sur notre poste client de type Debian / Ubuntu :

sudo apt update && sudo apt install jxplorer

La façon la plus simple de le connecter au serveur LDAP distant est d’utiliser un tunnel SSH :

ssh -N -L 3890:localhost:389 hote.mondomaine.tld

Nous pouvons lancer l’appli JXplorer, et configurer l’accès à notre annuaire LDAP. Il est fortement conseillé de spécifier le DN complet pour l’utilisateur « cn=admin,dc=landinux,dc=org », puis d’enregistrer sa configuration en bas de la fenêtre « Utiliser un gabarit » :

Ainsi nous pouvons visualiser/modifier nos objets présents dans l’annuaire :

LAM : gestionnaire de comptes LDAP www

LAM : Ldap Account Manager : https://www.ldap-account-manager.org/

Celui-ci permet une administration plus conviviale et visuelle via un navigateur Web. Il s’installe sur un serveur de type L.A.P.P. ou L.A.M.P., ainsi nous l’installerons plus tard lorsque le serveur www sera opérationnel …

https://devops-db.com/openldap-activation-of-the-memberof-module
https://www.synetis.com/gerer-une-politique-de-mots-de-passe-avec-openldap/
https://github.com/hihuangwei/openldap-schema/blob/master/ppolicy.schema
https://tobru.ch/openldap-password-policy-overlay/

Quotas de disque

…

apt install quota

Le L.A.M.P.

Base de donnée : MariaDB

Nous installons les composants :

sudo apt install mariadb-server mariadb-client mycli

Nous allons pouvoir créer la base et l’utilisateur dédié à Nextcloud :

sudo mycli
CREATE DATABASE nextcloud CHARACTER SET 'UTF8';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nc'@'localhost' IDENTIFIED BY 'Un_gr0s_m0t_de_Passe';
FLUSH PRIVILEGES;

Nous vérifions que nous pouvons bien nous y connecter :

mycli  -u nc -p'Un_gr0s_m0t_de_Passe' nextcloud
Connecting to socket /var/run/mysqld/mysqld.sock, owned by user mysql
[...]

MariaDB nc@(none):nextcloud> SHOW TABLES;
[...]

Aussi quelques modifications du serveur mariadb/mysql proposées dans la doc officielle NextCloud : Database configuration

À noter dans notre cas, ça se passe du côté de /etc/mysql/debian.cnf, /etc/mysql/mariadb.cnf et /etc/mysql/mariadb.conf.d/50-server.cnf

Serveur www Apache2

Nous pourrions aussi nous amuser avec NGinx, qui présente certains avantages tout autant qu’il est moins répandu, donc moins connu des techniciens.

Donc nous allons nous contenter du bon vieux Apache2.

Installation du serveur www Apache2 + PHP8-FPM

Généralement, Apache2 est déjà installé par défaut, si la case correspondante a été cochée lors de l’installation évidemment.

Par-contre, pour disposer des dernière versions de PHP , il nous faut ajouter un dépot externe dans /etc/apt/sources.list.d/php.list :

deb https://packages.sury.org/php/ bookworm main

Ajouter les clefs, et faire en sorte qu’elles soient rafraîchies régulièrement :

wget https://packages.sury.org/php/apt.gpg -O sury.gpg
sudo apt-key add sury.gpg
sudo apt install --only-upgrade debsuryorg-archive-keyring
# If you have warnings when running apt update
sudo apt install --reinstall debsuryorg-archive-keyring
# Finally
sudo apt update

Au moment où ces lignes sont écrites, la dernières version stable de NextCloud Hub 25 Autumn (32.0.1) recomande la version 8.4 de PHP ; nous installons donc PHP8.4-FPM (mode réputé le plus performant) et tout le bazar de modules PHP :

sudo apt install php8.4 php8.4-xml php8.4-fpm php8.4-cli libphp8.4-embed php8.4-redis php8.4-memcached php8.4-imagick php8.4-zip php8.4-bcmath php8.4-bz2 php8.4-curl php8.4-gd php8.4-intl php8.4-ldap php8.4-mbstring php8.4-mysql php8.4-readline php8.4-zip php8.4-apcu php8.4-mysql php8.4-ldap

Configuration du serveur www Apache2

Configuration de PHP8.4-FPM pour Apache2

On en profite pour vérifier que le service php7.4-fpm soit bien fonctionnel:

service php8.4-fpm status
● php8.4-fpm.service - The PHP 8.4 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php8.4-fpm.service; enabled; preset: enabled)
     Active: active (running) since Tue 2025-10-28 17:53:34 CET; 24min ago

Et ajouter ceci à Apache2 :

sudo a2enconf php8.4-fpm
Activation des modules Apache2

Nous allons devoir activer un certain nombre de modules d’Apache2 requis par NextCloud :

sudo a2enmod rewrite
sudo a2enmod headers
sudo a2enmod env
sudo a2enmod dir
sudo a2enmod mime
sudo a2enmod setenvif
sudo a2enmod vhost_alias
sudo a2enmod proxy_fcgi
sudo a2enmod socache_shmcb

Et puis évidemment relancer le serveur www :

sudo service apache2 restart
Ajout de l’hôte virtuel

Dans un premier temps, nous nous contentons de créer un VirtualHost www en HTTP sur le LAN simple à l’aide du script :

/usr/local/sbin/apache2-vhost.sh cloud.landinux.lan

Ensuite, il est conseillé de copier-coller les commandes indiquées

Enfin, nous modifions le fichier de config Apache2 généré en prenant note des recommandations données dans la doc de NextCloud, ainsi que l’utilisation de PHP8.4-FPM : /etc/apache2/sites-available/cloud.landinux.lan.conf :

<VirtualHost *:80>
  Include "conf-available/php8.1-fpm.conf"
  ServerAdmin ba*****@******ux.org
  ServerName cloud.landinux.lan
  #ServerAlias www.cloud.landinux.lan
  DocumentRoot /var/www/vhosts/cloud.landinux.lan
  <FilesMatch "\.(cgi|shtml|phtml|php)$">
    SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
  </FilesMatch>
  <Directory /usr/lib/cgi-bin>
    SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
  </Directory>
  <Directory /var/www/vhosts/cloud.landinux.lan>
    Require all granted
    AllowOverride All
    Options FollowSymLinks MultiViews
  <IfModule mod_dav.c>
    Dav off
  </IfModule>
  </Directory>

  # Logs
  LogFormat "%h %l %u %t \"%r\" %>s %b" cloud.bastbalt.lan
  CustomLog ${APACHE_LOG_DIR}/cloud.bastbalt.lan.access.log cloud.bastbalt.lan
  ErrorLog ${APACHE_LOG_DIR}/cloud.landinux.lan.error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
  #LogLevel warn
</VirtualHost>

On l’ajoute aux sites-enabled :

cd /etc/apache2/sites-enabled && sudo ln -s ../sites-available/cloud.landinux.lan.conf .

On vérifie la config :

sudo apache2ctl configtest
Syntax OK

Enfin on peut redémarrer le service www :

sudo service apache2 restart

Test fonctionnels

Nous allons pouvoir vérifier si le VirtualHost fonctionne correctement :

D’abord créer un fichier /var/www/vhosts/cloud.landinux.lan/test.php contenant :

<?php phpinfo(); ?>

Ensuite, utiliser un navigateur pour se connecter à cette URL LAN :
http://cloud.landinux.lan/test.php

Et normalement, on obtient une belle page phpinfo() qui nous confirme, entres-autres, que le mode FPM/FastCGI est bien utilisé:

La suite … 3/5 : NextCloud server

À présent que tous les pré-requis sont remplis, nous allons enfin pouvoir installer le cœur de métier de notre CHATONS ; à savoir l’installation à proprement parler de l’applicatif NextCloud dans l’épisode suivant …

Création d’un CHATONS – 3/5 : NextCloud server –>

Agenda

  • Pas d'actions prévues

Actualités

  • Du libre à la carte — Un nouveau plug-in MapLibre et l’importance de financer le logiciel libre
  • Intervention en collège
  • Situation Landinux

Copyleft Landinux 2025