Objectifs pédagogiques

Les objectifs principaux de ce sujet de travaux pratiques sont d'exécuter et de comprendre :

  • une procédure d'installation d'un serveur web associé à une base de donnée.
  • la mise en œuvre d'une application web simple sur la base de cette architecture 3 niveaux.

Un objectif secondaire est de se familiariser avec la pratique des interfaces de commande de ligne.

Pour traiter ces exercices, il est recommandé d'avoir étudié les chapitres R2‑III et R2‑IV du cours. Des renvois aux principaux éléments de cours ou à des pages web d'information générale sont donnés au fur et à mesure des questions.

Mise en situation

Environnement et matériel

Les manipulations demandées sont à accomplir sur un réseau local utilisant la pile de protocoles TCP/IP et disposant de tous les services attendus : passerelle vers l'Internet, serveur DHCP, résolveur DNS.

La présence d'un serveur proxy comme ceux mis en œuvre par les DSI académiques de l'Éducation nationale peut sérieusement compliquer certaines procédures d'installation.

On requiert le matériel listé ci‑dessous :

  • pour jouer le rôle de client web, un poste de travail – de préférence un PC Linux, sinon un PC Windows avec service ssh activé dans le terminal Powershell (cela évite de recourir à un logiciel tiers comme PuTTY) ;
  • pour jouer le rôle de serveur web et de base de données, un nano‑ordinateur de type Raspberry Pi 4 (ou éventuellement 3B), son bloc d'alimentation au secteur et une carte microSD de 8 Go minimum pour installer son système d'exploitation et ses logiciels.

Ces deux machines doivent être l'une et l'autre raccordées au réseau local – typiquement, via un switch comme sur la figure ci‑dessus – et se voir attribuer chacune une adresse IP sur le même segment pour pouvoir communiquer – ce qui est assuré avec la présence d'un serveur DHCP sur le réseau local et la configuration appropriée des machines (cf. chap R2‑II ). Évidemment, il faut connaître la plage d'adresses IP dynamiques paramétrée par l'administrateur du réseau.

Pour des questions pédagogiques, pour contrôler la carte Raspberry Pi, plutôt que de lui raccorder spécifiquement un écran et un clavier, on fait le choix d'une connexion distante via le protocole SSH (secure shell, cf. chap. R1‑IV ) directement dans un terminal de commandes en ligne sur le poste de travail avec la commande ssh. C'est en effet la solution usuellement adoptée dans un contexte professionnel, et tout particulièrement dans le domaine du cloud computing.

Travail demandé

Effectuer toutes les manipulations méticuleusement dans l'ordre indiqué. Saisir les commandes en ligne par copier‑coller des commandes pour éviter les fautes de frappe et d'inattention. Dans une perspective de consolidation des connaissances, il est recommandé de bien comprendre le rôle de chaque commande, en consultant éventuellement les pages web données en référence.

Répondre aux explications demandées sur un cahier ou dans un fichier.

Travail préparatoire

  1. Préparation du poste de travail
    1. Pour le gravage de la clef USB bootable d'une carte Raspberry Pi, quel que soit le système d'exploitation du poste de travail, il est recommandé d'employer l'utilitaire de gravage dédié Raspberry Pi Imager.
    2. En effet, depuis sa version 1.7, cet utilitaire permet de paramétrer dès la procédure de gravage la création d'un compte d'utilisateur avec un mot de passe personnalisé. Ce paramétrage est indispensable pour mettre en œuvre les systèmes d'exploitation Raspberry Pi OS dans leurs versions ultérieures à juin 2022.
      Si Raspberry Pi Imager n'est pas déjà installé, sur un poste à système Linux Mint, il est possible de le faire via l'installateur apt (advanced packaging tool W), c'est‑à‑dire en exécutant la commande suivante :
            
      sudo apt install rpi‑imager
      On peut aussi télécharger son fichier .deb (paquets Debian) via le lien suivant . L'installation s'effectue alors en double‑cliquant sur ce fichier.
      Une fois que l'installation est achevée, on retrouve cette application dans le menu principal du système d'exploitation et on peut placer son raccourci dans le panneau inférieur (barre de tâche).
    3. Sur le poste de travail, vérifier qu'un logiciel de scan réseau est installé (cf. chap. R1‑II ).
    4. Sinon, procéder à son installation, sachant que, quel que soit le système d'exploitation, Angry IP Scanner est ici recommandé pour sa simplicité. On s'en servira seulement pour déterminer l'adresse IP de la carte Raspberry Pi.
      Comme à la question 1.a, pour effectuer cette installation sur un poste de travail à système Linux Mint, télécharger le fichier  .deb (paquets Debian) sur la page de téléchargement du site de l'application  puis double‑cliquer sur le fichier obtenu pour lancer l'installation.
      Comme à la question 1.a, une fois que l'installation est achevée, créer son raccourci dans le tableau de bord (barre de tâche).
      De plus, lancer l'application et via la commande Fetchers… du menu Outils, ajouter les colonnes Constructeur MAC et Adresse MAC dans fenêtre d'affichage (cf. la capture d'écran ci‑dessous).
      Ces informations seront utiles pour retrouver une carte Raspberry Pi dans le scan d'un réseau accueillant de nombreuses machines.
  2. Préparation du système d'exploitation du serveur
    1. Pour le futur serveur, télécharger l'image du système d'exploitation Raspberry Pi OS (en abrégé, raspios) dans sa version 64 bits « lite » (without desktop) la plus récente . Il s'agit d'un fichier d'archive .xz. En cas de débit trop lent, demander à l'enseignant une image déjà téléchargée sur clef USB.
    2. Introduire la carte microSD dans un lecteur USB3.0 (attention au sens) et la brancher au poste de travail. Si elle n'est pas vierge, il est inutile de la formater ; cette opération sera automatiquement effectuée avant le gravage.
    3. À l'aide de l'utilitaire de gravage Raspberry Pi Imager (cf. question 1.a), graver l'image du système d'exploitation du futur serveur, en suivant la procédure ci‑dessous :
      • Pour le modèle de carte, choisir celui qui est fourni par comme matériel de TP – typiquement, Raspberry Pi 4.
      • Pour le système d'exploitation, choisir l'option « utiliser une image personnalisée » (use custom) tout en bas de la liste et sélectionner celle qui a été téléchargée à la question 2.a.
      • Pour le support de stockage, sélectionner la carte MicroSD branchée sur le poste – attention à ne pas confondre avec une clef USB personnelle qui serait éventuellement montée sur le poste, le risque étant d'écraser tout son contenu.
      • Cliquer alors sur le bouton Suivant et, dans la fenêtre de personnalisation de l'OS, sélectionner l'option Modifier réglages. Sélectionner les options ci‑dessous avec le plus grand soin (un mauvais choix risque d'empêcher la possibilité ultérieure de se connecter à la carte, et donc de devoir recommencer le processus de « gravage » de l'image du système).
      • Dans l'onglet Général :
        • Cocher l'option nom d'hôte (hostname) et saisir RPIX où X est un numéro indiqué par l'enseignant, différent pour chaque carte utilisée dans la salle de travaux pratiques.
        • Cocher l'option Définir nom d'utilisateur […] puis saisir respectivement pi (sans numéro accolé) et le mot de passe indiqué par l'enseignant, étant très vigilant sur sa saisie car elle se fait presque « à l'aveugle ».
        • Cocher l'option Définir les réglages locaux et choisir la zone horaire locale (Paris) ainsi que le clavier fr.
        Dans l'onglet Services :
        • cocher l'option Enable SSH avec la sous‑option use password authentication.
        Dans l'onglet Options :
        • cocher l'option Éjecter le media quand terminé ;
        • décocher l'option Activer la télémétrie.
      • Finalement, enregistrer ces paramétrages puis cliquer sur le bouton OUI pour démarrer le gravage l'image du système sur la carte MicroSD.
      L'opération de gravage peut prendre plusieurs minutes, selon les performances du poste de travail. Elle crée deux partitions :
      • bootfs, qui constitue le secteur de démarrage du système ;
      • rootfs, qui constitue le système de fichiers usuels sur Linux, avec les répertoires /bin /boot /dev /etc /home etc.
      Une fois que l'opération de gravage est terminée, on peut éjecter la carte microSD du poste de travail .
  3. Mise en service et paramétrage du serveur
    1. Introduire la carte microSD dans le bon sens dans le logement sous la carte Raspberry Pi (cf. la photo ci‑contre) puis raccorder cette dernière au réseau local via un câble Ethernet avant sa mise sous tension.
    2. La led verte dite ACT (pour SD card activity) de la carte Raspberry Pi se met alors à clignoter de façon irrégulière. Elle témoigne du chargement du système d'exploitation en mémoire vive (comme le témoin d'accès au disque dur sur un PC). Il faut attendre – environ une trentaine de secondes – qu'elle soit durablement éteinte avant de scanner le réseau (sinon elle risque de ne pas être visible).
    3. Scanner le réseau local sur toute la plage d'adresses IP dynamiques. Dans la liste obtenue, repérer l'adresse IP de la carte en correspondance avec son adresse MAC ou son nom d'hôte.
    4. Dans le contexte d'un établissement éducatif où de nombreuses machines sont raccordées au réseau, il est recommandé de trier le tableau affiché par le scanner via la colonne constructeurs MAC pour regrouper les lignes de toutes les cartes Raspberry Pi.
      Si la carte est absente de la liste des hôtes scannées, avant d'envisager d'autres solutions au problème, il est pertinent d'exécuter la commande suivante (cf. chap. R2‑I ) :
          
      ping nom d'hôte de la carte.local
      en rappelant ici que le nom d'hôte a été défini à la question 2.b de la forme rpiX. En principe, cette commande affiche entre parenthèses l'adresse IP de l'hôte ainsi sollicité.
    5. Sur le poste de travail, ouvrir un terminal de commandes en ligne et se connecter à la carte Raspberry Pi par le protocole SSH (secure shell) via la commande :
    6.       
      sudo ssh pi@adresse IP de la carte
      puis :
      • si demandé, saisir d'abord le mot de passe de l'utilisateur du poste de travail (typiquement, elv) pour valider le recours à la commande sudo ;
      • saisir ensuite le mot de passe de l'utilisateur pi de la carte Raspberry Pi, paramétré lors de l'opération de gravage (typiquement, pi – cf. question 2.b supra ).
      Remarque. Il est également possible de se connecter en ssh à la carte sans connaître son adresse IP, grâce à la seule connaissance du nom d'hôte (cf. chap. R2‑I ), via la commande :
          
      sudo ssh pi@nom d'hôte de la carte.local
      Une fois que la connexion est établie, l'adresse IP de la carte peut alors déterminée via la commande ip a (cf. chap. R1‑III )
      Sauf indication contraire, toutes les manipulations sur la carte demandées dans la suite du sujet de TP se font via une connexion ssh.
      Remarques.
      • En cas d'échec de la connexion ssh (par oubli lors du paramétrage ou blocage après saisie d'un mot de passe erronné), il est possible de la rétablir sans avoir à regraver tout le système. Pour cela :
        1. Débrancher l'alimentation de la carte Raspberry Pi, retirer la carte microSD, la replacer dans le lecteur, et brancher ce dernier sur un port USB3.0 du poste de travail. Ses partitions doivent alors apparaître dans le panneau de gauche du navigateur de fichiers.
        2. Dans le navigateur de fichiers du poste de travail, cliquer sur la partition bootfs, puis, dans la fenêtre ainsi ouverte, par un clic‑droit, y créer un nouveau document (vide) et le nommer ssh.
        3. Démonter la partition, retirer le lecteur, extraire la carte et la replacer dans le logement de la carte Raspberry Pi. Rebrancher son alimentation et attendre que le système d'exploitation se charge en mémoire vive. En principe, la connexion ssh devrait être à nouveau possible.
      • Si le mot de passe de l'utilisateur pi a été mal choisi (trop court, trop banal, etc.) lors du paramétrage du système, il est recommandé de le changer dès le début de la connexion ssh. Utiliser pour cela la commande passwd W et adopter le mot de passe indiqué par l'enseignant. Également, il est prudent de le mémoriser avec un gestionnaire de mots de passe W pour le retrouver en cas d'oubli ultérieur.
      • Dans tout contexte professionnel, cette précaution de sécurité doit bien évidemment être accomplie dès la mise en service de la carte. Dans le cas particulier d'une séance de travaux pratiques en groupe ou les enjeux de sécurité restent théoriques, cela permet quand même d'éviter qu'un étudiant ne se connecte par erreur à une autre carte que la sienne.
    7. À l'aide de la commande date, vérifier si le système est réglé sur la bonne zone horaire (cf. chap. R2‑VI ) et que l'heure est synchrone avec celle affichée par le poste de travail.
    8. Sinon, régler la bonne zone horaire à l'aide des commandes ci‑dessous :
            
      sudo timedatectl set-timezone Europe/Paris && sudo timedatectl set-ntp True
      puis vérifier, encore avec la commande date, que le système est bien réglé sur l'heure locale, à savoir la zone horaire CET – Central European Time – ou CEST – Central European Summer Time.
    9. À l'aide de la commande locale (sans argument), vérifier si les valeurs des variables d'environnement du système (notamment LANG et LANGUAGE) sont cohérentes avec les paramètres régionaux W de la France.
    10. Sinon, régler les paramètres régionaux conformément à la locale fr.FR-UTF-8 en suivant la procédure ci‑dessous.
      • Modifier le fichier de sélection des locales :
      •       
        sudo nano /etc/locale.gen
        en commentant la ligne ci‑dessous (c'est‑à‑dire en ajoutant le symbole # en début de ligne) :
        #en_GB.UTF-8 UTF-8
        
        et en décommentant la ligne ci‑dessous :
        fr_FR.UTF-8 UTF-8
        
        Taper Ctrl-S (save) et Ctrl-X (exit) pour sauvegarder ces modifications et quitter l'éditeur.
        Remarque. Les mêmes manipulations peuvent être exécutées par les deux commandes suivantes, qui utilisent l'éditeur sed (stream editor W) :
              
        sudo sed -i '/^en_GB.UTF-8 UTF-8/ s/^/#/' /etc/locale.gen
        sudo sed -i '/^# fr_FR.UTF-8 UTF-8/ s/^# //' /etc/locale.gen
      • Saisir la commande :
      •         
        sudo locale-gen
        pour générer la locale sélectionnée fr.FR-UTF-8.
      • Modifier le fichier de configuration des paramètres régionaux de langage :
      •         
        sudo nano /etc/default/locale
        et y coder les affectations des variables d'environnement :
          LANG=fr_FR.UTF-8
          LANGUAGE=fr_FR.UTF-8  
        
        puis sauvegarder (Ctrl-S) et quitter (Ctrl-X).
        Remarque. Les mêmes manipulations peuvent être exécutées par la commande suivante, toujours avec l'éditeur sed (stream editor W) :
                
        sudo sed -i '2d' /etc/default/locale && echo -e "LANG=fr_FR.UTF-8\nLANGUAGE=fr_FR.UTF-8" | sudo tee -a /etc/default/locale > /dev/null
      • Pour rendre ces modifications effectives, exécuter la commande :
      •         
        source /etc/default/locale
        Comme précédemment, à l'aide de la commande locale, vérifier que les paramètres régionaux sont maintenant conformes à la localisation du système.
        Sinon, se déloguer (commande exit) puis renouveler la connexion ssh et re‑vérifier les paramètres régionaux.
    11. Mettre à jour le système par la séquence de commandes suivantes :
    12.       
      sudo apt update
      sudo apt upgrade -y
      sachant que cette opération prend plusieurs minutes, voire plus d'une dizaine de minutes selon le débit de connexion. Ensuite, il est recommandé de purger les paquets inutiles puis de redémarrer le système pour être sûr que toutes les mises à jour sont prises en compte :
            
      sudo apt autoremove
      sudo reboot
      Et bien entendu, une fois le redémarrage terminé, il faut encore renouveler la connexion ssh.

      Si la commande de mise à jour du système échoue au motif que le serveur des paquets est indisponible (typiquement, avec une erreur 503), cela peut être dû au serveur proxy académique (cf. TP S1‑1 ).

      Pour y remédier, une solution peut consister à changer de site de dépôt, en suivant la procédure ci‑dessous.

      • Sur le poste de travail, à l'aide d'un navigateur, sélectionner un site de dépôt sur la page web suivante  (copier son URL dans le presse‑papier).
      • Sur la carte Raspberry Pi, coller cet URL à la place de ceux codés dans les fichiers suivants (à éditer à l'aide de la commande sudo nano) :
        • /etc/apt/sources.list
        • /etc/apt/sources.list.d/raspi.list

      Recommencer alors la procédure de mise à jour (update, upgrade et reboot) décrite supra.

Installation et test d'un serveur web

  1. Installation du logiciel serveur HTTP Apache
    1. En connexion ssh avec la carte Raspberry Pi, installer le logiciel serveur HTTP Apache (cf. chap. R2‑IV ) :
    2.       
      sudo apt install apache2 -y
    3. Spécifier le nom du serveur en éditant le fichier de configuration (avec activation de la numérotation des lignes de l'éditeur nano) :
    4.     
      sudo nano -l /etc/apache2/apache2.conf
      et en ajoutant à la ligne nº 70 :
      ServerName cielXwebserver
      
      où X est un numéro spécifique indiqué par l'enseignant, différent pour chaque carte sur le réseau (le même qu'à la question 2.b – cf. supra ).
      Sauvegarder cette modification (Crtl-S) et quitter (Ctrl-X).
    5. Relancer le service apache2 (une authentification de l'utilisateur par mot de passe est requise) puis vérifier ensuite qu'il est bien actif en tâche de fond :
    6.     
      systemctl restart apache2 && systemctl status apache2
      Sur le poste de travail, vérifier que la page d'accueil par défaut du serveur Apache s'affiche dans un navigateur avec l'URL :
      http://adresse IP de la carte    ou    http://nom d'hôte du système.local
    7. Donner à l'utilisateur pi la propriété du répertoire /var/www qui constitue pour l'application apache2 la racine des fichiers de pages web qu'elle peut servir :
    8.     
      sudo chown -R pi:pi /var/www
      et vérifier que cette modification est effective :
          
      ls -l /var/www
    9. Créer un répertoire examplePHP et y charger la page web dynamique changeBackground.php donnée à titre d'exemple académique dans le cours (cf. chap. R2‑IV ) :
    10.     
      cd /var/www/html && mkdir examplePHP && cd examplePHP/
      wget --no-check-certificate https://www.lycee-ferry-versailles.fr/snir/moduleR/prog/R2tp2_serveurs/changeBackground.txt
      mv changeBackground.txt changeBackground.php
      Remarques.
      • L'option --no-check-certificate se justifie par le fait qu'il s'agit d'un site de confiance, administré par l'établissement, mais dont les certificats ne sont pas toujours bien gérés
      • Sur le serveur, le fichier changeBackground est stocké avec l'extension .txt et non pas .php, pour qu'il soit interprété par un navigateur non pas comme une page web dynamique, mais seulement une ressource à télécharger. La commande mv qui suit sert à rétablir son extension normale après téléchargement, ce qui est indispensable à sa bonne interprétation sur le navigateur du poste client.
      Sur le poste de travail, dans un navigateur, ouvrir cette page via son URL :
      http://adresse IP/examplePHP/changeBackground.php
      et constater qu'elle est dysfonctionnelle à plusieurs titres (observer le texte affiché et tester les deux liens). Proposer une explication à ces dysfonctionnements mais ne pas fermer cet onglet (il sera réutilisé ultérieurement).
  2. Installation du langage de backend PHP
    1. Toujours en connexion ssh avec la carte Raspberry Pi, installer les paquets du langage php (cf. chap. R2‑IV ) dans sa version stable sélectionnée sur le dépôt Raspberry Pi, ainsi que les paquets communs partagés par toutes les versions :
    2.     
      sudo apt install php php-common -y
    3. Installer quelques modules d'extension supplémentaires usuellement utilisées pour le développement web en suivant la procédure ci‑dessous.
      • Tout d'abord, il faut récupérer le numéro de version du paquet php au format x.y (ce qu'on vérifie juste après avec une commande echo) :
      •       
        PHP_VERSION=$(php --version | grep -oP '^PHP \K[0-9]+\.[0-9]+')
        echo "${PHP_VERSION}"
      • Ensuite, on peut installer les différents modules en désignant leur numéro de version par la valeur de la variable PHP_VERSION préalablement définie :
      •       
        sudo apt install "php${PHP_VERSION}-mysql" "php${PHP_VERSION}-curl" "php${PHP_VERSION}-gd" "php${PHP_VERSION}-intl" "php${PHP_VERSION}-mbstring" "php${PHP_VERSION}-xml" "php${PHP_VERSION}-zip" "php${PHP_VERSION}-fpm" -y
      Par ailleurs, le module d'extension fpm W (fastGCI process manager) n'étant pas activée par défaut, il faut le faire « manuellement » via la séquence de commandes suivantes :
            
      sudo a2enmod proxy_fcgi setenvif && sudo a2enconf "php${PHP_VERSION}-fpm" && sudo a2dismod "php${PHP_VERSION}"
      Enfin, il faut redémarrer le processus apache via la commande :
            
      systemctl restart apache2
      laquelle nécessite une authentification par mot de passe de l'utilisateur.
    4. Après ces manipulations, on peut vérifier la liste des modules d'extension installés par la commande :
    5.     
      php -m
      Enfin, sur la carte Raspberry Pi, on peut construire la page d'information de php avec la commande de redirection suivante :
            
      echo "<?php phpinfo(); ?>" > /var/www/html/info.php
      Il suffit ensuite d'ouvrir la page web sur le poste de travail via l'URL :
      http://adresse IP/info.php
      pour y lire toutes les caractéristiques techniques de l'environnement d'exécution de php.
      Remarque : les nombreux modules d'extension installés ne sont pas tous nécessaires dans le cadre de ce sujet de travaux pratiques, mais ils le seraient pour la mise en œuvre d'applications web professionnelles.
    6. Dans le navigateur du poste de travail, on peut maintenant recharger la page web changeBackground.php ouverte à la question 1.e et constater qu'elle fonctionne comme prévu. Si tel n'est pas le cas, penser à vider le cache du navigateur pour cette entrée (avec Firefox, utiliser la commande Oublier ce site depuis l'historique de navigation, accessible dans le menu principal).
    7. Remarque. Cet exemple d'installation est aussi l'occasion de pouvoir tester la possibilité de modifier de façon non prévue la couleur d'arrière plan de cette page par injection de code dans la barre d'adresse, comme cela est expliqué dans le cours (cf. chap. R2‑IV ) – ainsi que la solution proposée pour empêcher une telle possibilité.
  3. Installation du SGBDR MariaDB
    1. Toujours en connexion ssh avec la carte Raspberry Pi, installer les paquets du SGBDR MariaDB (cf. chap. R2‑IV ) dans sa version stable sélectionnée sur le dépôt Raspberry Pi :
    2.     
      sudo apt install mariadb-server mariadb-client -y
    3. Paramétrer la sécurité du SGBDR via la commande :
    4.     
      sudo mariadb-secure-installation
      et répondre méthodiquement aux questions comme indiqué ci‑dessous :
      • ne pas définir de mot de passe pour l'utilisateur root, autrement dit taper juste sur la touche ENTRÉE (l'authentification se fera par socket Unix – c'est‑à‑dire via la commande sudo) ;
      • valider l'authentification par unix_socket ;
      • ne pas changer le mot de passe de l'utilisateur root ;
      • supprimer l'accès aux utilisateurs anonymes ;
      • supprimer la possibilité d'accès distant pour l'utilisateur root ;
      • supprimer la base de donnée de test et son accès ;
      • recharger la table des privilèges maintenant.
    5. Exécuter MariaDB en tant qu'utilisateur root :
    6.     
      sudo mysql -u root
      et constater ce faisant que l'accès se fait sans demande de saisie de mot de passe par le système, alors que cela est en principe requis par la commande sudo.
      Pour éviter de recourir ultérieurement à l'utilisateur root, créer l'utilisateur phpmyadmin avec un mot de passe spécifié par l'enseignant – à saisir dans la commande avant avant de la valider ; accorder à cet utilisateur tous les droits sur les bases de données (il en sera l'administrateur) :
      CREATE USER 'phpmyadmin'@'localhost' IDENTIFIED BY 'mot de passe administrateur';
      GRANT ALL PRIVILEGES ON *.* TO 'phpmyadmin'@'localhost' WITH GRANT OPTION;
      
    7. Créer maintenant un compte d'accès à l'utilisateur pi avec des droits limités et avec le même mot de passe celui d'utilisateur de la carte Raspberry Pi – à saisir dans la commande avant avant de la valider :
    8. CREATE USER 'pi'@'localhost' IDENTIFIED BY 'mot de passe utilisateur';
      GRANT CREATE, ALTER, DROP, SHOW DATABASES, SELECT, INSERT, UPDATE, DELETE ON *.* TO 'pi'@'localhost' IDENTIFIED BY 'mot de passe utilisateur' WITH GRANT OPTION;
      FLUSH PRIVILEGES;
      
      puis quitter MariaDB avec la commande quit.
      Par ailleurs, l'accès aux bases de donnée par l'utilisateur root sans demande de mot de passe par le système (cf. supra ) n'est pas conforme au paramètre de sécurisation par unix_socket choisie via la commande mysql_secure_installation et cela crée une vulnérabilité. Cela est dû au fait que, pour faciliter l'administration de la carte (dans le cadre usuel d'un emploi en amateur), l'utilisateur pi est dispensé de saisie de mot de passe même pour les commandes sudo.
      Il est néanmoins possible d'y remédier en modifiant les fichiers de configuration de la commande sudo, comme indiqué ci‑dessous.
      • Se placer dans le répertoire /etc/sudoers.d/ et lancer la commande visudo :
      • cd /etc/sudoers.d/ && sudo visudo
        
        Cette commande a pour effet d'éditer le fichier /etc/sudoers dans une version provisoire que ne sera validée qu'après vérification syntaxique.
      • Dans ce fichier, juste avant la ligne de commentaire # User privilege specification ajouter les directives suivantes :
      • Defaults timestamp_type=tty
        Defaults!/usr/bin/mysql    timestamp_timeout=0
        Defaults!/usr/bin/mariadb  timestamp_timeout=0
        Defaults!/usr/sbin/visudo  timestamp_timeout=0
        Defaults!/usr/bin/chmod    timestamp_timeout=0
        Defaults!/bin/chmod        timestamp_timeout=0
        Defaults!/usr/bin/chown    timestamp_timeout=0
        Defaults!/bin/chown        timestamp_timeout=0
        
        Ces lignes vont provoquer l'obligation de saisir le mot de passe pour la commande sudo lorsqu'elle s'applique aux commande mysql mariadb visudo chmod et chown, et ce même si le mot de passe a été saisi juste avant (annulation de la temporisation).
        Noter tout à la fin du fichier la directive @includedir /etc/sudoers.d puis sauvegarder (Crtl-S) et quitter (Ctrl-X).
      • De façon étonnante, Ctrl-X ne termine pas l'édition mais entre en mode itératif pour accéder successivement à les fichiers inclus dans le répertoire /etc/sudoers.d. On accède à l'édition d'un fichier en tapant la touche ENTRÉE et on en sort par Ctrl-X, précédé d'un Ctrl-S si on a modifié le fichier.
      • Remarque. Si la commande visudo ne passe pas automatiquement en mode itératif, il est toujours possible d'éditer chaque fichier individuellement en saisissant son nom après la commande.
        • Dans le fichier 010_global-tty, mettre en commentaire la seule ligne présente comme ainsi :
        • # Defaults timestamp_type=global
          
          Dès lors, la temporisation pour la dispense de saisie de mot de passe dans un terminal est indépendante d'éventuels autres terminaux ouverts.
          Ne pas oublier de sauvegarder avant de quitter pour passer au fichier suivant.
        • Dans le fichier 010_pi-nopasswd, modifier comme ci‑dessous la seule ligne présente :
        • pi ALL=(ALL) ALL
          
          Dès lors, l'utilisateur pi n'est plus dispensé de saisie de mot de passe.
          Ne pas oublier de sauvegarder avant de quitter pour passer au fichier suivant.
        • Attention ! En mode itératif, même le fichier README doit être ouvert pour finaliser la procédure de modification.
    9. Créer un répertoire example3tier et y télécharger les fichiers source d'un exemple d'application 3 niveaux proposé dans le cours (cf. chap. R2‑IV ), en exécutant la séquence des commandes suivantes :
    10.     
      cd /var/www/html && mkdir example3tier && cd example3tier/
      wget -r --no-parent -nH -l1 --cut-dirs=6 --reject="index.html*","example3tier*" --no-check-certificate -- https://www.lycee-ferry-versailles.fr/snir/moduleR/prog/R2tp2_serveurs/example3tier
      for f in *.txt; do mv -- "$f" "${f%.txt}.php"; done
      Remarques.
      • La commande wget est ici invoquée en mode récursif (option -r) avec une profondeur limitée à un seul niveau de répertoire (option -l1), sans télécharger le répertoire parent (option --no-parent) en supprimant les 6 premiers segments (noms des répertoires du chemin) dans le nom des fichiers téléchargés (option --cut-dirs=6) ainsi que le nom d'hôte (option -nH). L'option --reject est également activée pour supprimer certains fichiers temporaires inutiles.
      • On se reportera supra  pour comprendre le recours à l'option --no-check-certificate ainsi que la manipulation des extensions des fichiers (de txt vers php).
    11. Éditer le fichier dbConnect.php, en activant la numérotation des lignes de l'éditeur nano :
    12.     
      sudo nano -l dbConnect.php
      et à la ligne n° 4, écraser la chaîne "*********" pour donner à la variable $dbpasswd le mot de passe de l'utilisateur pi (toujours le même). Sauvegarder (Crtl-S) et quitter (Ctrl-X).
    13. Ouvrir la page web sur le poste de travail via l'URL :
      http://adresse IP/example3tier/index.php
      et vérifier qu'elle s'affiche conformément à son modèle (cf. chap. R2‑IV ) mais ne pas tester son fonctionnement pour le moment (cela produirait une erreur de connexion puisqu'aucune base de donnée n'a encore été créée).
    14. Toujours en connexion ssh avec la carte Raspberry Pi, consulter le contenu du fichier source tableCreation.sql qui va servir à créer la base de donnée nécessaire :
    15.     
      cat tableCreation.sql
      Lancer MariaDB en tant qu'utilisateur pi avec saisie de mot de passe :
          
      sudo mysql -u pi -p
      puis exécuter le fichier source de création de la base de données userPref et de la table favoriteColors :
      source tableCreation.sql
      
      En exécutant la commande SQL suivante, vérifier que la base de données userPref est bien créée :
      SHOW DATABASES;
      
      Vérifier ensuite que la table favoriteColors existe, puis détailler sa structure :
      SHOW TABLES;
      DESCRIBE `favoriteColors`;
      
    16. Sur le poste de travail, dans le navigateur, recharger la page web index.php puis tester son fonctionnement en saisissant par exemple la couleur nommé mediumyellow avec les valeurs (255, 255, 127) comme code RGB. Cliquer sur le bouton Record pour valider la saisie.
    17. Sur la carte Raspberry Pi, toujours dans l'environnement d'exécution de MariaDB, lister le contenu de la table favoriteColors grâce à la commande SQL :
      SELECT * FROM `favoriteColors`;
      
      et constater qu'on y trouve bien la couleur mediumyellow enregistrée via la page web. Effacer alors cet enregistrement avec la commande SQL :
      DELETE FROM `favoriteColors` WHERE `colorName`="mediumyellow";
      
      et vérifier qu'elle disparaît de l'affichage sur le navigateur en rechargeant la page web.
      Insérer à nouveau cette couleur par la commande SQL :
      INSERT INTO `favoriteColors` (colorName, redCode, greenCode, blueCode) VALUES ("mediumyellow", 255, 255, 127);
      
      et vérifier qu'elle ré‑apparaît dans la fenêtre du navigateur en rechargeant la page web.
      Pour finir, modifier la composante bleu du code RGB de la couleur mediumyellow via la commande SQL :
      UPDATE `favoriteColors` SET `blueCode` = 128 WHERE `colorName`="mediumyellow";
      
      et vérifier que cette modification est effective dans la fenêtre du navigateur en rechargeant la page web.
      Quitter MariaDB avec la commande quit. Faire alors une recherche dans le fichier source recordColor.php pour y retrouver le codage de la commande INSERT en langage php :
          
      cat recordColor.php | grep "INSERT"
      Pour une compréhension plus globale du code, l'intégralité du fichier source recordColor.php est accessible dans le cours, chap. R2‑IV .
  4. Installation de l'interface web phpMyAdmin
    1. Toujours en connexion ssh avec la carte Raspberry Pi, installer les paquets de l'interface web phpMyAdmin d'administration d'une base de donnée de type mySQL (cf. chap. R2‑IV ) dans sa version stable sélectionnée sur le dépôt apt de Raspberry Pi :
    2.     
      sudo apt install phpmyadmin -y
      Dans l'interface semi‑graphique, répondre méthodiquement aux questions comme indiqué ci‑dessous :
      • valider le choix de configurer la base de donnée avec dbconfig-common ;
      • saisir le même mot de passe qu'avec MariaDB pour l'accès à l'application phpMyAdmin ;
      • choisir apache2 comme serveur web à configurer.
      puis finaliser la configuration de l'accès à phpMyAdmin :
          
      sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf
      sudo a2enconf phpmyadmin && systemctl reload apache2
    3. Sur le poste de travail, dans un navigateur, ouvrir la page web de connexion à phpMyAdmin via l'URL :
      http://adresse IP/phpmyadmin
      et se connecter avec l'identifiant pi (et non pas root) et le mot de passe utilisé depuis le début. Puis :
      • s'il est masqué, afficher le panneau navigation en cliquant sur le bouton en haut à gauche de la page ;
      • dans ce panneau, retrouver la base de donnée userPref et cliquer sur son bouton « + » pour visualiser la liste des tables qu'elle contient ;
      • y retrouver la table favoriteColors et cliquer sur son bouton « + » pour visualiser la liste de ses colonnes ; puis cliquer sur le nom de la table – qui est un hyperlien – pour afficher la page qui permet de manipuler son contenu ;
      • Avec les fonctionnalités de la page web dynamique :
        http://adresse IP/example3tier/index.php
        ajouter de nouvelles couleurs et constater qu'elles apparaissent dans la table favoriteColors en rafraîchissant la page ;
      • dans l'interface phpMyAdmin, expérimenter les différentes possibilités de modifier les données de la table : ajouter des lignes, modifier une ligne, supprimer une ligne, etc.
      et enfin, se déconnecter de phpMyAdmin en cliquant sur le 2e bouton situé sous le logo dans le panneau de navigation.
    4. Vérifier que l'accès à phpMyAdmin en tant qu'utilisateur root est impossible sans saisir un mot de passe.