TP1c. Prendre en main la ligne de commande
Sommaire
TP évalué
Nous sommes à un point étape. La réalisation de ce TP sera évaluée. Il sera évalué de la manière suivante :
- VM fonctionnelle : 5 points (en intégrant les éléments de sécurité).
- Accès à la VM via échange de clés : 2 points. (La clé publique à ajouter à votre VM est disponible en fin de TP).
- Réalisation des étapes présentées dans le TP : 5 points.
- Fourniture d'un rapport illustrant les différentes étapes : 2 points.
- Fourniture de la fiche serveur : 2 points.
Introduction
Avant de commencer, il est important de savoir que la ligne de commande est un outil puissant et très utile. Maîtriser les rudiments de celle-ci vous permettra de gagner du temps et donc d’être plus efficace.
Préparation
Pour réaliser ce TP, vous aurez besoin d'un environnement de Linux. Je vous propose d'en créer une en suivant le TP précédent.
Pré-requis
Dans ce TP nous allons utiliser l'accès SSH pour nous connecter à la VM.
Vous êtes prêt ?
Ressources
Pour réaliser ce TP, vous aurez besoin de :
La VM
Pour ce TP je vais vous demander de créer une VM. Cette VM doit respecter les spécifications suivantes :
- Nom de la VM :
<votre nom>-ligne-de-commande
. - OS : Debian 12
- Mémoire : 1Go (ou 2Go si vous utilisez le modèle).
- CPU : 1.
- Disque : 5Go (ou 8Go si vous utilisez le modèle).
- Utilisateur :
<votre nom>
. - Mot de passe :
<votre mot de passe>
(mot de passe de votre choix, mais qui respecte les règles de sécurité).
Rappel
Ici je ne vais pas vous redonner les commandes, je vous laisse chercher dans les ressources :
- Aide mémoire Debian
- TP précédent
- Créer une VM plus rapidement depuis un modèle
- Votre prise de notes
c'est à vous de jouer !
Étape 1 : Créez une VM
Création complète de la VM
Dans cette version, vous allez devoir créer la VM depuis le début. Vous avez plus d'options, mais vous devez réaliser l'installation du système d'exploitation.
Création de la VM via un modèle Meilleure solution
Dans cette version, vous allez créer votre VM à partir d'un modèle. Le modèle contient déjà le système d'exploitation et les logiciels installés. Vous n'avez plus qu'à configurer la VM (réseau, utilisateur, etc.).
À l'aide des TP précédents, créez une VM qui respecte les spécifications ci-dessus.
Étape 2 : Configurez la VM
Vérifier que votre VM respecte les spécifications suivantes :
- La VM doit avoir une IP statique. (Vous pouvez utiliser le générateur de configuration).
- La VM doit avoir accès à Internet (
ping www.google.com
doit fonctionner). - La VM doit posséder les vmtools (
apt install open-vm-tools
)
Étape 3 : Connectez-vous à la VM
Pour vous connecter à la VM, vous devez utiliser la commande ssh
depuis votre machine hôte. Pour que cela fonctionne :
- Vous devez avoir installé le serveur SSH sur votre VM (voir TP précédent).
- Vous devez avoir généré une clé SSH sur votre machine hôte et l'avoir ajoutée à votre VM (voir TP précédent).
- L'accès par mot de passe doit être désactivé sur votre VM (voir TP précédent).
- L'accès
root
par SSH doit être désactivé sur votre VM (voir TP précédent).
Rappel sur la clé SSH
Pour installer votre clé SSH sur votre serveur, il vous suffit de faire la commande suivante sur votre ordinateur.
ssh-copy-id <username>@<ipaddress>
⚠️ Vous devez évidemment remplacer <username>
et <ipaddress>
par votre utilisateur et votre mot de passe. Exemple :
ssh-copy-id pi@192.168.1.253
Rien de plus, à partir de maintenant votre serveur acceptera votre connexion sans vous demander de mot de passe. Pratique, non ? (Et surtout très sécurisé)
Les commandes de base
Nous avons maintenant une VM qui fonctionne. Nous allons maintenant nous intéresser à l'OS et les programmes qui y sont installés. Avant de commencer, nous allons voir comment utiliser les bases de la ligne de commande.
ls
: Liste les fichiers et dossiers. (Exemple :ls -l
affiche les fichiers et dossiers avec les permissions).cd
: Change de dossier. (Exemple :cd /var/log
change de dossier pour aller dans le dossier/var/log
).mkdir
: Crée un dossier. (Exemple :mkdir /var/log/mon-dossier
crée le dossier/var/log/mon-dossier
).touch
: Crée un fichier. (Exemple :touch /var/log/mon-fichier
crée le fichier/var/log/mon-fichier
).rm
: Supprime un fichier. (Exemple :rm /var/log/mon-fichier
supprime le fichier/var/log/mon-fichier
).rm -r
: Supprime un dossier. (Exemple :rm -r /var/log/mon-dossier
supprime le dossier/var/log/mon-dossier
).mv
: Déplace un fichier. (Exemple :mv /var/log/mon-fichier /var/log/mon-dossier
déplace le fichier/var/log/mon-fichier
dans le dossier/var/log/mon-dossier
).cp
: Copie un fichier. (Exemple :cp /var/log/mon-fichier /var/log/mon-dossier
copie le fichier/var/log/mon-fichier
dans le dossier/var/log/mon-dossier
).cat
: Affiche le contenu d'un fichier. (Exemple :cat /var/log/syslog
affiche le contenu du fichier syslog).nano
: Éditeur de texte (personnellement je préfèrevim
). (Exemple :nano /var/log/mon-fichier
ouvre le fichier/var/log/mon-fichier
dans l'éditeur de texte).tail
: Affiche les dernières lignes d'un fichier. (Exemple :tail -f /var/log/syslog
affiche les dernières lignes du fichier syslog en temps réel).
Il existe de nombreuses autres commandes, mais celles-ci sont les plus utilisées. Il est important de savoir les utiliser.
Quelques astuces
- La touche
tab
: permets de compléter une commande ou un chemin de fichier. !!
: permet de répéter la dernière commande.ctlr + r
: permet de rechercher une commande dans l'historique.échap puis :wq
: permet de sauvegarder et quitter un fichier ouvert avecvim
.échap puis :q!
: permet de quitter un fichier ouvert avecvim
sans sauvegarder.
Créer une arborescence
À l'aide des commandes vues précédemment, créez une arborescence qui respecte les spécifications suivantes :
- Créez un dossier
restitution
dans le dossier/home/
. - Créez un dossier
tp1
dans le dossier/home/restitution/
. - Créez un fichier
fichier1.md
dans le dossier/home/restitution/tp1/
. (deux solutions possibles, viatouch
ou vianano
). - Créez un fichier
fichier2.md
dans le dossier/home/restitution/tp1/
. (deux solutions possibles, viatouch
ou vianano
). - Mettre le contenu suivant dans le fichier
fichier1
:
Voici le contenu du fichier 1.
- Ligne 1
- Ligne 2
- Ligne 3
- Mettre le contenu suivant dans le fichier
fichier2
:
Voici le contenu du fichier 2.
- Ligne 1
- Ligne 2
- Ligne 3
- Déplacez le fichier
fichier1.md
dans le dossier/home/restitution/
. - Dupliquez le fichier
fichier2.md
dans le dossier/home/restitution/tp1/
et renommez-lefichier2bis.md
. - Renommez le fichier
fichier1.md
enintroduction.md
. - Changer le contenu du fichier
introduction.md
pour qu'il contienne :
Avec ce fichier je vais avoir une bonne note.
Installer un serveur web
Notre serveur a maintenant besoin d'un service Web (HTML seulement), nous allons donc y installer Apache. Nous allons utiliser la commande apt
pour installer Apache.
- Installez Apache avec la commande
apt
. - Vérifiez que le service Apache est bien lancé.
Comment faire ?
Je vous laisse regarder dans les ressources du TP précédent (voir TP précédent). Pour voir comment installer Apache.
Solution (je vous conseille de faire l'exercice avant de regarder la solution)
apt update
apt install apache2
systemctl status apache2
systemctl enable apache2
Gérer les permissions
Actuellement vous utilisez un utilisateur, celui-ci va créer des fichiers et des dossiers en son nom. Il est important de savoir comment gérer les droits sur ces fichiers et dossiers. Linux est un système multi-utilisateur, vous ne vous en rendez pas compte, mais beaucoup d'applications tournent en arrière-plan et ont besoin de droits spécifiques pour fonctionner.
::: Danger Un utilisateur différent ?
Et oui, si vous regardez avec la commande ps aux
vous verrez que de nombreux processus tournent avec un utilisateur différent du vôtre. Par exemple, Apache tourne avec l'utilisateur www-data
. C'est pour cela que nous allons voir comment gérer les droits sur les fichiers et dossiers.
:::
Le dossier /var/www/
Afin que votre utilisateur puisse modifier le code de votre site, vous devez modifier les permissions du dossier /var/www/
:
chown -R <VOTRE-UTILISATEUR>:www-data /var/www/
Les droits de base
Le dossier /var/www/
sont uniquement accessible pour l'utilisateur :
www-data
: C'est l'utilisateur qui va exécuter le serveur web.root
: C'est l'utilisateur qui a tous les droits sur le système.
En modifiant les droits du dossier /var/www/
vous permettez à votre utilisateur de modifier les fichiers et dossiers du site web.
Les droits
En plus des propriétaires, les fichiers et dossiers ont des droits. Ces droits sont représentés par des lettres et des chiffres. Les droits sont divisés en trois parties :
- Le propriétaire.
- Le groupe.
- Les autres.
Par exemple, si vous avez les droits suivants sur un fichier :
-rwxr-xr--
r
: Permet de lire le fichier.w
: Permet de modifier le fichier.x
: Permet d'exécuter le fichier.
Dans l'exemple ci-dessus, le propriétaire a tous les droits, le groupe a le droit de lire et d'exécuter le fichier et les autres n'ont aucun droit.
Si vous souhaitez modifier les droits d'un fichier ou d'un dossier, vous pouvez utiliser la commande chmod
. Par exemple, pour donner tous les droits à un fichier :
chmod ugo+rwx fichier
Ici, u
signifie utilisateur, g
signifie groupe et o
signifie autres. rwx
signifie lire, écrire et exécuter. Il est également possible d'utiliser des chiffres pour définir les droits. Par exemple, pour donner tous les droits à un fichier :
chmod 777 fichier
Ici 777
équivaut à ugo+rwx
.
Modifier les permissions
Avec les commandes vues précédemment, modifiez les permissions des fichiers et dossiers suivants :
- Donnez tous les droits à l'utilisateur sur le fichier
introduction.md
(rwx
). - Changer le propriétaire du fichier
introduction.md
pour qu'il appartienne à l'utilisateurroot
.
Créer un script nommé hello.sh
dans le dossier /home/restitution/
celui-ci doit contenir :
#!/bin/bash
echo "Hello World"
- Donner les droits d'exécution au fichier
hello.sh
(chmod +x hello.sh
). - Exécutez le script
hello.sh
en utilisant la commande./hello.sh
(./
permets d'exécuter un script dans le dossier courant).
Bravo !
Vous venez de faire votre premier script shell. En plus, vous avez vu comment le rendre exécutable pour le lancer via la ligne de commande.
Créer votre page web
Vous êtes en SLAM, du coup le Web vous connaissez ? Je vous propose de créer une page web qui respecte les spécifications suivantes :
- Le titre de la page doit être
TC 5
. - Le titre principal de la page doit être
TC 5
. - Le texte de la page doit être
Bienvenue sur la page de TC 5
. - Le texte de la page doit être en rouge et en gras et centré.
- Votre page doit contenir 3 liens vers les pages suivantes :
- Pour l'instant pas de PHP car notre serveur n'est pas configuré pour.
Où devez-vous placer votre page web pour qu'elle soit accessible depuis l'extérieur ? Par défaut, Apache place les pages web dans le dossier /var/www/html/
.
Je vous laisse éditer le fichier /var/www/html/index.html
pour y mettre votre page web.
Solution (je vous conseille de faire l'exercice avant de regarder la solution)
nano /var/www/html/index.html
Une fois le fichier édité, vous pouvez le visualiser en ouvrant votre navigateur et en tapant l'adresse IP de votre serveur.
Vérifier les logs
Maintenant que vous avez un serveur web, il est important de vérifier les logs pour voir si tout se passe bien. Pour cela, nous allons utiliser la commande tail
.
- Affichez les logs d'Apache en temps réel.
- Affichez les logs d'Apache pour les 10 dernières lignes.
tail -f /var/log/apache2/access.log
tail -n 10 /var/log/apache2/access.log
Vous pouvez aussi afficher l'ensemble des logs avec la commande :
nano /var/log/apache2/access.log
🚨 Je vous laisse tester, normalement vous devriez voir les logs de vos connexions au serveur. Vous pouvez le voir en temps réel avec la commande tail -f
et en accédant à votre page web depuis votre navigateur.
PS: N'oubliez pas de quitter la commande tail -f
avec CTRL + C
pour pouvoir continuer le TP. PS2: N'oubliez pas que vous devez me restituer un document PDF en fin de TP qui contient vos observations.
Évolution du site
Afin de rendre votre site plus attractif, vous allez ajouter une page apropos.html
qui contiendra les informations de contact de votre site. Celle-ci devra contenir les informations suivantes :
- Nom de l'école :
Lycée Chevrollier
. - Votre nom & prénom.
- Une description de votre site.
- La date de réalisation du site.
Cette page devra être accessible depuis la page index.html
via un lien nommé A propos
et pointant vers la page pages/apropos.html
.
Comment faire ?
En vous aidant des étapes précédentes, vous devriez pouvoir créer votre page apropos.html
et la rendre accessible depuis la page index.html
.
Bon courage !
Finalisation de votre site
Ajouter une page contact.html
qui contiendra un formulaire de contact. Ce formulaire devra contenir les champs suivants :
- Nom.
- Prénom.
- Email.
- Message.
Pour l'instant le formulaire ne doit pas être fonctionnel, il doit juste être présent sur la page.
Ce formulaire devra être accessible depuis la page index.html
via un lien nommé Contact
et pointant vers la page pages/contact.html
.
Me donner accès à votre serveur
Votre réalisation est maintenant terminée, il est temps de me donner accès à votre serveur pour que je puisse vérifier votre travail. Nous avons vu dans le TP précédent comment autoriser votre clé SSH sur le serveur. Évidemment, je ne vais pas vous demander votre clé SSH, mais je vais vous fournir ma clé SSH publique.
La procédure est la suivante :
- Récupérez ma clé SSH publique (télécharger le fichier ici).
- Ajouter le contenu du fichier
id_rsa_etudiant.pub
dans le fichier~/.ssh/authorized_keys
de votre utilisateur sur le serveur (exemple :/home/vbrosseau/.ssh/authorized_keys
).- Vous pouvez utiliser
nano
ouvim
pour éditer le fichier.
- Vous pouvez utiliser
- Vous pouvez également le faire via la commande curl :
su - # Se connecter en tant que root
apt install curl # Installer curl si ce n'est pas déjà fait
exit # Se déconnecter en tant que root
curl https://gist.githubusercontent.com/c4software/7902465cf82695ab5260a202757fe0ca/raw/dda707234b009333483556da61f8a990e08215ed/id_rsa_etudiant.pub >> ~/.ssh/authorized_keys # Ajouter la clé SSH publique dans le fichier authorized_keys
À la fin de cette étape, votre fichier authorized_keys
devrait ressembler à ça :
ssh-rsa VotreClé ...
ssh-rsa MaClé ...
À présent, si vous me donnez l'adresse IP de votre serveur, je pourrais me connecter dessus et vérifier votre travail. Si vous avez des problèmes, n'hésitez pas à me contacter.
Attention
En réalisant cette étape, vous me donnez accès à votre serveur. Je ne ferai rien de malveillant, mais je vous conseille de ne pas laisser votre serveur accessible à tout le monde. Vous ne devez ajouter que des personnes de confiance dans le fichier authorized_keys
.
Si vous avez bien réalisé les étapes précédentes, je ne devrais pas avoir accès en root à votre serveur. Les modifications que je pourrais faire seront limitées à votre utilisateur, mais c'est quand même mieux de ne pas laisser votre serveur accessible à tout le monde…
Restitution
Pour restituer le projet, merci de me fournir les éléments suivants :
- L'adresse IP de votre serveur.
- Votre fiche serveur.
- Rapport illustrant les différentes étapes.
Le rendu se fera via le formulaire suivant : Rendre le TP
Bravo vous avez terminé le TP !
Comment sera validé la partie VM ?
Pour valider la partie VM, je vais utiliser le script suivant :
#!/bin/bash
# Définir le chemin du fichier CSV contenant les informations de connexion
csv_file="./input.csv"
# Fonction pour se connecter en SSH et exécuter une commande
function ssh_execute {
ssh -i ~/.ssh/id_rsa_etudiant "${remote_user}@${remote_host}" "$1"
}
echo "Validation des VMs"
echo "VM Name;OS;Memory;CPU;Disk;index.html;apropos.html" > vm_check_result.csv
# Boucle sur chaque ligne du fichier CSV
awk -F";" '{print $1, $2}' "${csv_file}" | while read user ip; do
echo "Validation pour l'utilisateur ${user} avec l'adresse IP ${ip}."
# Définir les paramètres de la machine distante
remote_host="${ip}"
remote_user="${user}"
# Définir les paramètres de la VM
vm_name="-ligne-de-commande"
# Vérifier le nom de la VM
vm_name_result=$(ssh_execute "hostname")
# Vérifier l'OS
os_result=$(ssh_execute "lsb_release -ds")
# Vérifier la mémoire
memory_result=$(ssh_execute "awk '/MemTotal/{print \$2}' /proc/meminfo")
# Vérifier le CPU
cpu_result=$(ssh_execute "nproc")
# Vérifier le disque
disk_result=$(ssh_execute "df -h | grep '/dev/sda1'" | awk '{print $2}')
index_check=$(ssh_execute "wget -qO- http://localhost/index.html | grep -q 'TC 5' && echo 'true' || echo 'false'")
apropos_check=$(ssh_execute "wget -qO- http://localhost/pages/apropos.html | grep -q 'html' && echo 'true' || echo 'false'")
# Enregistrer les résultats dans un fichier CSV
echo "${vm_name_result};${os_result};${memory_result};${cpu_result};${disk_result};${index_check};${apropos_check}" >> vm_check_result.csv
done