Souvenirs d'une installation LAMP manuelle
L’évolution d’une infrastructure se comprend souvent en regardant dans le rétroviseur. Avant de migrer vers une gestion intégralement conteneurisée avec Docker et Traefik, j’ai déployé un service de gestion de parc informatique (GLPI) de bout en bout sur une pile LAMP “Bare-Metal”. Cet article documente cette procédure passée, illustrant parfaitement la complexité des configurations manuelles face à l’Infrastructure as Code d’aujourd’hui.
La première étape consistait à préparer le système d’exploitation Debian pour le lier à l’environnement de l’entreprise. J’ai désactivé les sources CD-ROM pour gérer les mises à jour, puis j’ai installé les dépendances nécessaires avant de joindre la machine à l’Active Directory avec un compte administrateur réseau[cite: 3, 5, 8, 9, 10].
1
2
3
4
5
6
sudo nano /etc/apt/sources.list
# Commenter la ligne cdrom
sudo apt install realmd sssd sssd-tools libnss-sss libpam-sss adcli samba-common-bin oddjob oddjob-mkhomedir packagekit krb5-user -y
sudo realm discover example.com
sudo realm join --user=compte_adm example.com
sudo systemctl restart sssd
Pour permettre à l’équipe technique d’intervenir sur le serveur, j’ai édité manuellement le fichier d’autorisations pour y inclure un groupe AD spécifique. Une modification supplémentaire du module PAM a permis de forcer la création automatique des répertoires personnels lors de la connexion initiale des utilisateurs.
1
2
3
4
5
sudo visudo
# Ajouter la ligne : %ad_admin_group@example.com ALL=(ALL) ALL
sudo nano /etc/pam.d/common-session
# Ajouter la ligne : session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
La sécurisation des accès réseau impliquait une manipulation directe de la configuration SSH. Après avoir sauvegardé le fichier d’origine, j’ai interdit l’accès distant au compte root et j’ai remplacé le message d’accueil par défaut par un script Bash générant une bannière de prévention dynamique.
1
2
3
4
5
6
7
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config
# Modifier : PermitRootLogin no
# Modifier : PrintMotd yes
sudo systemctl restart sshd
sudo nano /etc/update-motd.d/99-custom
Le script intégré générait l’interface d’avertissement en récupérant les données en temps réel.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
HOSTNAME=$(hostname)
IP=$(hostname -I | awk '{print $1}')
LAST_LOGON=$(last -Fw $USER | grep -v "gone - no logout" | head -n 1)
MOTD_LINES=("Bienvenue sur $HOSTNAME" "Adresse IP : $IP" "Dernière connexion :" "$LAST_LOGON" "" "Attention : Tous les accès sont monitorés et limités aux personnes habilitées." "Toute tentative d'accès non autorisée fera l'objet de poursuites.")
max_len=0
for line in "${MOTD_LINES[@]}"; do
[[ ${#line} -gt $max_len ]] && max_len=${#line}
done
print_border() {
echo "+$(printf '%0.s-' $(seq 1 $((max_len + 2))))+"
}
print_border
for line in "${MOTD_LINES[@]}"; do
printf "| %-${max_len}s |\n" "$line"
done
print_border
L’activation du script nécessitait d’ajuster les droits d’exécution et de supprimer le message statique obsolète.
1
2
sudo chmod +x /etc/update-motd.d/99-custom
sudo rm /etc/motd
Ensuite venait l’installation du socle LAMP proprement dit. L’application nécessitait l’installation manuelle d’Apache, de MariaDB, et d’une longue liste d’extensions PHP indispensables, incluant le module LDAP. Le moteur de base de données a été sécurisé via son utilitaire interactif avant la création du schéma applicatif.
1
2
3
4
5
sudo apt-get install apache2 php mariadb-server -y
sudo apt-get install php-xml php-common php-json php-mysql php-mbstring php-curl php-gd php-intl php-zip php-bz2 php-imap php-apcu -y
sudo apt-get install php-ldap -y
sudo mysql_secure_installation
sudo mysql -u root -p
Le code source de l’application a été récupéré sur le dépôt officiel, puis extrait à la racine du serveur web. J’ai réattribué la propriété de l’ensemble des fichiers à l’utilisateur de fonctionnement d’Apache.
1
2
3
4
cd /tmp
wget https://github.com/glpi-project/glpi/releases/download/11.0.0/glpi-11.0.0.tgz
sudo tar -xzvf glpi-11.0.0.tgz -C /var/www/
sudo chown www-data /var/www/glpi/ -R
Pour sécuriser l’installation, il a fallu extraire manuellement la configuration et les journaux de l’espace accessible depuis le web. J’ai créé de nouveaux répertoires de stockage dans le système et j’y ai transféré les dossiers sensibles.
1
2
3
4
5
6
7
8
9
10
sudo mkdir /etc/glpi
sudo chown www-data /etc/glpi/
sudo mv /var/www/glpi/config /etc/glpi
sudo mkdir /var/lib/glpi
sudo chown www-data /var/lib/glpi/
sudo mv /var/www/glpi/files /var/lib/glpi
sudo mkdir /var/log/glpi
sudo chown www-data /var/log/glpi
Il a fallu indiquer à l’application où retrouver ses données en générant deux fichiers PHP de déclaration de chemins.
1
2
3
4
5
6
7
8
9
10
11
sudo nano /var/www/glpi/inc/downstream.php
<?php
define('GLPI_CONFIG_DIR', '/etc/glpi/');
if (file_exists(GLPI_CONFIG_DIR . '/local_define.php')) {
require_once GLPI_CONFIG_DIR . '/local_define.php';
}
sudo nano /etc/glpi/local_define.php
<?php
define('GLPI_VAR_DIR', '/var/lib/glpi/files');
define('GLPI_LOG_DIR', '/var/log/glpi');
J’ai optimisé les performances du serveur web en installant PHP-FPM. La sécurité des sessions a été renforcée en éditant le fichier d’initialisation PHP, puis les modules de proxy d’Apache ont été activés pour assurer la liaison.
1
2
3
4
5
6
7
sudo apt-get install php8.2-fpm
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.2-fpm
sudo systemctl reload apache2
sudo nano /etc/php/8.2/fpm/php.ini
# Modifier la ligne : session.cookie_httponly = on
L’opération s’est achevée par la rédaction manuelle du fichier VirtualHost pour définir les règles de réécriture et forcer l’usage du socket UNIX pour l’exécution du code PHP. L’activation du site et le nettoyage des configurations par défaut ont permis de finaliser le serveur avant de procéder à l’installation graphique via le navigateur et de configurer l’annuaire LDAP.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo nano /etc/apache2/sites-available/glpi.example.com.conf
<VirtualHost *:80>
ServerName glpi.example.com
DocumentRoot /var/www/glpi/public
<Directory /var/www/glpi/public>
Require all granted
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
</VirtualHost>
1
2
3
4
sudo a2ensite glpi.example.com.conf
sudo a2dissite 000-default.conf
sudo a2enmod rewrite
sudo systemctl restart apache2
Ce projet met parfaitement en évidence la complexité des déploiements d’hier. Installer un service impliquait d’éditer une demi-douzaine de fichiers système, de gérer manuellement les permissions et de déplacer des dossiers à la main. La moindre erreur de syntaxe pouvait compromettre l’intégralité du serveur hôte. Aujourd’hui, avec Docker, tout ce travail fastidieux tient dans un unique fichier déclaratif, portable et isolé du système d’exploitation.
Cependant, c’est un passage obligatoire lors des phases d’apprentissage, pour comprendre exactement le fonctionnement du service, et tous les échanges internes nécéssaires au fonctionnement de l’application.
```