<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: As Manjaka Josvah</title>
    <description>The latest articles on DEV Community by As Manjaka Josvah (@ashcript).</description>
    <link>https://dev.to/ashcript</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1076901%2Fa5d71a22-d7c6-4e0e-b656-1957db84124f.jpg</url>
      <title>DEV Community: As Manjaka Josvah</title>
      <link>https://dev.to/ashcript</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ashcript"/>
    <language>en</language>
    <item>
      <title>Makefile - .h - .c exemple.</title>
      <dc:creator>As Manjaka Josvah</dc:creator>
      <pubDate>Sun, 14 Jul 2024 09:36:27 +0000</pubDate>
      <link>https://dev.to/ashcript/makefile-h-c-exemple-2m9</link>
      <guid>https://dev.to/ashcript/makefile-h-c-exemple-2m9</guid>
      <description>&lt;p&gt;Voici la structure du projet avec l'exemple sans bibliothèque statique en premier, suivi de l'exemple avec bibliothèque statique.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structure du Projet
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/mon_projet
├── Makefile
├── utils.h
├── utils.c
└── main.c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exemple 1 : Sans bibliothèque statique
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Fichier d'en-tête : &lt;code&gt;utils.h&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#ifndef UTILS_H
#define UTILS_H
&lt;/span&gt;
&lt;span class="c1"&gt;// Fonction pour additionner deux entiers&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;addition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="cp"&gt;#endif // UTILS_H
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Fichier source : &lt;code&gt;utils.c&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"utils.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// Implémentation de la fonction d'addition&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;addition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Fichier principal : &lt;code&gt;main.c&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"utils.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;addition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"La somme de %d et %d est : %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. Makefile : &lt;code&gt;Makefile&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="c"&gt;# Variables
&lt;/span&gt;&lt;span class="nv"&gt;CC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; gcc
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-Wall&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt;
&lt;span class="nv"&gt;SOURCES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; main.c utils.c
&lt;span class="nv"&gt;OBJECTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;SOURCES:.c&lt;span class="o"&gt;=&lt;/span&gt;.o&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;DEPENDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;OBJECTS:.o&lt;span class="o"&gt;=&lt;/span&gt;.d&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;TARGET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; mon_programme

&lt;span class="c"&gt;# Règle par défaut
&lt;/span&gt;&lt;span class="nl"&gt;all&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$(TARGET)&lt;/span&gt;

&lt;span class="c"&gt;# Lien de l'exécutable
&lt;/span&gt;&lt;span class="nl"&gt;$(TARGET)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$(OBJECTS)&lt;/span&gt;
    &lt;span class="p"&gt;$(&lt;/span&gt;CC&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt; &lt;span class="nv"&gt;$^&lt;/span&gt;

&lt;span class="c"&gt;# Compilation des fichiers .c en .o avec génération des dépendances
&lt;/span&gt;&lt;span class="nl"&gt;%.o&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;%.c&lt;/span&gt;
    &lt;span class="p"&gt;$(&lt;/span&gt;CC&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;CFLAGS&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-MMD&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nv"&gt;$&amp;lt;&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt;

&lt;span class="c"&gt;# Inclure les fichiers de dépendance
&lt;/span&gt;&lt;span class="k"&gt;-include&lt;/span&gt;&lt;span class="sx"&gt; $(DEPENDS)&lt;/span&gt;

&lt;span class="c"&gt;# Déclaration des cibles phony
&lt;/span&gt;&lt;span class="nl"&gt;.PHONY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;all clean fclean re&lt;/span&gt;

&lt;span class="c"&gt;# Nettoyage
&lt;/span&gt;&lt;span class="nl"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;OBJECTS&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;DEPENDS&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nl"&gt;fclean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;clean&lt;/span&gt;
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;TARGET&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nl"&gt;re&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;fclean all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Exemple 2 : Avec une bibliothèque statique
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Fichier d'en-tête : &lt;code&gt;utils.h&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#ifndef UTILS_H
#define UTILS_H
&lt;/span&gt;
&lt;span class="c1"&gt;// Fonction pour additionner deux entiers&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;addition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="cp"&gt;#endif // UTILS_H
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Fichier source : &lt;code&gt;utils.c&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"utils.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// Implémentation de la fonction d'addition&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;addition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Fichier principal : &lt;code&gt;main.c&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"utils.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;addition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"La somme de %d et %d est : %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. Makefile : &lt;code&gt;Makefile&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="c"&gt;# Variables
&lt;/span&gt;&lt;span class="nv"&gt;CC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; gcc
&lt;span class="nv"&gt;AR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ar
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-Wall&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt;
&lt;span class="nv"&gt;SOURCES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; main.c utils.c
&lt;span class="nv"&gt;OBJECTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;SOURCES:.c&lt;span class="o"&gt;=&lt;/span&gt;.o&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;DEPENDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;OBJECTS:.o&lt;span class="o"&gt;=&lt;/span&gt;.d&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;TARGET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; mon_programme
&lt;span class="nv"&gt;LIBRARY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; libutils.a

&lt;span class="c"&gt;# Règle par défaut
&lt;/span&gt;&lt;span class="nl"&gt;all&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$(TARGET)&lt;/span&gt;

&lt;span class="c"&gt;# Lien de l'exécutable
&lt;/span&gt;&lt;span class="nl"&gt;$(TARGET)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$(OBJECTS) $(LIBRARY)&lt;/span&gt;
    &lt;span class="p"&gt;$(&lt;/span&gt;CC&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt; &lt;span class="nv"&gt;$^&lt;/span&gt;

&lt;span class="c"&gt;# Création de la bibliothèque statique
&lt;/span&gt;&lt;span class="nl"&gt;$(LIBRARY)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;utils.o&lt;/span&gt;
    &lt;span class="p"&gt;$(&lt;/span&gt;AR&lt;span class="p"&gt;)&lt;/span&gt; rcs &lt;span class="nv"&gt;$@&lt;/span&gt; &lt;span class="nv"&gt;$^&lt;/span&gt;

&lt;span class="c"&gt;# Compilation des fichiers .c en .o avec génération des dépendances
&lt;/span&gt;&lt;span class="nl"&gt;%.o&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;%.c&lt;/span&gt;
    &lt;span class="p"&gt;$(&lt;/span&gt;CC&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;CFLAGS&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-MMD&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nv"&gt;$&amp;lt;&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt;

&lt;span class="c"&gt;# Inclure les fichiers de dépendance
&lt;/span&gt;&lt;span class="k"&gt;-include&lt;/span&gt;&lt;span class="sx"&gt; $(DEPENDS)&lt;/span&gt;

&lt;span class="c"&gt;# Déclaration des cibles phony
&lt;/span&gt;&lt;span class="nl"&gt;.PHONY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;all clean fclean re&lt;/span&gt;

&lt;span class="c"&gt;# Nettoyage
&lt;/span&gt;&lt;span class="nl"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;OBJECTS&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;DEPENDS&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;LIBRARY&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nl"&gt;fclean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;clean&lt;/span&gt;
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;TARGET&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nl"&gt;re&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;fclean all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Résumé des Exemples
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sans bibliothèque statique&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compile directement les fichiers source pour créer l'exécutable &lt;code&gt;mon_programme&lt;/code&gt; sans créer de bibliothèque.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Avec bibliothèque statique&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crée une bibliothèque &lt;code&gt;libutils.a&lt;/code&gt; à partir de &lt;code&gt;utils.o&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;L'exécutable &lt;code&gt;mon_programme&lt;/code&gt; dépend de cette bibliothèque.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Utilisation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pour compiler le programme : &lt;code&gt;make&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Pour nettoyer les fichiers objets et la bibliothèque (dans le premier exemple) : &lt;code&gt;make clean&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Pour nettoyer complètement : &lt;code&gt;make fclean&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Pour reconstruire : &lt;code&gt;make re&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces exemples montrent comment structurer un projet simple avec et sans bibliothèque statique tout en maintenant une clarté et une maintenabilité dans le Makefile.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemple 3 : Avec utilisation d'un autre bibliothèque :
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Note : c'est le Makefile que j'ai créé lors de la réalisation d'un de mes projets.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="c"&gt;# Arguments
&lt;/span&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; libftprintf.a
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-Wall&lt;/span&gt; &lt;span class="nt"&gt;-Wextra&lt;/span&gt; &lt;span class="nt"&gt;-Werror&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt; .

&lt;span class="c"&gt;# Sources
&lt;/span&gt;&lt;span class="nv"&gt;SRC_FILES&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; ft_printf.c &lt;span class="se"&gt;\&lt;/span&gt;
               ft_ulitob.c &lt;span class="se"&gt;\&lt;/span&gt;
               ft_putunbr_fd.c &lt;span class="se"&gt;\&lt;/span&gt;
               ft_unsigned_lintlen.c &lt;span class="se"&gt;\&lt;/span&gt;
               ft_lintlen.c &lt;span class="se"&gt;\&lt;/span&gt;
               ft_print_c.c &lt;span class="se"&gt;\&lt;/span&gt;
               ft_print_s.c &lt;span class="se"&gt;\&lt;/span&gt;
               ft_print_p.c &lt;span class="se"&gt;\&lt;/span&gt;
               ft_print_di.c &lt;span class="se"&gt;\&lt;/span&gt;
               ft_print_u.c &lt;span class="se"&gt;\&lt;/span&gt;
               ft_print_x.c

&lt;span class="c"&gt;# Objets
&lt;/span&gt;&lt;span class="nv"&gt;OBJ_FILES&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;SRC_FILES:.c&lt;span class="o"&gt;=&lt;/span&gt;.o&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Règle principale
&lt;/span&gt;&lt;span class="nl"&gt;all&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$(NAME)&lt;/span&gt;

&lt;span class="c"&gt;# Création de la bibliothèque
&lt;/span&gt;&lt;span class="nl"&gt;$(NAME)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$(OBJ_FILES)&lt;/span&gt;
    make &lt;span class="nt"&gt;-C&lt;/span&gt; libft/
    &lt;span class="nb"&gt;cp &lt;/span&gt;libft/libft.a &lt;span class="p"&gt;$(&lt;/span&gt;NAME&lt;span class="p"&gt;)&lt;/span&gt;
    ar rcs &lt;span class="p"&gt;$(&lt;/span&gt;NAME&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;OBJ_FILES&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Compilation des fichiers source
&lt;/span&gt;&lt;span class="nl"&gt;%.o&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;%.c&lt;/span&gt;
    &lt;span class="p"&gt;$(&lt;/span&gt;CC&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;CFLAGS&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nv"&gt;$&amp;lt;&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt;

&lt;span class="c"&gt;# Nettoyage
&lt;/span&gt;&lt;span class="nl"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;OBJ_FILES&lt;span class="p"&gt;)&lt;/span&gt;
    make clean &lt;span class="nt"&gt;-C&lt;/span&gt; libft/

&lt;span class="nl"&gt;fclean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;clean&lt;/span&gt;
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;NAME&lt;span class="p"&gt;)&lt;/span&gt;
    make fclean &lt;span class="nt"&gt;-C&lt;/span&gt; libft/

&lt;span class="nl"&gt;re&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;fclean all&lt;/span&gt;

&lt;span class="c"&gt;# Commandes indispensables
&lt;/span&gt;&lt;span class="nl"&gt;.PHONY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;all clean fclean re&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Améliorations Clés
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Génération Automatique des Fichiers Objet&lt;/strong&gt; : La variable &lt;code&gt;OBJ_FILES&lt;/code&gt; convertit automatiquement les noms de fichiers source en noms de fichiers objet à l'aide de la substitution de motifs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Règles de Motif&lt;/strong&gt; : L'utilisation de règles de motif (&lt;code&gt;%.o: %.c&lt;/code&gt;) simplifie les commandes de compilation pour chaque fichier source.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Règles de Nettoyage Organisées&lt;/strong&gt; : Les règles de nettoyage sont concises, supprimant les répétitions inutiles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Facilité de Maintenance&lt;/strong&gt; : La structure est claire, ce qui rend les futures modifications plus simples.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ce Makefile conserve la même fonctionnalité tout en étant plus propre et plus efficace.&lt;/p&gt;

</description>
      <category>makefile</category>
      <category>c</category>
    </item>
    <item>
      <title>Comprendre le Makefile (Exemple avec langage C).</title>
      <dc:creator>As Manjaka Josvah</dc:creator>
      <pubDate>Sun, 14 Jul 2024 07:37:37 +0000</pubDate>
      <link>https://dev.to/ashcript/comprendre-le-makefile-exemple-avec-le-langage-c-47n9</link>
      <guid>https://dev.to/ashcript/comprendre-le-makefile-exemple-avec-le-langage-c-47n9</guid>
      <description>&lt;p&gt;Un Makefile est un fichier utilisé par l'outil &lt;code&gt;make&lt;/code&gt; pour automatiser la compilation de programmes. Voici les règles standards et les bonnes pratiques pour rédiger un Makefile efficace :&lt;/p&gt;

&lt;h3&gt;
  
  
  Structure de Base d'un Makefile
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cible (Target)&lt;/strong&gt; : Ce que tu veux construire (ex. un fichier exécutable).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prérequis (Prerequisites)&lt;/strong&gt; : Les fichiers nécessaires pour construire la cible (ex. fichiers source).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Règle (Rule)&lt;/strong&gt; : La commande à exécuter pour créer la cible.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Exemple Simple
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;target&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;prerequisites&lt;/span&gt;
    &lt;span class="nb"&gt;command&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Règles Standards
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Règle par défaut&lt;/strong&gt; : La première cible dans le Makefile est celle qui sera construite par défaut.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compilation des fichiers source&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utiliser des variables pour les compilateurs et les options.&lt;/li&gt;
&lt;li&gt;Exemple :
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;   &lt;span class="nv"&gt;CC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; gcc
   &lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-Wall&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt;
   &lt;span class="nv"&gt;SOURCES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; main.c utils.c
   &lt;span class="nv"&gt;OBJECTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;SOURCES:.c&lt;span class="o"&gt;=&lt;/span&gt;.o&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="nv"&gt;TARGET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; mon_programme

   &lt;span class="nl"&gt;$(TARGET)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$(OBJECTS)&lt;/span&gt;
       &lt;span class="p"&gt;$(&lt;/span&gt;CC&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt; &lt;span class="nv"&gt;$^&lt;/span&gt;

   &lt;span class="nl"&gt;%.o&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;%.c&lt;/span&gt;
       &lt;span class="p"&gt;$(&lt;/span&gt;CC&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;CFLAGS&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nv"&gt;$&amp;lt;&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Phonies&lt;/strong&gt; : Utilise &lt;code&gt;.PHONY&lt;/code&gt; pour les cibles qui ne correspondent pas à des fichiers.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;   &lt;span class="nl"&gt;.PHONY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;clean&lt;/span&gt;
   &lt;span class="nl"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
       &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;OBJECTS&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;TARGET&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Variables&lt;/strong&gt; : Utilise des variables pour simplifier la gestion des chemins et des options.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;   &lt;span class="nv"&gt;CC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; gcc
   &lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-Wall&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gestion des dépendances&lt;/strong&gt; : Utilise des règles implicites et des modèles pour réduire la répétition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dépendances automatiques&lt;/strong&gt; : Tu peux générer des dépendances automatiquement pour les fichiers &lt;code&gt;.o&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;   &lt;span class="k"&gt;-include&lt;/span&gt;&lt;span class="sx"&gt; $(OBJECTS:.o=.d)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exemple Complet
&lt;/h3&gt;

&lt;p&gt;Voici un exemple complet de Makefile :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="c"&gt;# Variables
&lt;/span&gt;&lt;span class="nv"&gt;CC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; gcc
&lt;span class="nv"&gt;CFLAGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-Wall&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt;
&lt;span class="nv"&gt;SOURCES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; main.c utils.c
&lt;span class="nv"&gt;OBJECTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;SOURCES:.c&lt;span class="o"&gt;=&lt;/span&gt;.o&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;TARGET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; mon_programme

&lt;span class="c"&gt;# Règle par défaut
&lt;/span&gt;&lt;span class="nl"&gt;all&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$(TARGET)&lt;/span&gt;

&lt;span class="c"&gt;# Lien de l'exécutable
# $@ -&amp;gt; $(TARGET)
# $^ -&amp;gt; $(OBJECTS)
&lt;/span&gt;&lt;span class="nl"&gt;$(TARGET)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$(OBJECTS)&lt;/span&gt;
    &lt;span class="p"&gt;$(&lt;/span&gt;CC&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt; &lt;span class="nv"&gt;$^&lt;/span&gt;

&lt;span class="c"&gt;# Compilation des fichiers .c en .o
# $&amp;lt; -&amp;gt; Premier element des pr
&lt;/span&gt;&lt;span class="nl"&gt;%.o&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;%.c&lt;/span&gt;
    &lt;span class="p"&gt;$(&lt;/span&gt;CC&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;CFLAGS&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nv"&gt;$&amp;lt;&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt;

&lt;span class="c"&gt;# Déclaration des cibles phony
&lt;/span&gt;&lt;span class="nl"&gt;.PHONY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;all clean fclean re&lt;/span&gt;

&lt;span class="c"&gt;# Nettoyage des fichiers objets
&lt;/span&gt;&lt;span class="nl"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;OBJECTS&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Nettoyage complet (fichiers objets et exécutable)
&lt;/span&gt;&lt;span class="nl"&gt;fclean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;clean&lt;/span&gt;
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;TARGET&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Refaire la compilation
&lt;/span&gt;&lt;span class="nl"&gt;re&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;fclean all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Bonnes Pratiques
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Indenter avec des tabulations&lt;/strong&gt; : Les commandes dans les règles doivent être indentées avec des tabulations, pas des espaces.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Commenter le code&lt;/strong&gt; : Utilise des commentaires pour expliquer les sections du Makefile.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Regrouper les fichiers&lt;/strong&gt; : Si ton projet contient plusieurs fichiers, organise-les dans des sous-répertoires et utilise des variables pour gérer les chemins.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Utiliser des règles implicites&lt;/strong&gt; : Profite des règles intégrées de &lt;code&gt;make&lt;/code&gt; pour éviter de réécrire des règles courantes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Pourquoi utiliser .PHONY ?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Eviter les conflits :&lt;/strong&gt; Si un fichier avec le même nom qu'une cible existe, make pensera que la cible est à jour et n'exécutera pas les commandes associées. .PHONY évite cela.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Amélioration des performances :&lt;/strong&gt; Les cibles phony sont toujours considérées comme "à faire", ce qui peut améliorer la vitesse d'exécution des commandes associées.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pourquoi utiliser %.o: %.c pour la compilation ?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Efficacité : Utiliser %.o: %.c permet de bénéficier de l'optimisation de make pour ne recompiler que ce qui est nécessaire.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pratique : Pour les projets de taille plus importante, %.o: %.c est beaucoup plus adaptée.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Un Makefile bien structuré rend la gestion de projet plus facile et évite les erreurs de compilation. En respectant ces règles et bonnes pratiques, tu peux créer un Makefile efficace et maintenable.&lt;/p&gt;

</description>
      <category>makefile</category>
      <category>c</category>
    </item>
    <item>
      <title>SysAdmin</title>
      <dc:creator>As Manjaka Josvah</dc:creator>
      <pubDate>Thu, 09 May 2024 13:58:55 +0000</pubDate>
      <link>https://dev.to/ashcript/sysadmin-1451</link>
      <guid>https://dev.to/ashcript/sysadmin-1451</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YdjPbwAJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://geps.dev/progress/100" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YdjPbwAJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://geps.dev/progress/100" alt="Progression" width="90" height="20"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  I. &lt;u&gt;Les serveurs graphiques&lt;/u&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. À quoi sert le serveur graphique ?
&lt;/h3&gt;

&lt;p&gt;Le serveur graphique donne la possibilité d’afficher une interface graphique dans GNU/Linux.&lt;/p&gt;

&lt;p&gt;Une interface graphique est un ensemble de fenêtres avec barres, boutons et décorations. L’interface graphique permet l’usage de la souris. En anglais on dit GUI (= graphical user interface).&lt;/p&gt;

&lt;p&gt;Dans GNU/Linux, le serveur graphique s’appelle &lt;strong&gt;X&lt;/strong&gt; mais on dit aussi &lt;strong&gt;X window&lt;/strong&gt; (attention, pas de s final, rien à voir avec le système, ou OS M$Windows).&lt;/p&gt;

&lt;p&gt;De très nombreux logiciels ont une interface graphique (comme Firefox, LibreOffice…) mais il existe aussi de nombreux logiciels sans interface graphique qui sont «en ligne de commande».&lt;/p&gt;

&lt;p&gt;En fait, quand GNU/Linux démarre, le serveur graphique ne se met en route que tardivement, au moment où apparaît l’écran de login. Ce dernier nous donne accès au bureau si on y met notre nom d’utilisateur et mot de passe.&lt;/p&gt;

&lt;p&gt;Pour que le serveur graphique fonctionne, il faut qu’il y ait une &lt;strong&gt;carte graphique&lt;/strong&gt; dans l'UC et qu’elle soit reconnue par le noyau Linux : pour ces matériels, il faut verifier la specification technique de la machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Sans serveur graphique
&lt;/h3&gt;

&lt;p&gt;Le serveur graphique &lt;strong&gt;&lt;em&gt;&lt;u&gt;n’est pas indispensable&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; dans GNU/Linux. Il est très possible de ne pas l’installer car GNU/Linux fonctionne très bien sans bureau, sans fenêtres, sans décorations et sans souris.&lt;/p&gt;

&lt;p&gt;À ce moment-là, GNU/Linux démarre normalement (enfin comme sous Debian, avec tout un défilé de lignes blanches sur fond noir, Ubuntu cache tout ce défilé) mais ensuite l'écran reste noir. Juste quelques phrases affichées en blanc nous invitent à mettre notre nom d’utilisateur et mot de passe pour commencer à travailler.&lt;/p&gt;

&lt;p&gt;L'écran tout entier est le terminal, le vrai, pas comme le petit terminal (qui est en fait un &lt;strong&gt;émulateur&lt;/strong&gt;, faisant semblant d’en être un vrai) que vous voyez là-bas : &lt;a href="https://vive-gnulinux.fr.cr/terminal-debutants/"&gt;Le terminal pour les débutants&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En fait, &lt;strong&gt;&lt;u&gt;par défaut, il y a 6 terminaux&lt;/u&gt;&lt;/strong&gt; et vous pouvez passer au tty2 avec la combinaison de touches [Ctrl-Alt-F2] et ainsi de suite.&lt;/p&gt;

&lt;p&gt;Depuis le terminal, il est possible d’installer le serveur graphique et de le démarrer pour accéder au bureau (grâce à la commande &lt;strong&gt;&lt;em&gt;startx&lt;/em&gt;&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Depuis le bureau, il est aussi possible de passer derrière le serveur graphique dans n’importe quelle distribution GNU/Linux. Depuis le bureau décoré et avec la combinaison de touches [Ctrl-Alt-F1], on arrive sur le premier terminal &lt;strong&gt;tty1&lt;/strong&gt;. Avec la combinaison de touches &lt;a href="https://dev.toou%20[Alt-F7]"&gt;Ctrl-Alt-F7&lt;/a&gt; on retourne sur le bureau.&lt;/p&gt;

&lt;p&gt;Sans serveur graphique, on ne peut utiliser que des logiciels en ligne de commande mais on peut faire beaucoup de choses :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Parcourir les fichiers, les déplacer, les renommer, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Faire des répertoires, en déplacer, en supprimer, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rédiger, envoyer, recevoir, lire et classer les emails&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Surfer sur le web (on ne voit pas d’images, ce peut être reposant)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rédiger des textes avec un éditeur de texte ou faire du traitement de texte (avec Latex)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Écouter de la musique&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;…&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On peut suivre sur Libre-Fan une installation de Debian sur un ordinosaure sans serveur graphique au départ.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Les serveurs, un ordinateur-routeur fonctionnent sans interface graphique&lt;/strong&gt; car c’est &lt;strong&gt;&lt;u&gt;&lt;em&gt;inutile&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt; et ce sont des UC &lt;strong&gt;&lt;u&gt;&lt;em&gt;sans écran&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt; que l’on contrôle à distance, depuis un ordinateur complet.&lt;/p&gt;

&lt;h3&gt;
  
  
  ChatGPT
&lt;/h3&gt;

&lt;p&gt;Un serveur graphique, dans le contexte de l'informatique, est un logiciel qui gère l'affichage graphique sur un ordinateur. Il agit comme une sorte d'interface entre le matériel graphique de l'ordinateur (carte graphique, écran, etc.) et les programmes qui ont besoin d'afficher des éléments graphiques à l'écran.&lt;/p&gt;

&lt;p&gt;Voici une explication détaillée des composants et du fonctionnement d'un serveur graphique :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Affichage matériel&lt;/strong&gt; : Le serveur graphique interagit avec le matériel graphique de l'ordinateur, tel que la carte graphique, les écrans et les périphériques d'entrée (souris, clavier, etc.). Il est chargé de communiquer avec ces composants pour afficher les graphismes à l'écran et gérer les entrées utilisateur.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gestion des fenêtres&lt;/strong&gt; : Le serveur graphique est responsable de la création, de la gestion et de la manipulation des fenêtres sur l'écran. Cela inclut le redimensionnement, le déplacement et la superposition des fenêtres, ainsi que la gestion des événements liés aux fenêtres (clics de souris, frappes de clavier, etc.).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Système de fenêtrage&lt;/strong&gt; : Le serveur graphique utilise un système de fenêtrage pour organiser les fenêtres sur l'écran. Il existe différents systèmes de fenêtrage, tels que :&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;le système de fenêtrage en cascade&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;le système de fenêtrage en mosaïque&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;le système de fenêtrage en pile.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces systèmes déterminent comment les fenêtres sont disposées et comment les utilisateurs interagissent avec elles.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Affichage des graphismes&lt;/strong&gt; : Le serveur graphique est chargé d'afficher les éléments graphiques à l'écran, tels que les images, les icônes, les polices de caractères, les widgets d'interface utilisateur, etc. Il utilise des bibliothèques graphiques et des pilotes de périphériques pour convertir les données graphiques en signaux que l'écran peut afficher.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gestion des événements&lt;/strong&gt; : Le serveur graphique reçoit et traite les événements utilisateur, tels que les clics de souris, les mouvements de la souris, les frappes de clavier, etc. Il est chargé de transmettre ces événements aux programmes appropriés en fonction de la position de la souris et de l'état des fenêtres.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Protocoles de communication&lt;/strong&gt; : Les serveurs graphiques utilisent souvent des protocoles de communication pour interagir avec les clients graphiques, tels que les applications et les environnements de bureau. Ces protocoles permettent aux clients graphiques de demander des services au serveur graphique, tels que la création de fenêtres, le dessin d'images, etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Les serveurs graphiques les plus couramment utilisés dans les systèmes d'exploitation modernes sont &lt;strong&gt;&lt;em&gt;&lt;u&gt;X.Org Server&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;em&gt;&lt;u&gt;Wayland&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;. X.Org Server est un serveur graphique open source largement utilisé dans les systèmes Unix et Unix-like, tandis que Wayland est une nouvelle architecture de serveur graphique conçue pour remplacer X.Org Server dans certains environnements de bureau.&lt;/p&gt;

&lt;h2&gt;
  
  
  II. &lt;u&gt;X.org&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;X.Org est un &lt;strong&gt;serveur X libre&lt;/strong&gt; issu d'un &lt;strong&gt;fork de XFree86&lt;/strong&gt; en janvier 2004 à la suite d'un désaccord sur le changement de licence de XFree86. Il fonctionne avec la plupart des systèmes d'exploitation de type UNIX (GNU/Linux, dérivés de BSD, Solaris, etc.), mais aussi avec Microsoft Windows via &lt;em&gt;Cygwin&lt;/em&gt;. Du fait de sa licence, il connaît une grande popularité au sein de la communauté du logiciel libre où il a remplacé XFree86.&lt;/p&gt;

&lt;p&gt;La gouvernance du projet est assurée par la &lt;strong&gt;&lt;u&gt;fondation X.Org&lt;/u&gt;&lt;/strong&gt;, laquelle réalise à la fois les développements en conjonction avec la communauté &lt;strong&gt;Freedesktop.org&lt;/strong&gt; tout en veillant à la cohérence de l'ensemble de ses projets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmdgd9sgt0okfne2cikl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmdgd9sgt0okfne2cikl.png" alt="Schéma des couches de l'interface graphique" width="565" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;X.org est un &lt;strong&gt;logiciel libre&lt;/strong&gt; du type &lt;strong&gt;serveur X&lt;/strong&gt;, la famille des systèmes de fenêtrage la plus connue, pour les systèmes d'exploitation de type &lt;strong&gt;UNIX&lt;/strong&gt;. X.org est &lt;strong&gt;l'implémentation officielle du système graphique &lt;u&gt;X Window System&lt;u&gt;&lt;/u&gt;&lt;/u&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;C'est donc un &lt;strong&gt;serveur graphique&lt;/strong&gt;, c'est lui qui va faire en sorte que l'on dispose d'autre chose que les &lt;em&gt;ttys&lt;/em&gt; sur le système, il va fournir une interface graphique. Seul, il est limité; il n'affiche en effet que des fenêtres, il faudra recourir à l'utilisation d'un &lt;strong&gt;gestionnaire de fenêtre&lt;/strong&gt; ou d'un environnement de bureau si on veut un résultat plus agréable à l'oeil.&lt;/p&gt;

&lt;p&gt;X.org est un programme basé sur une architecture serveur/client :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;le serveur X&lt;/u&gt;&lt;/strong&gt; est &lt;strong&gt;lancé sur une machine possédant un écran, un clavier et une souris (ou d'autres périphériques)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;le client X&lt;/u&gt;&lt;/strong&gt; se connecte au serveur afin de lui donner ses requêtes, ce sont des applications graphiques affichées dans une fenêtre du serveur X&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;le protocole X&lt;/u&gt;&lt;/strong&gt; qui permet l'échange de données entre le serveur et le client&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sans serveur graphique, impossible d'avoir un rendu autre que celui de la console.&lt;/p&gt;

&lt;h2&gt;
  
  
  III. &lt;u&gt;KDump&lt;/u&gt; (&lt;em&gt;Kernel dump&lt;/em&gt; ou &lt;em&gt;Kernel core dump&lt;/em&gt;)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fndrx8o10416sslnh7lzr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fndrx8o10416sslnh7lzr.png" alt="Image description" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kdump est une fonctionnalité &lt;strong&gt;présente dans le noyau Linux&lt;/strong&gt; qui permet la &lt;strong&gt;capture de l'état du noyau en cas de panne système &lt;em&gt;(kernel panic)&lt;/em&gt; ou de dysfonctionnement grave&lt;/strong&gt;. Lorsqu'un système subit un kernel panic, il arrête brusquement toutes les opérations en cours, ce qui peut entraîner la &lt;strong&gt;&lt;em&gt;perte de données importantes&lt;/em&gt;&lt;/strong&gt; pour le diagnostic de la panne.&lt;/p&gt;

&lt;p&gt;Kdump intervient pour résoudre ce problème en &lt;strong&gt;&lt;u&gt;créant un noyau de secours minimal&lt;/u&gt;&lt;/strong&gt; qui est chargé en mémoire lorsque le système principal rencontre une panne. Ce noyau de secours est &lt;strong&gt;&lt;u&gt;lancé dans un environnement isolé&lt;/u&gt;&lt;/strong&gt;, distinct du système principal, ce qui permet de capturer des informations sur l'état du système au moment de la panne sans risquer d'écraser les données existantes.&lt;/p&gt;

&lt;p&gt;Voici comment fonctionne généralement Kdump :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configuration du système&lt;/strong&gt; : Pour utiliser Kdump, on doit configurer le système pour qu'il alloue de l'espace mémoire réservé pour le noyau de secours et pour les informations de débogage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Déclenchement d'une panne système&lt;/strong&gt; : Lorsqu'une panne système se produit, le noyau principal du système est incapable de récupérer et déclenche un kernel panic. À ce stade, le noyau de secours &lt;em&gt;n'a pas été chargé&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chargement du noyau de secours&lt;/strong&gt; : Après le kernel panic, le noyau de secours est chargé en mémoire. Ce noyau est minimaliste, ne contenant que &lt;em&gt;les éléments nécessaires pour capturer l'état du système et les informations de débogage&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Capture de l'état du système&lt;/strong&gt; : Une fois que le noyau de secours est chargé, il capture l'état de la &lt;strong&gt;&lt;em&gt;mémoire&lt;/em&gt;&lt;/strong&gt;, les &lt;strong&gt;&lt;em&gt;registres du processeur&lt;/em&gt;&lt;/strong&gt;, les &lt;strong&gt;&lt;em&gt;informations sur les pilotes et d'autres données pertinentes&lt;/em&gt;&lt;/strong&gt; qui peuvent aider à diagnostiquer la panne.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enregistrement des informations&lt;/strong&gt; : Les informations capturées sont enregistrées sur un périphérique de stockage, tel qu'un disque dur ou un réseau. Ces données peuvent ensuite être utilisées pour analyser la panne et identifier sa cause.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Kdump est un &lt;strong&gt;outil précieux pour le &lt;em&gt;débogage des problèmes système&lt;/em&gt; sur les serveurs Linux et les environnements critiques&lt;/strong&gt; où la disponibilité et la fiabilité sont essentielles. Il permet aux administrateurs système et aux développeurs de diagnostiquer et de résoudre les problèmes système de manière efficace en fournissant des informations détaillées sur l'état du système au moment de la panne.&lt;/p&gt;

&lt;h2&gt;
  
  
  IV. &lt;u&gt;SELinux&lt;/u&gt; (&lt;em&gt;Security-Enhanced Linux&lt;/em&gt;)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ChatGPT
&lt;/h3&gt;

&lt;p&gt;SELinux, ou &lt;strong&gt;Security-Enhanced Linux&lt;/strong&gt;, est une technologie de sécurité qui vise à &lt;strong&gt;renforcer la sécurité des systèmes Linux en permettant un contrôle plus fin des politiques de sécurité &lt;em&gt;&lt;u&gt;au niveau du noyau&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;. Contrairement à la sécurité traditionnelle basée sur les permissions des utilisateurs et des groupes, SELinux utilise des &lt;strong&gt;&lt;em&gt;&lt;u&gt;politiques de sécurité basées sur le contrôle d'accès obligatoire (MAC)&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;, ce qui signifie que les décisions de sécurité sont prises en fonction de &lt;strong&gt;&lt;u&gt;règles&lt;/u&gt;&lt;/strong&gt; définies par l'administrateur système, indépendamment des autorisations attribuées aux utilisateurs et aux processus.&lt;/p&gt;

&lt;p&gt;En pratique, cela signifie que SELinux peut limiter les actions que les processus peuvent entreprendre en fonction de leur contexte de sécurité. Par exemple, même si un utilisateur dispose des autorisations pour modifier un fichier, SELinux peut &lt;em&gt;&lt;u&gt;empêcher un processus spécifique d'accéder à ce fichier en fonction de ses politiques de sécurité&lt;/u&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Bien que puissant, SELinux peut être complexe à configurer et à administrer en raison de sa nature granulaire. Cependant, il fournit un niveau de sécurité supplémentaire pour les systèmes Linux, ce qui en fait un outil précieux dans les environnements où la sécurité est une préoccupation majeure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pense à SELinux comme à un garde de sécurité très minutieux pour ton ordinateur. Il ne se contente pas de vérifier qui tu es (ton nom d'utilisateur), mais il &lt;strong&gt;&lt;u&gt;examine aussi ce que tu veux faire et où tu veux aller&lt;/u&gt;&lt;/strong&gt; sur ton ordinateur.&lt;/p&gt;

&lt;p&gt;Imagine que tu veuilles ouvrir un fichier. SELinux ne se contente pas de vérifier si tu as la permission de l'ouvrir en tant qu'utilisateur, il regarde aussi d'autres choses comme &lt;u&gt;&lt;em&gt;&lt;strong&gt;le type de fichier, le programme que tu utilises pour l'ouvrir&lt;/strong&gt;&lt;/em&gt;&lt;/u&gt;, et même d'autres détails. Cela lui permet de dire "Oui" ou "Non" à l'accès au fichier en fonction de règles très précises, même si ton utilisateur aurait normalement la permission de l'ouvrir.&lt;/p&gt;

&lt;p&gt;Donc, SELinux renforce la sécurité de ton ordinateur &lt;strong&gt;&lt;u&gt;en ajoutant une couche supplémentaire de contrôle très détaillé sur ce que les programmes peuvent faire&lt;/u&gt;&lt;/strong&gt;, pour s'assurer qu'ils ne font que ce qu'ils sont censés faire, même si quelque chose d'autre essaie de les manipuler.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Wikipedia
&lt;/h3&gt;

&lt;p&gt;Security-Enhanced Linux, abrégé SELinux, est un &lt;strong&gt;&lt;em&gt;Linux security module (LSM)&lt;/em&gt;&lt;/strong&gt;, qui permet de &lt;strong&gt;&lt;u&gt;&lt;em&gt;définir une politique de contrôle d'accès obligatoire aux éléments d'un système issu de Linux&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Son architecture dissocie l'application de la politique d'accès et sa définition. Il permet notamment de &lt;strong&gt;classer les applications d'un système en différents &lt;u&gt;groupes&lt;/u&gt;&lt;/strong&gt;, avec des niveaux d'accès plus fins. Il permet aussi d'&lt;strong&gt;attribuer un niveau de confidentialité pour l'accès à des &lt;u&gt;objets&lt;/u&gt; systèmes&lt;/strong&gt;, comme des descripteurs de fichiers, selon un &lt;strong&gt;modèle de sécurité &lt;u&gt;multiniveau&lt;/u&gt; (MLS pour Multi level Security)&lt;/strong&gt;. SELinux utilise le &lt;strong&gt;&lt;u&gt;&lt;em&gt;modèle Bell LaPadula&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt; complété par le mécanisme &lt;strong&gt;&lt;u&gt;&lt;em&gt;Type enforcement&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt; de contrôle de l'intégrité, développé par &lt;strong&gt;&lt;em&gt;SCC (SeCure Computing)&lt;/em&gt;&lt;/strong&gt;. Il s'agit d'un logiciel libre, certaines parties étant sous licences GNU GPL et BSD3.&lt;/p&gt;

&lt;h4&gt;
  
  
  Utilisation
&lt;/h4&gt;

&lt;p&gt;En pratique, la base de l'innovation est de définir des attributs étendus dans le système de fichiers. En plus de la notion de &lt;strong&gt;« droits de lecture, écriture, exécution »&lt;/strong&gt; pour un usager donné, SELinux définit pour chaque fichier ou processus :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un usager virtuel (ou collection de rôles) ;&lt;/li&gt;
&lt;li&gt;Un rôle ;&lt;/li&gt;
&lt;li&gt;Un contexte de sécurité.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les commandes « système » sont &lt;strong&gt;étendues&lt;/strong&gt; pour pouvoir manipuler ces objets et définir des &lt;strong&gt;&lt;em&gt;politiques&lt;/em&gt;&lt;/strong&gt; (règles d'accès), et des &lt;strong&gt;&lt;em&gt;statuts&lt;/em&gt;&lt;/strong&gt; (niveau de confidentialité). Par exemple la commande « &lt;strong&gt;ls -Z&lt;/strong&gt; » fait apparaître lesdits attributs étendus, soit :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-Z&lt;/span&gt; /etc/passwd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;donne le résultat suivant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-rw-r--r--  root root  system_u:object_r:etc_t  /etc/passwd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Une distribution Linux peut être livrée avec des politiques prédéfinies pour la totalité du système (&lt;strong&gt;mode strict&lt;/strong&gt;), ou une partie des services/applications (&lt;strong&gt;mode ciblé&lt;/strong&gt; ou &lt;strong&gt;targeted&lt;/strong&gt;). Le réglage d'un certain nombre de variables booléennes prédéfinies permet de personnaliser le comportement des applications correspondantes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Debian
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;selinux-basics selinux-policy-default selinux-utils

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  CentOS
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;policycoreutils policycoreutils-python selinux-policy selinux-policy-targeted libselinux-utils setroubleshoot-server setools setools-console mcstrans

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Modes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;u&gt;Enforcing (Appliquer)&lt;/u&gt;&lt;/strong&gt; : C'est le &lt;strong&gt;mode par défaut&lt;/strong&gt; dans lequel SELinux applique strictement les politiques de sécurité définies. Dans ce mode, SELinux &lt;strong&gt;&lt;u&gt;&lt;em&gt;bloque les actions qui ne sont pas autorisées par les politiques&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;, ce qui renforce la sécurité du système.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissive (Accorder une avertissement)&lt;/strong&gt; : Dans ce mode, SELinux &lt;strong&gt;&lt;u&gt;&lt;em&gt;ne bloque pas les actions qui violent les politiques de sécurité, mais il enregistre ces violations dans les journaux système&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;. Cela permet aux administrateurs de voir quelles actions seraient bloquées en mode Enforcing sans réellement les empêcher, ce qui peut être &lt;strong&gt;&lt;em&gt;utile pour déboguer les problèmes de sécurité potentiels sans interrompre le fonctionnement normal du système&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Disabled (Désactivé) : Dans ce mode, SELinux est &lt;strong&gt;&lt;u&gt;&lt;em&gt;complètement désactivé et ne s'applique pas du tout&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;. Toutes les politiques de sécurité SELinux sont ignorées, ce qui signifie que &lt;strong&gt;&lt;u&gt;&lt;em&gt;le contrôle d'accès obligatoire (MAC) n'est pas utilisé&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;. Bien que ce mode puisse être pratique pour résoudre des problèmes de compatibilité ou de performance, il est &lt;strong&gt;&lt;em&gt;moins sécurisé que les modes Enforcing et Permissive&lt;/em&gt;&lt;/strong&gt;, car il ne fournit aucune protection basée sur SELinux.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;SELinux s'integre tres bien avec Rocky OS plutot qu'avec Debian. Debian utilise plutot une autre technologie de securite Linux Security Module appelee &lt;strong&gt;AppArmor&lt;/strong&gt;, mais on peut utiliser SELinux sous Debian.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  V. &lt;u&gt;AppArmor&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fza7z1slqaf2g8h3hb30b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fza7z1slqaf2g8h3hb30b.png" alt="Image description" width="692" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ChatGPT
&lt;/h3&gt;

&lt;p&gt;AppArmor est un système de contrôle d'accès facultatif (DAC) qui vise à renforcer la sécurité des systèmes Linux en permettant aux administrateurs de définir des politiques de sécurité spécifiques pour les applications. Contrairement à SELinux, qui utilise un contrôle d'accès obligatoire (MAC), AppArmor utilise un modèle basé sur des profils pour spécifier quelles actions sont autorisées pour chaque application sur le système.&lt;/p&gt;

&lt;p&gt;Voici comment fonctionne AppArmor et comment il est utilisé :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Profils de sécurité :&lt;/strong&gt; AppArmor utilise des profils de sécurité pour définir les règles qui spécifient quelles ressources une application est autorisée à accéder et quelles actions elle est autorisée à effectuer. Ces profils sont généralement définis dans des fichiers de configuration texte qui décrivent les autorisations pour chaque application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Restrictions basées sur le chemin d'accès :&lt;/strong&gt; Les profils AppArmor peuvent inclure des règles qui limitent l'accès aux fichiers et aux répertoires en fonction de leur emplacement sur le système de fichiers. Par exemple, un profil AppArmor pour un serveur web peut spécifier que l'application est autorisée à lire des fichiers dans son répertoire de contenu web, mais pas à accéder aux fichiers système sensibles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contrôle des capacités :&lt;/strong&gt; AppArmor peut également limiter les capacités des applications, telles que la capacité à se connecter à un réseau, à ouvrir des sockets réseau, à modifier des fichiers système, etc. Cela permet de réduire les risques en limitant les actions potentiellement dangereuses que les applications peuvent effectuer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mode de fonctionnement :&lt;/strong&gt; AppArmor peut fonctionner en mode Enforcing, où il applique strictement les politiques de sécurité définies, ou en mode Audit, où il enregistre les violations des politiques de sécurité sans les bloquer effectivement. Cela permet aux administrateurs de surveiller les activités des applications et de corriger les politiques si nécessaire.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Utilité :&lt;/strong&gt; AppArmor est utile pour renforcer la sécurité des systèmes Linux en limitant les actions que les applications peuvent entreprendre, ce qui réduit les risques d'exploitation et de compromission du système. Il est souvent utilisé dans des environnements où la simplicité de configuration est préférée, comme les serveurs web, les serveurs de bases de données et les conteneurs Docker.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En résumé, AppArmor est un outil de sécurité flexible qui permet aux administrateurs de définir des politiques de sécurité spécifiques pour les applications sur les systèmes Linux, en limitant leurs accès aux ressources du système et en réduisant les risques de sécurité.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wikipedia
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AppArmor (Application Armor)&lt;/strong&gt; est un logiciel de sécurité pour Linux édité sous Licence publique générale GNU.&lt;/p&gt;

&lt;p&gt;AppArmor permet à l'administrateur système d'associer à chaque programme un profil de sécurité qui restreint ses accès au système d'exploitation. Il complète le traditionnel modèle d'Unix du &lt;strong&gt;&lt;em&gt;contrôle d'accès discrétionnaire (DAC, Discretionary access control)&lt;/em&gt;&lt;/strong&gt; en permettant d'utiliser le &lt;strong&gt;&lt;em&gt;contrôle d'accès obligatoire (MAC, Mandatory access control)&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;En plus des profils de spécifications manuels, AppArmor comprend un &lt;strong&gt;mode d'apprentissage (learning mode)&lt;/strong&gt;, où toutes les &lt;u&gt;transgressions&lt;/u&gt; au profil sont &lt;strong&gt;&lt;em&gt;&lt;u&gt;enregistrées, mais pas empêchées&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;. Ce fichier de suivi peut alors être incorporé au profil, se fondant alors sur le comportement typique du programme.&lt;/p&gt;

&lt;p&gt;AppArmor est &lt;strong&gt;&lt;u&gt;&lt;em&gt;mis en place au sein du noyau Linux au moyen de l'interface de sécurité du noyau, LSM (Linux Security Modules)&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;AppArmor a été créé en partie comme une &lt;em&gt;alternative à SELinux&lt;/em&gt;, critiqué pour être difficile à paramétrer et à maintenir par les administrateurs. À la différence de SELinux, qui s'appuie sur l'application d'indicateurs aux fichiers, &lt;strong&gt;AppArmor travaille avec les &lt;u&gt;chemins&lt;/u&gt;&lt;/strong&gt;. Les partisans d'AppArmor disent que c'est moins complexe et plus facile pour l'utilisateur moyen que d'apprendre SELinux. Ils prétendent aussi qu'AppArmor demande moins de modifications pour fonctionner avec les systèmes existants ; par exemple, SELinux demande d'utiliser un système de fichiers qui prend en charge les attributs étendus pour les fichiers, et &lt;strong&gt;&lt;em&gt;ne peut donc pas gérer le contrôle d'accès pour les fichiers montés avec NFS&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Initialement développé par &lt;strong&gt;&lt;em&gt;Crispin Cowan&lt;/em&gt;&lt;/strong&gt; de la société Immunix, AppArmor fut repris par &lt;strong&gt;&lt;em&gt;Novell&lt;/em&gt;&lt;/strong&gt; lorsque cette dernière racheta Immunix. Novell abandonna cependant le projet et licencia les développeurs d'AppArmor. Canonical en a repris le développement et &lt;strong&gt;AppArmor est intégré au noyau Linux depuis la version 2.6.364&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AppArmor est installé par défaut sur &lt;u&gt;Debian&lt;/u&gt;, openSUSE, Ubuntu et Parrot OS&lt;/strong&gt;. Il est disponible sur Annvix, Arch Linux, Gentoo, Mandriva, NixOS, Pardus Linux et PLD.&lt;/p&gt;

&lt;h3&gt;
  
  
  AppArmor VS SELinux
&lt;/h3&gt;

&lt;p&gt;Bien qu'ils partagent un objectif commun, SELinux et AppArmor diffèrent dans leurs approches de mise en œuvre et dans la manière dont ils définissent et appliquent les politiques de sécurité.&lt;/p&gt;

&lt;h4&gt;
  
  
  SELinux
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmiiy78qecvyfc6hub0y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmiiy78qecvyfc6hub0y.png" alt="SELinux" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SELinux utilise un &lt;strong&gt;&lt;em&gt;contrôle d'accès obligatoire (MAC)&lt;/em&gt;&lt;/strong&gt; basé sur des &lt;strong&gt;&lt;em&gt;&lt;u&gt;règles&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Avec SELinux, les données qui sont inaccessibles peuvent devenir accessibles lorsque les applications mettent à jour le fichier en le remplaçant par une nouvelle version.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  AppArmor
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F893r1cngu9gwdidsvg4v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F893r1cngu9gwdidsvg4v.png" alt="AppArmor" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AppArmor utilise un modèle de &lt;strong&gt;&lt;em&gt;contrôle d'accès facultatif (DAC)&lt;/em&gt;&lt;/strong&gt; basé sur des &lt;strong&gt;&lt;em&gt;&lt;u&gt;profils&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Avec AppArmor, un fichier qui est inaccessible peut devenir accessible quand un lien est créé, alors que SELinux interdira l'accès à travers le nouveau lien créé&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  VI. &lt;u&gt;Partition disque&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;En informatique, une partition, région ou un disque est une section d'un support de stockage (disque dur, SSD, carte-mémoire...). Le partitionnement est l'opération qui consiste à diviser ce support en partitions dans lesquelles le système d'exploitation peut gérer les informations de manière séparée, généralement en y créant un système de fichiers, une manière d’organiser l’espace disponible.&lt;/p&gt;

&lt;p&gt;les systèmes Unix ou Gnu/Linux, les désignent par un identifiant sous la forme &lt;strong&gt;sdXN&lt;/strong&gt;, avec &lt;strong&gt;X une lettre représentant le support&lt;/strong&gt; et &lt;strong&gt;N le numéro de la partition sur le support&lt;/strong&gt; (par exemple &lt;strong&gt;sdb3&lt;/strong&gt; pour la &lt;strong&gt;troisième partition du disque b&lt;/strong&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Utilité
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Résilience
&lt;/h4&gt;

&lt;p&gt;Le partitionnement propose également d’autres avantages que la &lt;strong&gt;rapidité d’accès aux données&lt;/strong&gt;. Imaginons un disque non-partitionné, celui-ci est considéré par le système d’exploitation comme une seule et unique unité. &lt;/p&gt;

&lt;p&gt;Cette unité contiendrait votre installation Linux (ou n’importe quel autre système d’exploitation), vos logiciels, vos fichiers, les logs de vos applications, vos fichiers binaires. &lt;/p&gt;

&lt;p&gt;Dans le cadre d’un serveur, imaginons que suite à une attaque virale, un crash Linux, ou toute autre raison vous deviez réinstaller le système d’exploitation. &lt;/p&gt;

&lt;p&gt;Dans le cadre d’une réinstallation de système d’exploitation, le plus souvent le formatage de disque sur lequel se trouve l’installation actuelle est inévitable. Seulement, ce formatage a pour effet de supprimer toutes les données présentes sur la partition, et ce de manière irréversible si vous n’avez réalisé aucune sauvegarde. La partitionnement permet de remédier à ce problème, il suffit de réserver une partition à son système d’exploitation, ainsi, &lt;strong&gt;si une réinstallation est nécessaire, celle-ci n’effacera que les données sur cette partition&lt;/strong&gt;, et conservera les données des autres partitions. Et ce même si elles se trouvent sur un même disque physique. &lt;/p&gt;

&lt;p&gt;En plus de cela, le partitionnement propose &lt;strong&gt;beaucoup d’avantages en termes de sécurité&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Sécurité et bonnes pratiques sur un système Linux
&lt;/h4&gt;

&lt;p&gt;La sécurité est un aspect capital de la gestion des systèmes d’informations, beaucoup de serveurs utilisent l’OS Linux et le partitionnement peut aider à les sécuriser.&lt;/p&gt;

&lt;p&gt;Les lignes qui suivent sont tirées des &lt;strong&gt;mesures de sécurités&lt;/strong&gt; recommandées par l’ANSSI pour les systèmes Linux.&lt;/p&gt;

&lt;p&gt;Il est usuel de réserver des partitions dédiées aux services pouvant générer beaucoup de volumétrie afin d’&lt;strong&gt;éviter de saturer les partitions système&lt;/strong&gt;. L’espace à réserver pour chaque partition dépend des cas d’usage : un serveur de fichiers aura besoin d’une volumétrie importante pour &lt;strong&gt;/srv&lt;/strong&gt; ou &lt;strong&gt;/var/ftp/&lt;/strong&gt;, tandis qu’un serveur de journaux sera plutôt concerné par la volumétrie utilisable pour &lt;strong&gt;/var/log&lt;/strong&gt;.&amp;gt;&lt;/p&gt;

&lt;p&gt;Le partitionnement doit ainsi permettre de &lt;strong&gt;protéger et d’isoler les différents composants du système&lt;/strong&gt; de fichiers. Il est par défaut souvent insatisfaisant.&lt;/p&gt;

&lt;p&gt;Il faut noter que suivant les systèmes et distributions, certaines des options de montage ne seront pas applicables transitoirement; par exemple des utilitaires, installeurs ou produits estimeront que les fichiers écrits dans &lt;strong&gt;/tmp&lt;/strong&gt; ou &lt;strong&gt;/var&lt;/strong&gt; peuvent être exécutables. Dans ces cas exceptionnels il est nécessaire d’adapter le partitionnement. Un de ceux les plus fréquemment rencontrés est celui des distributions dérivées de Debian dont le &lt;strong&gt;/var/lib/dpkg&lt;/strong&gt; nécessite des droits d’exécution. &lt;/p&gt;

&lt;p&gt;Une alternative est d’implémenter une procédure de maintenance durant laquelle les mises à jour sont installées, à l’image de ce que l’on trouve sur d’autres systèmes d’exploitation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvffre8mjn95qqb1joiy7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvffre8mjn95qqb1joiy7.png" alt="Image description" width="565" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;À noter : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La partition &lt;strong&gt;/boot&lt;/strong&gt; contient notamment &lt;em&gt;&lt;strong&gt;le noyau de démarrage&lt;/strong&gt;&lt;/em&gt; et des fichiers dans ce dossier sont souvent parcouru par différents programmes malveillants afin de construire plus facilement des « exploits » de code noyau.&lt;/li&gt;
&lt;li&gt;Lorsque c’est possible, la partition &lt;strong&gt;/boot&lt;/strong&gt; &lt;strong&gt;&lt;em&gt;ne doit pas être montée automatiquement&lt;/em&gt;&lt;/strong&gt;. Dans tous les cas, l’accès au dossier /boot doit être &lt;strong&gt;&lt;em&gt;uniquement autorisé pour l’&lt;u&gt;utilisateur root&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Autres utilités
&lt;/h4&gt;

&lt;p&gt;Le partitionnement de disque peut également être utile dans le cadre de la mise en place d’un chiffrement au repos de votre disque dur.&lt;/p&gt;

&lt;h2&gt;
  
  
  VII. &lt;u&gt;LVM&lt;/u&gt; (&lt;em&gt;Logical Volume Management&lt;/em&gt;)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Comment fonctionne le partitionnement sur Linux avec LVM ?
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Mais LVM dans tout ça, à quoi ça sert ?
&lt;/h4&gt;

&lt;p&gt;LVM est un &lt;strong&gt;gestionnaire de volumes logiques pour le noyau Linux&lt;/strong&gt;. Le but de LVM est de fournir une couche d'abstraction entre l'&lt;strong&gt;espace de stockage physique et le système&lt;/strong&gt; : il permet de créer des &lt;strong&gt;&lt;em&gt;« partitions virtuelles »&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;&lt;u&gt;faciles à gérer&lt;/u&gt;&lt;/em&gt; (changements de taille, création et suppression...).&lt;/p&gt;

&lt;p&gt;Les éléments qui composent LVM sont (4):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Les volumes physiques (PV)&lt;/strong&gt; : ce sont les &lt;strong&gt;espaces de stockage traditionnels&lt;/strong&gt; (disques, partitions, éventuellement des fichiers montés en &lt;u&gt;loopback&lt;/u&gt;), &lt;u&gt;sur lesquels LVM crée ses volumes logiques&lt;/u&gt;. Il comprend un &lt;strong&gt;&lt;u&gt;en-tête spécial &lt;/u&gt;&lt;/strong&gt;et &lt;strong&gt;&lt;u&gt;se divise en blocs physiques&lt;/u&gt;&lt;/strong&gt; (extents).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Les groupes de volumes (VG)&lt;/strong&gt; : Ce sont des &lt;strong&gt;groupes de volumes physiques (PV) réunis par LVM en un seul &lt;em&gt;&lt;u&gt;« disque virtuel »&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;. Un groupe de volumes &lt;em&gt;&lt;u&gt;contient des volumes logiques&lt;/u&gt;&lt;/em&gt;, ceux-ci sont répartis par LVM de manière transparente sur les différents volumes physiques : un volume logique peut même être &lt;strong&gt;&lt;em&gt;dispersé à travers les disques disponibles&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Les volumes logiques (LV)&lt;/strong&gt; : ce sont des &lt;strong&gt;« partitions virtuelles »&lt;/strong&gt; (logiques parce qu'elles sont &lt;strong&gt;&lt;em&gt;produites par un logiciel sans forcément correspondre à une portion d'un disque matériel&lt;/em&gt;&lt;/strong&gt;). Les volumes logiques sont &lt;strong&gt;&lt;em&gt;constitués d'étendues de blocs physiques réunis en un seul espace de stockage&lt;/em&gt;&lt;/strong&gt; et rendus lisibles par le système. On peut les utiliser comme des partitions ordinaires.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Étendue physique (PE)&lt;/strong&gt; : un petit bloc de disques (en général de &lt;strong&gt;4 Mo&lt;/strong&gt;) qui &lt;strong&gt;peut être affecté à un &lt;u&gt;volume logique&lt;/u&gt;&lt;/strong&gt;. Les étendues physiques se comportent &lt;strong&gt;&lt;em&gt;&lt;u&gt;comme les secteurs ou les cylindres des disques durs physiques&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Étendue Logique (LE)&lt;/strong&gt; : Les Logical Volumes sont divisés en Logical Extents, qui sont de taille égale aux Physical Extents. Les LE sont l'unité de base pour la création et l'allocation de l'espace dans un Logical Volume.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Prise en main de l'outil LVM
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Scenario
&lt;/h4&gt;

&lt;p&gt;Il est fort probable qu'on a déja rencontré le message &lt;strong&gt;"manque d'espace disque"&lt;/strong&gt;, et alors on doit commencer à passer en revue les téléchargements, supprimer tous les gros fichiers, supprimer les jeux ou autres. On doit penser à l'expansion de disque ! &lt;/p&gt;

&lt;p&gt;Alors, doit t-on ajouter un autre disque dur, y monter une partition personnelle et commencer à y déplacer des fichiers, ou doit t-on acheter un disque plus grand, copier toutes les partitions, puis étendre les partitions ?&lt;/p&gt;

&lt;p&gt;L'un des meilleurs choix que à faire est d'&lt;strong&gt;installer la distribution Linux sur une partition LVM&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Lorsque vous vous renseignez pour la première fois des informations sur LVM, cela ressemble un peu à une &lt;strong&gt;matrice RAID (&lt;em&gt;Redundant Array of Independent Disks&lt;/em&gt; ou &lt;em&gt;Matrice redondante de disques indépendants en français&lt;/em&gt;)&lt;/strong&gt; où on a plusieurs disques et où les données sont réparties sur ces disques d'une manière ou d'une autre. Cependant, LVM ne fournit aucune redondance, mais cela étend bien les partitions sur plusieurs disques physiques, comme le RAID. Et ce que l'on peut faire, c'est &lt;strong&gt;continuer à ajouter des disques pour continuer à étendre cette partition à la volée&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Quelques commandes basiques pour commencer à s’amuser avec LVM:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Note : Exécutez toutes les commandes en tant que root (en utilisant sudo) ou cela ne fonctionnera pas.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Exemple&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;lvs
&lt;span class="c"&gt;# Permet de voir quels groupes de volumes sont sur le système&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La commande la plus basique de LVM est l’&lt;strong&gt;affichage des différents volumes et groupes&lt;/strong&gt;, pour cela nous disposons de :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;pvs&lt;/strong&gt; : Afficher les détails succincts des &lt;strong&gt;&lt;em&gt;volumes physiques&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vgs&lt;/strong&gt; : Afficher les détails succincts des &lt;strong&gt;&lt;em&gt;groupes de volumes&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;lvs&lt;/strong&gt; : Afficher les détails succincts des &lt;strong&gt;&lt;em&gt;volumes logiques&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;fdisk &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;span class="c"&gt;# Permet d'afficher les noms de partition (ex : /dev/sdXX)&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;lvdisplay
&lt;span class="c"&gt;# Permet de trouver où se trouve le chemin d'accès au volume physique&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Pour étendre les partitions à un nouveau lecteur
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Créer une partition LVM vide sur le nouveau disque avec &lt;strong&gt;fdisk&lt;/strong&gt; ou &lt;strong&gt;gparted&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Créer un volume physique sur le nouveau disque avec &lt;strong&gt;pvcreate /dev/sdXX-&lt;/strong&gt; On peut vérifier le nom de la nouvelle partition avec &lt;code&gt;sudo pvs&lt;/code&gt; qui devrait avoir une entrée vide sous &lt;strong&gt;VG&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Étendre le groupe de volume au nouveau disque avec &lt;strong&gt;vgextend my-virtual-group /dev/sdXX&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Étendre le volume logique et redimensionnez la partition à l'intérieur avec &lt;strong&gt;lvextend -l +100%FREE -r /dev/my-virtual-group/root&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NOTE : On peut changer la valeur de +100%FREE
en fonction de l'espace que l'on veut que
le nouveau volume logique prenne sur le nouveau disque.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemple 1 :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;lvextend &lt;span class="nt"&gt;-l&lt;/span&gt; +50%FREE r /dev/my-virtual-group/root
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemple 2 : éxtension d'une taille spécifique (+10G l'étend de 10 gigaoctets)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;lvextend &lt;span class="nt"&gt;-L&lt;/span&gt; +10G &lt;span class="nt"&gt;-r&lt;/span&gt; /dev/my-virtual-group/root
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;On peut également utiliser &lt;u&gt;+500M&lt;/u&gt; pour &lt;u&gt;500 Mégaoctets&lt;/u&gt; et ainsi de suite.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NOTE : Si on spécifie des tailles, la commande
passe de -l minuscule à -L majuscule après lvextend.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  VIII. &lt;u&gt;aptitude et apt&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;Sur le système Debian, les &lt;strong&gt;opérations de gestion des paquets basées sur les dépôts&lt;/strong&gt; peuvent être réalisées à l’aide de nombreux outils de gestion de paquets basés sur &lt;strong&gt;APT (Advanced Package Tool)&lt;/strong&gt; et disponibles dans le système Debian. Nous décrirons ici les outils de base de gestion des paquets : &lt;strong&gt;apt&lt;/strong&gt;, &lt;strong&gt;apt-get/apt-cache&lt;/strong&gt; et &lt;strong&gt;aptitude&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pour les opérations de gestion des paquets qui concernent l’installation des paquets ou les mises à jour des métadonnées des paquets, vous aurez besoin des privilèges de l’administrateur.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. apt comparé à apt-get / apt-cache comparé à aptitude
&lt;/h3&gt;

&lt;h4&gt;
  
  
  a. aptitude (non recommandée)
&lt;/h4&gt;

&lt;p&gt;⛔ Avertissements :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Non recommandée pour une mise à niveau du système entre versions sur le système Debian &lt;u&gt;stable&lt;/u&gt;&lt;/strong&gt; après la sortie d'une nouvelle version.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L'utilisation de &lt;code&gt;apt full-upgrade&lt;/code&gt; ou &lt;code&gt;apt-get dist-upgrade&lt;/code&gt; est recommandée pour cela.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Elle suggère parfois la &lt;strong&gt;&lt;em&gt;suppression massive de paquets lors de la mise à niveau du système&lt;/em&gt;&lt;/strong&gt; sur des systèmes Debian en &lt;strong&gt;&lt;u&gt;testing&lt;/u&gt;&lt;/strong&gt; ou &lt;strong&gt;&lt;u&gt;unsable&lt;/u&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cela est principalement causé par un &lt;strong&gt;biais de version parmi des paquets&lt;/strong&gt; dépendants de, ou recommandés par, un méta-paquet tel que &lt;strong&gt;gnome-core&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Solution :

&lt;ul&gt;
&lt;li&gt;1. Sélecionner &lt;strong&gt;&lt;em&gt;Annuler les actions en attente&lt;/em&gt;&lt;/strong&gt; dans le menu de commande d'&lt;strong&gt;aptitude&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;2. Quitter &lt;strong&gt;aptitude&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;3. Utiliser la commande &lt;code&gt;apt full-upgrade&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elle nécessite plus de ressources matérielles. Elle consomme plus de mémoire et fonctionne moins rapidement.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Avantages :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Interface utilisateur interactive en &lt;strong&gt;plein écran&lt;/strong&gt; en &lt;strong&gt;mode texte&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interface utilisateur en &lt;strong&gt;ligne de commandes&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mieux adapté pour la &lt;strong&gt;gestion interactive journalière des paquets&lt;/strong&gt; &lt;em&gt;(ex : vérification des paquets installés, recherce de paquets disponibles)&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recherche avancée basée sur des &lt;em&gt;expressions rationnelles&lt;/em&gt;&lt;/strong&gt; pour la recherche sur toutes les métadonnées des paquets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gestion des versions multiples des paquets&lt;/strong&gt; sans utiliser &lt;strong&gt;/etc/apt/preferences&lt;/strong&gt;. Assez intuitif.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  b. apt-get et apt-cache
&lt;/h4&gt;

&lt;p&gt;Ces commandes sont les outils les plus basiques de gestion des paquets basés sur &lt;strong&gt;&lt;em&gt;APT (Advanced Package Tool)&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Elles n'offrent qu'une &lt;strong&gt;interface utilisateur en ligne de commande&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elles peuvent &lt;strong&gt;gérer des versions multiples des paquets&lt;/strong&gt; en utilisant &lt;strong&gt;&lt;em&gt;/etc/apt/preferences&lt;/em&gt;&lt;/strong&gt; mais est &lt;strong&gt;&lt;u&gt;assez lourd&lt;/u&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;apt-get&lt;/strong&gt; est &lt;strong&gt;mieux adapté pour les mises à jour majeures du système&lt;/strong&gt; entre les versions, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;apt-get&lt;/strong&gt; offre un &lt;strong&gt;système de résolution des dépendances entre paquets robuste&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;apt-get&lt;/strong&gt; nécessite &lt;strong&gt;moins de ressources matérielles&lt;/strong&gt;. Il &lt;strong&gt;consomme moins de mémoire&lt;/strong&gt; et &lt;strong&gt;fonctionne plus rapidement&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;apt-cache&lt;/strong&gt; offre une &lt;strong&gt;recherche basée sur des &lt;em&gt;&lt;u&gt;expressions rationnelles standard&lt;/u&gt;&lt;/em&gt; sur les &lt;em&gt;&lt;u&gt;noms&lt;/u&gt;&lt;/em&gt; et les &lt;em&gt;&lt;u&gt;descriptions des paquets&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  c. apt (fortement recommandée)
&lt;/h4&gt;

&lt;p&gt;Cette commande est une &lt;strong&gt;&lt;em&gt;&lt;u&gt;interface de haut niveau&lt;/u&gt;&lt;/em&gt; en ligne de commande pour la gestion de paquets&lt;/strong&gt;. C'est basiquement une &lt;strong&gt;enveloppe d'apt-get, d'apt-cache et de commandes similaires&lt;/strong&gt;, originellement destinée comme &lt;strong&gt;interface d'utilisateur final&lt;/strong&gt;, et &lt;strong&gt;&lt;em&gt;active quelques options mieux adaptées par défaut à un usage interactif&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Elle fournit une &lt;strong&gt;&lt;u&gt;barre de progression&lt;/u&gt;&lt;/strong&gt; plaisante lors de l'installation de paquets avec &lt;code&gt;apt install&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elle &lt;strong&gt;supprimera par défaut les paquets &lt;em&gt;&lt;u&gt;.deb&lt;/u&gt;&lt;/em&gt; mis en cache&lt;/strong&gt; après une utilisation réussie de paquets téléchargés.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4eujzx87647rhh7tbnz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4eujzx87647rhh7tbnz.png" alt="Image description" width="502" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Opérations de base de gestion des paquets en ligne de commandes
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7cntikf1f9sgljtygnrr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7cntikf1f9sgljtygnrr.png" alt="Image description" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;apt/apt-get et aptitude peuvent mélangées sans inconvénients majeurs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;« &lt;strong&gt;&lt;em&gt;aptitude why expression-rationnelle&lt;/em&gt;&lt;/strong&gt; » peut afficher plus d’informations par « &lt;strong&gt;&lt;em&gt;aptitude -v why expression_rationnelle&lt;/em&gt;&lt;/strong&gt; ». On peut obtenir des informations similaires par «&lt;strong&gt;&lt;em&gt;apt rdepends paquet&lt;/em&gt;&lt;/strong&gt;» ou «&lt;strong&gt;&lt;em&gt;apt-cache rdepends paquet&lt;/em&gt;&lt;/strong&gt;».&lt;/p&gt;

&lt;p&gt;Lorsque la commande &lt;strong&gt;aptitude&lt;/strong&gt; est lancée en mode ligne de commande, et rencontre des problèmes tels que des conflits de paquets, on peut passer en mode plein écran en pressant ensuite la touche &lt;strong&gt;e&lt;/strong&gt; à l'invite de commande.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1o1j94rt52dcrxjcdwkn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1o1j94rt52dcrxjcdwkn.png" alt="Image description" width="800" height="92"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Les options importantes de la commande &lt;em&gt;&lt;u&gt;aptitude&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option de la commande&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-s&lt;/td&gt;
&lt;td&gt;Simuler le résultat de la commande.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-d&lt;/td&gt;
&lt;td&gt;Télécharger seulement les paquets sans les installer ni les mettre à jour.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-D&lt;/td&gt;
&lt;td&gt;Afficher une courte explication avant les installations ou les suppressions automatiques.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE : Consultez aptitude(8) et le « manuel de l’utilisateur d’aptitude » à « /usr/share/doc/aptitude/README » pour en apprendre davantage.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. Utilisation interactive d’aptitude
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;aptitude &lt;span class="nt"&gt;-u&lt;/span&gt;
&lt;span class="c"&gt;# Permet de mettre à jour la copie locale des informations&lt;/span&gt;
&lt;span class="c"&gt;# de l'archive et afficher la liste des paquets en plein&lt;/span&gt;
&lt;span class="c"&gt;# écran avec un menu.&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; aptitude ...
&lt;span class="c"&gt;# Permet d'utiliser la configuration de l'administrateur.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fichier de configuration d'aptitude : &lt;strong&gt;~/.aptitude/config&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcjfk84fco0ks57f96ty7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcjfk84fco0ks57f96ty7.png" alt="Image description" width="800" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Raccourcis clavier d’aptitude
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xs87urkm1ttnp9o54zk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xs87urkm1ttnp9o54zk.png" alt="Image description" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L’indication du nom de fichier sur la ligne de commandes et à l’invite du menu après avoir pressé « &lt;strong&gt;l&lt;/strong&gt; » et « &lt;strong&gt;//&lt;/strong&gt; » prend l’expression rationnelle d’aptitude telle que décrite ci-dessous.&lt;/p&gt;

&lt;p&gt;Une expression rationnelle d’aptitude peut &lt;strong&gt;correspondre explicitement à un nom de paquet&lt;/strong&gt; en utilisant une chaîne de caractères commençant par « &lt;strong&gt;~n&lt;/strong&gt; » et suivie du nom de paquet.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Vues des paquets sous aptitude
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;idA   libsmbclient    -2220kB 3.0.25a-1  3.0.25a-2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  a. &lt;strong&gt;1ère lettre&lt;/strong&gt; : indicateur de l'&lt;strong&gt;état actuel&lt;/strong&gt;.
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;i&lt;/strong&gt; : &lt;strong&gt;&lt;em&gt;Installé&lt;/em&gt;&lt;/strong&gt;. Le paquet est actuellement installé sur le système.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;p&lt;/strong&gt; : &lt;strong&gt;&lt;em&gt;Purgeable&lt;/em&gt;&lt;/strong&gt;. Le paquet est installé mais marqué comme étant complètement supprimable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;v&lt;/strong&gt; : &lt;strong&gt;&lt;em&gt;Virtuel&lt;/em&gt;&lt;/strong&gt;. Le paquet est virtuel, ce qui signifie qu'il représente un groupe de paquets mais n'est pas en soi installable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;c&lt;/strong&gt; : &lt;strong&gt;&lt;em&gt;Configuré&lt;/em&gt;&lt;/strong&gt;. Le paquet est configuré, mais des fichiers de configuration supplémentaires peuvent être présents.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;u&lt;/strong&gt; : &lt;strong&gt;Non installé&lt;/strong&gt;. Le paquet n'est pas installé sur le système.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;B&lt;/strong&gt; : &lt;strong&gt;&lt;em&gt;Brisé&lt;/em&gt;&lt;/strong&gt;. Le paquet est partiellement installé ou configuré, mais ne peut pas fonctionner correctement.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  b. &lt;strong&gt;2ème lettre&lt;/strong&gt; : indicateur d'&lt;strong&gt;action prévue&lt;/strong&gt;.
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;i&lt;/strong&gt; : &lt;strong&gt;&lt;em&gt;Installer&lt;/em&gt;&lt;/strong&gt;. Le paquet est marqué pour installation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;d&lt;/strong&gt; : &lt;strong&gt;&lt;em&gt;Supprimer&lt;/em&gt;&lt;/strong&gt;. Le paquet est marqué pour suppression.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;p&lt;/strong&gt; : &lt;strong&gt;&lt;em&gt;Purger&lt;/em&gt;&lt;/strong&gt;. Le paquet est marqué pour une suppression complète.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;h&lt;/strong&gt; : &lt;strong&gt;&lt;em&gt;Tenir&lt;/em&gt;&lt;/strong&gt;. Le paquet est marqué pour être maintenu dans son état actuel sans être mis à jour.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;v&lt;/strong&gt; : &lt;strong&gt;&lt;em&gt;Virtuel&lt;/em&gt;&lt;/strong&gt;. Le paquet est un paquet virtuel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;C&lt;/strong&gt; : &lt;strong&gt;&lt;em&gt;Nettoyer&lt;/em&gt;&lt;/strong&gt;. Le paquet est marqué pour être nettoyé de tout résidu inutile sur le système.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;U&lt;/strong&gt; : &lt;strong&gt;&lt;em&gt;Mettre à niveau&lt;/em&gt;&lt;/strong&gt;. Le paquet est marqué pour être mis à niveau vers une version plus récente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  c. &lt;strong&gt;3ème lettre&lt;/strong&gt; : indicateur &lt;strong&gt;automatique&lt;/strong&gt;.
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A&lt;/strong&gt; : &lt;strong&gt;&lt;em&gt;Automatique&lt;/em&gt;&lt;/strong&gt;. Le paquet a été installé automatiquement en tant que dépendance d'un autre paquet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  d. Nom du paquet.
&lt;/h5&gt;

&lt;h5&gt;
  
  
  e. Modification de l’utilisation du disque attribuée à l’« &lt;strong&gt;action prévue&lt;/strong&gt; »
&lt;/h5&gt;

&lt;h5&gt;
  
  
  f. Version actuelle du paquet
&lt;/h5&gt;

&lt;h5&gt;
  
  
  g. Version candidate du paquet
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmj5440ahnyeedxqhehz7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmj5440ahnyeedxqhehz7.png" alt="Image description" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Options de la méthode de recherche avec aptitude
&lt;/h3&gt;

&lt;h4&gt;
  
  
  a. &lt;u&gt;Ligne de commande du shell.&lt;/u&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;aptitude search 'expression_rationnelle_aptitude&lt;/code&gt; : permet d'afficher l'état d'installation, le nom du paquet et une courte description des paquets correspondants.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;aptitude show 'nom_paquet&lt;/code&gt; : permet d'afficher la description détaillée du paquet.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  b. &lt;u&gt;Mode interactif plein écran.&lt;/u&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;l&lt;/strong&gt; : limiter la vue des paquets à ceux qui correspondent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;/&lt;/strong&gt; : rechercher un paquet correspondant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;*&lt;em&gt;*&lt;/em&gt; : rechercher en arrière un paquet correspondant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;n&lt;/strong&gt; : rechercher le suivant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;N&lt;/strong&gt; : rechercher le suivant (en arrière).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ovqxxjup7qj2xswb5x3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ovqxxjup7qj2xswb5x3.png" alt="Image description" width="800" height="73"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Les formules d’expressions rationnelles d’aptitude &lt;em&gt;(Extended Rational Expression ou ERE)&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8w2eukdv8y441hdpu5b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8w2eukdv8y441hdpu5b.png" alt="Image description" width="800" height="821"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0okz61j8m810oz8f5t9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0okz61j8m810oz8f5t9p.png" alt="Image description" width="497" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Résolution des dépendances par aptitude
&lt;/h3&gt;

&lt;p&gt;La sélection d'un paquet dans &lt;strong&gt;aptitude&lt;/strong&gt; récupère non seulement les paquets définis dans son champ "&lt;strong&gt;Depends:&lt;/strong&gt;" mais aussi ceux définis dans le champ "&lt;strong&gt;Recommends:&lt;/strong&gt;" si la configuration a été faite dans ce sens dans le menu "&lt;strong&gt;F10 -&amp;gt; Options -&amp;gt; Préférences -&amp;gt; Gestion des dépendances&lt;/strong&gt;".&lt;/p&gt;

&lt;p&gt;Ces paquets &lt;u&gt;installés automatiquement&lt;/u&gt; seront &lt;strong&gt;&lt;u&gt;supprimés automatiquement&lt;/u&gt;&lt;/strong&gt; s'ils ne sont plus nécessaires sous &lt;strong&gt;aptitude&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Le drapeau contrôlant le comportement &lt;code&gt;auto install&lt;/code&gt; de la commande &lt;strong&gt;aptitude&lt;/strong&gt; peut aussi être manipulé en utilisant la commande &lt;strong&gt;apt-mark&lt;/strong&gt; du paquet &lt;strong&gt;apt&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  9. Journaux d’activité des paquets
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fichier&lt;/th&gt;
&lt;th&gt;Contenu&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;/var/log/dpkg.log&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enregistrement des actions au niveau de &lt;strong&gt;dpkg&lt;/strong&gt; pour l'activité de tous les paquets.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;/var/log/apt/term.log&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Journal de l'activité générique d'APT.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;/var/log/aptitude&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Journal des actions de la commande &lt;strong&gt;aptitude&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  IX. &lt;u&gt;SSH&lt;/u&gt; (Secure SHell)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjhmx8ytzvt96wtdn0tw4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjhmx8ytzvt96wtdn0tw4.png" alt="Image description" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Souvent utilisé dans le domaine de la cybersécurité.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Méthode sécurisée d'accès à distance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Qu'est-ce que le SSH ?
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Le &lt;strong&gt;&lt;u&gt;protocole&lt;/u&gt; Secure SHell&lt;/strong&gt; est un &lt;em&gt;&lt;u&gt;standard de sécurité&lt;/u&gt;&lt;/em&gt; utilisé pour échanger des données de manière sécurisée sur un réseau, notamment sur Internet. Il &lt;strong&gt;&lt;em&gt;garantit la confidentialité des données&lt;/em&gt;&lt;/strong&gt; en les cryptant avant de les transmettre.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Remplaçant de Telnet non chiffré.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Utilise des &lt;strong&gt;&lt;em&gt;techniques cryptographiques&lt;/em&gt;&lt;/strong&gt; pour s'assurer que toutes les &lt;strong&gt;communications&lt;/strong&gt; vers/depuis le serveur distant se produisent de manière &lt;strong&gt;chiffrée&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il fournit un mécanisme pour :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Authentifier un utilisateur distant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transférer les entrées du client vers l'hôte.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Relayer la sortie vers le client.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On peut &lt;strong&gt;&lt;em&gt;exécuter des commandes shell&lt;/em&gt;&lt;/strong&gt; de la même manière que l'on le faisait si on était en train d'utiliser physiquement l'ordinateur distant.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3o42a9q14f85t9y0n7i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3o42a9q14f85t9y0n7i.png" alt="Image description" width="653" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Fonctionnement de SSH.
&lt;/h3&gt;

&lt;p&gt;Si on utilise Linux ou Mac, l'utilisation de SSH est très simple. Si on utilise un système d'exploitation Windows, on doit utiliser des &lt;strong&gt;&lt;em&gt;outils Windows de connexion SSH&lt;/em&gt;&lt;/strong&gt;. Le client SSH le plus populaire est &lt;strong&gt;&lt;em&gt;&lt;u&gt;PuTTY&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La commande SSH se compose de 3 parties distinctes :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ssh &lt;span class="o"&gt;{&lt;/span&gt;user&lt;span class="o"&gt;}&lt;/span&gt;@&lt;span class="o"&gt;{&lt;/span&gt;host&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cette commande indique au système que l'on souhaite ouvrir une connexion Secure SHell cryptée.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;{user}&lt;/strong&gt; : compte auquel on souhaite accéder. (ex : root)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;{host}&lt;/strong&gt; : ordinateur auquel on souhaite accéder. Ceci peut être une &lt;strong&gt;adresse IP&lt;/strong&gt; ou un &lt;strong&gt;nom de domaine&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quand on appuie sur Entrée, on sera invité à entrer le mot de passe du compte demandé. Si c'est correct, alors on sera accueilli avec une &lt;strong&gt;fenêtre de terminal à distance&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. À quoi sert SSH ?
&lt;/h3&gt;

&lt;p&gt;SSH est un &lt;strong&gt;protocole réseau sécurisé&lt;/strong&gt; permettant d'établir une &lt;strong&gt;connexion cryptée&lt;/strong&gt; entre un client et un serveur. Il offre une multitude d'utilisations pratiques dans le domaine informatique :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gestion à distance des serveurs, de l'infrastructure et des ordinateurs collaborateurs&lt;/strong&gt; : Les administrateurs systèmes peuvent &lt;strong&gt;&lt;em&gt;se connecter de manière sécurisée&lt;/em&gt;&lt;/strong&gt; à des serveurs distants pour effectuer des tâches de &lt;strong&gt;&lt;em&gt;configuration&lt;/em&gt;&lt;/strong&gt;, de &lt;strong&gt;&lt;em&gt;maintenance&lt;/em&gt;&lt;/strong&gt; et de &lt;strong&gt;&lt;em&gt;surveillance&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;&lt;u&gt;à distance&lt;/u&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Transfert de fichiers en toute sécurité&lt;/strong&gt; : SSH propose des protocoles comme &lt;strong&gt;SFTP &lt;em&gt;(SSH File Transfert Protocol)&lt;/em&gt; et SCP &lt;em&gt;(Secure Copy Protocol)&lt;/em&gt;&lt;/strong&gt; pour le &lt;strong&gt;transfert sécurisé de fichiers entre des ordinateurs distants&lt;/strong&gt;, garantissant ainsi la &lt;strong&gt;confidentialité&lt;/strong&gt; et l'&lt;strong&gt;intégrité&lt;/strong&gt; des données.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Accès à des services dans le cloud sans exposer les ports d'une machine locale à l'Internet&lt;/strong&gt; : Les utilisateurs peuvent se connecter de manière sécurisée à des services dans le cloud via SSH sans avoir à exposer les ports de leur machine locale à Internet, renforçant ainsi la &lt;strong&gt;sécurité de leur infrastructure&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Connexion à distance aux services d'un réseau privé&lt;/strong&gt; : SSH permet aux utilisateurs de &lt;strong&gt;se connecter de manière sécurisée aux services d'un réseau privé &lt;em&gt;&lt;u&gt;depuis n'importe où dans le monde&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;, assurant ainsi la &lt;strong&gt;confidentialité&lt;/strong&gt; et la &lt;strong&gt;sécurité&lt;/strong&gt; des communications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contournement des restrictions d'un pare-feu&lt;/strong&gt; : En utilisant le &lt;u&gt;tunneling SSH&lt;/u&gt;, les utilisateurs peuvent &lt;strong&gt;contourner les restrictions d'un pare-feu &lt;em&gt;en acheminant leur trafic à travers une connexion SSH sécurisée&lt;/em&gt;&lt;/strong&gt;, offrant ainsi un &lt;strong&gt;&lt;em&gt;accès sécurisée à des services normalement bloqués par le pare-feu&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Comprendre différentes techniques de cryptage.
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Avantage de SSH par rapport aux autres&lt;/strong&gt; : Utilisation du &lt;strong&gt;&lt;em&gt;cryptage&lt;/em&gt;&lt;/strong&gt; pour &lt;strong&gt;&lt;em&gt;assurer le transfert sécurisé d'informations&lt;/em&gt;&lt;/strong&gt; entre l'hôte et le client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Host&lt;/strong&gt; = serveur distant auquel on tente d'accéder.&lt;br&gt;
&lt;strong&gt;Client&lt;/strong&gt; = l'ordinateur que l'on utilise pour accéder à l'hôte.&lt;/p&gt;

&lt;p&gt;Il existe &lt;strong&gt;3&lt;/strong&gt; technologies de cryptage différentes utilisées par SSH :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cryptage symétrique.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cryptage asymétrique.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hashing.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  4.1. Cryptage symétrique (clé partagée ou cryptage de secret partagé).
&lt;/h4&gt;

&lt;p&gt;C'est une forme de cryptage où une &lt;strong&gt;clé secrète&lt;/strong&gt; est utilisée pour le &lt;strong&gt;_cryptage&lt;/strong&gt; et le &lt;strong&gt;décryptage&lt;/strong&gt; d'un message par le client et l'hôte_.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Toute personne possédant la clé peut décrypter le message transféré.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedtwxnmsdj9gjow12jah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedtwxnmsdj9gjow12jah.png" alt="Image description" width="622" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ce cryptage n'a habituellement qu'&lt;strong&gt;&lt;em&gt;une seule touche&lt;/em&gt;&lt;/strong&gt; qui est utilisée, ou parfois une &lt;strong&gt;&lt;em&gt;paire de touches&lt;/em&gt;&lt;/strong&gt; où &lt;em&gt;une clé peut facilement être calculée à l'aide de l'autre clé&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Les clés symétriques sont utilisées pour &lt;strong&gt;chiffrer toute la communication&lt;/strong&gt; lors d'une session SSH. Le client et le serveur dérivent la clé secrète en utilisant une méthode convenue, et la clé résultante n'est jamais divulguée à un tiers.&lt;/p&gt;

&lt;p&gt;Le processus de création d'une clé symétrique s'effectue par un &lt;strong&gt;algorithme d'échange de clés&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ce qui rend cet algorithme particulièrement sécurisé, c'est le fait que &lt;strong&gt;&lt;em&gt;la clé n'est jamais transmise entre le client et l'hôte&lt;/em&gt;&lt;/strong&gt;. Au lieu de cela, les deux ordinateurs partagent des données publiques, &lt;strong&gt;&lt;em&gt;puis les manipulent pour &lt;u&gt;calculer de manière indépendante la clé secrète&lt;/u&gt;.&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;Même si une autre machine capture les données publiquement partagées, il ne sera pas capable de calculer la clé car l'algorithme d'échange de clés n'est pas connu&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La clé secrète est &lt;strong&gt;&lt;em&gt;spécifique à chaque session SSH&lt;/em&gt;&lt;/strong&gt; et est &lt;strong&gt;&lt;em&gt;générée avant l'authentification du client&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Une fois la clé générée, &lt;strong&gt;&lt;u&gt;tous les paquets&lt;/u&gt; qui se déplacent entre les deux machines &lt;u&gt;doivent être cryptés par la clé privée&lt;/u&gt;&lt;/strong&gt;. Cela inclut le &lt;strong&gt;&lt;em&gt;mot de passe&lt;/em&gt;&lt;/strong&gt; tapé dans la console par l'utilisateur, de sorte que les informations d'identification sont toujours protégées des sniffers de paquets réseau.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Il existe une variété de chiffrages symétriques :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;AES (Advanced Encryption Standard)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CAST128&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blowfish&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;...&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avant d'établir une connexion sécurisée, le client et un hôte décident quel chiffrage utiliser, en publiant une liste des chiffrages compatibles, par ordre de préférence.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Le chiffrage préféré des &lt;em&gt;&lt;u&gt;cybers clients&lt;/u&gt;&lt;/em&gt; pris en charge sur la liste de l'hôte est utilisé comme &lt;strong&gt;&lt;em&gt;chiffrage bidirectionnel&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exemple : Si 2 machines Ubuntu 14.04 LTS communiquent entre elles sur SSH, elles utiliseront &lt;strong&gt;aes128-ctr&lt;/strong&gt; comme leur chiffrement par défaut.&lt;/p&gt;
&lt;h4&gt;
  
  
  4.2. Cryptage asymétrique.
&lt;/h4&gt;

&lt;p&gt;Contrairement au cryptage symétrique, le cryptage asymétrique utilise &lt;strong&gt;2 clés distinctes pour le cryptage et le décryptage&lt;/strong&gt;. Ces 2 clés sont appelées &lt;strong&gt;clé publique&lt;/strong&gt; et &lt;strong&gt;clé privée&lt;/strong&gt;. Ensemble, ces 2 clés forment une &lt;strong&gt;paire de clés public-privé&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F235f8h6vowlkevioqcv0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F235f8h6vowlkevioqcv0.png" alt="Image description" width="622" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La clé publique est distribuée et partagée ouvertement avec toutes les parties. Bien qu'elle soit étroitement liée à la clé privée en termes de fonctionnalité, &lt;strong&gt;la clé privée ne peut pas être &lt;em&gt;calculée mathématiquement&lt;/em&gt; à partir de la clé publique&lt;/strong&gt;. La relation entre les 2 clés est très complexe.&lt;/p&gt;

&lt;p&gt;Un message crypté par une clé publique d'une machine &lt;strong&gt;ne peut être déchiffré que par la clé privée d'une même machine&lt;/strong&gt;. Cette relation à sens unique signifie que la clé publique ne peut pas décrypter ses propres messages, ni décrypter quelque chose crypté par la clé privée.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La clé privée doit rester privée, càd que la connexion doit être sécurisée, &lt;strong&gt;aucun tiers ne doit jamais la connaître&lt;/strong&gt;. La force de l'ensemble de la connexion réside dans le fait que la clé privée n'est jamais révélée, car &lt;strong&gt;elle est le seul composant capable de décrypter des messages cryptés à l'aide de sa propre clé publique&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Par conséquent, toute partie ayant la capacité de &lt;em&gt;&lt;u&gt;décrypter des messages signés publiquement&lt;/u&gt;&lt;/em&gt; doit posséder &lt;strong&gt;la clé privée correspondante&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Le cryptage asymétrique &lt;strong&gt;n'est pas utilisé pour chiffrer toute la session SSH&lt;/strong&gt;. Au lieu de cela, &lt;strong&gt;&lt;em&gt;il n'est utilisé que pendant l'algorithme d'&lt;u&gt;échange de clés de cryptage symétrique&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Avant de lancer une connexion sécurisée, les 2 parties génèrent des paires de clés public-privé &lt;strong&gt;&lt;u&gt;temporaires&lt;/u&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;em&gt;partagent leurs clés privées respectives pour produire la clé secrète partagée&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Une fois qu'une communication symétrique sécurisée a été établie, &lt;strong&gt;le serveur utilise la clé publique des clients pour générer et contester et transmettre au client une &lt;em&gt;&lt;u&gt;authentification&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;. &lt;em&gt;&lt;u&gt;Si le client peut décrypter avec succès le message&lt;/u&gt;&lt;/em&gt;, cela signifie qu'&lt;em&gt;&lt;u&gt;il dispose de la clé privée requise pour la connexion&lt;/u&gt;&lt;/em&gt;. &lt;strong&gt;&lt;u&gt;La session SSH commence alors&lt;/u&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  4.3. Hashing (hachage).
&lt;/h4&gt;

&lt;p&gt;Le &lt;strong&gt;hachage à sens unique&lt;/strong&gt; est une autre forme de cryptographie utilisée dans les connexions Secure SHell. Les fonctions &lt;strong&gt;one-way-hash&lt;/strong&gt; diffèrent des deux formes de cryptage ci-dessus en ce sens qu’&lt;strong&gt;elles ne sont jamais destinées à être déchiffrées&lt;/strong&gt;. &lt;strong&gt;Elles génèrent une &lt;em&gt;&lt;u&gt;valeur unique d’une longueur fixe&lt;/u&gt;&lt;/em&gt; pour chaque entrée&lt;/strong&gt;, dont aucune tendance claire ne peut être exploitée. Cela rend pratiquement impossible l’inversion.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbkyvo5jid0jjq4ot68k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbkyvo5jid0jjq4ot68k.png" alt="Image description" width="622" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Il est &lt;strong&gt;facile de générer un hachage cryptographique à partir d’une entrée donnée&lt;/strong&gt;, mais &lt;strong&gt;&lt;em&gt;impossible de générer l’entrée du hash&lt;/em&gt;&lt;/strong&gt;. Cela signifie que &lt;strong&gt;&lt;em&gt;si un client détient l’entrée correcte, il peut générer le hachage cryptographique et comparer sa valeur pour vérifier s’il possède la bonne entrée&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;SSH utilise des &lt;em&gt;hachages&lt;/em&gt; pour vérifier l’&lt;em&gt;authenticité&lt;/em&gt; des messages&lt;/strong&gt;. Ceci est fait en utilisant &lt;strong&gt;HMAC&lt;/strong&gt;, ou &lt;strong&gt;Hash-based  Message Authentication Codes&lt;/strong&gt;. Cela garantit que &lt;strong&gt;la commande reçue n’est modifiée d’aucune manière que ce soit&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Même si l’algorithme de cryptage symétrique est sélectionné, &lt;strong&gt;un algorithme d’authentification de message approprié est également sélectionné&lt;/strong&gt;. Cela fonctionne de manière similaire à la façon dont le chiffrage est sélectionné, comme expliqué dans la section sur le cryptage symétrique.&lt;/p&gt;

&lt;p&gt;Chaque message transmis doit contenir un &lt;strong&gt;MAC&lt;/strong&gt;, qui est calculé en utilisant la &lt;strong&gt;&lt;em&gt;clé symétrique&lt;/em&gt;&lt;/strong&gt;, le &lt;strong&gt;&lt;em&gt;numéro de séquence de paquets&lt;/em&gt;&lt;/strong&gt; et le &lt;strong&gt;&lt;em&gt;contenu du message&lt;/em&gt;&lt;/strong&gt;. Il est &lt;strong&gt;envoyé en dehors des données cryptées symétriquement&lt;/strong&gt; comme la partie finale du paquet de communication.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Comment fonctionne SSH avec ces techniques de cryptage ?
&lt;/h3&gt;

&lt;p&gt;Il utilise un &lt;strong&gt;modèle client-serveur&lt;/strong&gt; pour permettre :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;l'&lt;strong&gt;authentification&lt;/strong&gt; de deux sytèmes distants.&lt;/li&gt;
&lt;li&gt;le &lt;strong&gt;cryptage des données&lt;/strong&gt; qui les traversent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SSH fonctionne par défaut sur le &lt;strong&gt;&lt;u&gt;port TCP 22&lt;/u&gt;&lt;/strong&gt; (modifiable à volonté) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L'hôte écoute le port et guette les connexions entrantes.&lt;/li&gt;
&lt;li&gt;L'hôte organise la connexion sécurisée en authentifiant le client et en ouvrant le bon environnement si la vérification est réussie.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbbsbgpnzy7ixmmra1au.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbbsbgpnzy7ixmmra1au.png" alt="Image description" width="611" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le client doit commencer la connexion SSH :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lancer le handshake TCP avec le serveur.&lt;/li&gt;
&lt;li&gt;Assurer une connexion symétrique sécurisée.&lt;/li&gt;
&lt;li&gt;Vérifier si l'identité affichée par le serveur correspond aux enregistrements précédents (habituellement enregistrés dans un fichier de stockage de clés RSA).&lt;/li&gt;
&lt;li&gt;Vérifier si l'identité affichée par le serveur présente les informations d'identification requises pour authentifier la connexion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il existe 2 étapes pour établir une connexion :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Les systèmes doivent s'entendre sur les normes de cryptage pour protéger les communications futures.&lt;/li&gt;
&lt;li&gt;L'utilisateur doit s'authentifier.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  5.1. Négociation de chiffrement de session.
&lt;/h4&gt;

&lt;p&gt;Lorsqu’un client tente de se connecter au serveur via TCP, le serveur présente les &lt;strong&gt;protocoles de cryptage&lt;/strong&gt; et les &lt;strong&gt;versions respectives&lt;/strong&gt; qu’il prend en charge. Si le client possède une &lt;strong&gt;&lt;em&gt;paire de protocoles et de versions&lt;/em&gt;&lt;/strong&gt; correspondant, un accord est atteint et la connexion commence avec le protocole accepté. Le serveur utilise également une &lt;strong&gt;&lt;u&gt;clé publique asymétrique&lt;/u&gt;&lt;/strong&gt; que le client peut utiliser pour vérifier l’authenticité de l’hôte.&lt;/p&gt;

&lt;p&gt;Une fois que cela est établi, les deux parties utilisent ce qu’on appelle un &lt;strong&gt;algorithme d’échange de clés Diffie-Hellman&lt;/strong&gt; pour &lt;strong&gt;créer une clé symétrique&lt;/strong&gt;. Cet algorithme permet au client et au serveur d’arriver à une clé de cryptage partagée qui sera désormais utilisée pour chiffrer toute la session de communication.&lt;/p&gt;
&lt;h5&gt;
  
  
  Principe de l'algorithme d'échange de clés de Diffie-Hellman :
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvjvuybz4wena4xgde3u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvjvuybz4wena4xgde3u.png" alt="Image description" width="800" height="1201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrn6dl9zcu45a07ugmse.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrn6dl9zcu45a07ugmse.png" alt="Image description" width="671" height="771"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F55ropg0ezitma39ij93f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F55ropg0ezitma39ij93f.png" alt="Image description" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fans980mjer9q6bxam2ev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fans980mjer9q6bxam2ev.png" alt="Image description" width="671" height="807"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voici comment l'algorithme fonctionne à un niveau très basique :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;ol&gt;
&lt;li&gt;Le client et le serveur se mettent d'accord sur un très grand nombre premier &lt;strong&gt;&lt;em&gt;p&lt;/em&gt;&lt;/strong&gt;, qui &lt;strong&gt;&lt;em&gt;n'a bien sûr aucun facteur en commun&lt;/em&gt;&lt;/strong&gt;. Cette valeur de nombre premier est également appelée &lt;strong&gt;&lt;em&gt;valeur de départ&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;&lt;ol&gt;
&lt;li&gt;Ensuite, les 2 parties conviennent d'un &lt;strong&gt;&lt;em&gt;mécanisme de cryptage commun&lt;/em&gt;&lt;/strong&gt; pour &lt;strong&gt;&lt;em&gt;générer un autre ensemble de valeurs&lt;/em&gt;&lt;/strong&gt; en manipulant les valeurs de base d'une manière algorithmique spécifique. Ces mécanismes, également appelés &lt;strong&gt;&lt;em&gt;&lt;u&gt;générateurs de cryptage&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;, effectuent de grandes opérations sur les valeurs de base. &lt;strong&gt;Exemple : AES (Advanced Encryption Standard).&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;&lt;ol&gt;
&lt;li&gt;Les 2 parties génèrent indépendamment un autre nombre premier &lt;strong&gt;&lt;em&gt;(a et b)&lt;/em&gt;&lt;/strong&gt;. Celui-ci est utilisé comme &lt;strong&gt;&lt;em&gt;&lt;u&gt;clé privée secrète&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; pour l'intéraction.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;&lt;ol&gt;
&lt;li&gt;Cette clé privée nouvellement générée &lt;strong&gt;&lt;em&gt;(a et b)&lt;/em&gt;&lt;/strong&gt;, avec le numéro partagé &lt;strong&gt;&lt;em&gt;(p)&lt;/em&gt;&lt;/strong&gt; et l'algorithme de cryptage &lt;strong&gt;&lt;em&gt;(ex. AES)&lt;/em&gt;&lt;/strong&gt;, sert à calculer une clé publique &lt;strong&gt;&lt;em&gt;(A et B)&lt;/em&gt;&lt;/strong&gt; qui est distribuée à l'autre ordinateur.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;&lt;ol&gt;
&lt;li&gt;Les parties utilisent ensuite leur propre &lt;strong&gt;clé privée &lt;em&gt;(a/b)&lt;/em&gt;&lt;/strong&gt;, la &lt;strong&gt;clé publique partagée &lt;em&gt;(A/B)&lt;/em&gt;&lt;/strong&gt; de l'autre machine et le &lt;strong&gt;numéro premier d'origine &lt;em&gt;(p)&lt;/em&gt;&lt;/strong&gt; pour créer une clé secrète partagée finale. Cette clé est calculée indépendamment par les 2 ordinateurs, mais créera la même clé de cryptage des 2 côtés.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;&lt;ol&gt;
&lt;li&gt;Maintenant que les 2 côtés ont une &lt;strong&gt;&lt;em&gt;clé partagée&lt;/em&gt;&lt;/strong&gt;, ils peuvent chiffrer symétriquement toute la session SSH. La même clé peut être utilisée pour &lt;strong&gt;&lt;em&gt;&lt;u&gt;chiffrer et décrypter&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; des messages.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Maintenant que la session sécurisée symétriquement cryptée a été établie, l’utilisateur doit être authentifié.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  5.2. Authentification de l'utilisateur. &lt;em&gt;(Phase finale)&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;La plupart des utilisateurs SSH utilisent un &lt;strong&gt;&lt;em&gt;mot de passe&lt;/em&gt;&lt;/strong&gt;. L'utilisateur est invité à entrer le nom d'utilisateur, suivi du mot de passe. Ces informations d'identification &lt;strong&gt;passent en toute sécurité par le tunnel crypté symétriquement&lt;/strong&gt;, de sorte qu'il n'a aucune chance d'être capturé par un tiers.&lt;/p&gt;

&lt;p&gt;Bien que les mots de passe soient cryptés, &lt;strong&gt;&lt;em&gt;il n'est pas recommandé d'utiliser des mots de passe pour les connexions sécurisées&lt;/em&gt;&lt;/strong&gt;. C'est parce que de nombreux robots peuvent simplement forcer des mots de passe faciles ou mots de passe par défaut, et accéder au compte. Au lieu de cela, l'alternative recommandée est &lt;strong&gt;&lt;u&gt;SSH Key Pairs&lt;/u&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Le SSH Key Pairs est un &lt;strong&gt;&lt;em&gt;ensemble de clés asymétriques&lt;/em&gt;&lt;/strong&gt; utilisées pour authentifier l'utilisateur sans avoir à entrer de mot de passe.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  6. Risque de sécurité associés au SSH et meilleures pratiques.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Attaques par force brute visant les identifiants SSH.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vulnérabilités logicielles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Erreurs de configuration.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Pour atténuer ces risques, il est recommandé de suivre certaines meilleures pratiques de sécurité :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilisation de clés SSH robustes plutôt que de mot de passe.&lt;/li&gt;
&lt;li&gt;Mise à jour régulière des logiciels SSH pour corriger les failles de sécurité connues.&lt;/li&gt;
&lt;li&gt;Configuration appropriée des paramètres de sécurité pour limiter l'accès non autorisé.&lt;/li&gt;
&lt;li&gt;Surveillance continue des journaux d'activié SSH -› aide à la détection de tentatives d'intrusion. &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  7. Qu'est-ce que SSH ? - FAQ
&lt;/h3&gt;
&lt;h4&gt;
  
  
  7.1. Pourquoi SSH est-il utilisé ?
&lt;/h4&gt;

&lt;p&gt;Secure SHell (SSH en abrégé) est un &lt;strong&gt;protocole de communication réseau&lt;/strong&gt; qui permet à 2 ordinateurs de communiquer entre eux. SSH permet également le transfert de données entre 2 ordinateurs.&lt;/p&gt;
&lt;h4&gt;
  
  
  7.2. Que signifie SSH ?
&lt;/h4&gt;

&lt;p&gt;SSH est l'abréviation du protocole réseau &lt;strong&gt;Secure SHell, ou Secure Socket Shell&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  7.3. Qu'est-ce que SSH par rapport à SSL ?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SSH crée un réseau sécurisé entre ordinateurs qui permet le transfert de données.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSL &lt;strong&gt;&lt;em&gt;(Secure Sockets Layer)&lt;/em&gt;&lt;/strong&gt; crypte les données transférées, réduisant ainsi les tentatives de malveillance et d'hameçonnage.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc02fjmfgug2tg5jttnlk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc02fjmfgug2tg5jttnlk.png" alt="Image description" width="642" height="94"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  X. &lt;u&gt;Le pare-feu UFW&lt;/u&gt; (Uncomplicated FireWall).
&lt;/h2&gt;

&lt;p&gt;UFW est une interface de gestion de pare-feu simplifiée qui masque la complexité des technologies de filtrage de paquets de niveau inférieur telles que &lt;code&gt;iptables&lt;/code&gt; et &lt;code&gt;nftables&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Installation.
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;ufw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Utilisation d'IPv6 avec UFW (facultatif).
&lt;/h3&gt;

&lt;p&gt;Il faut s'assurer qu'UFW est configuré pour prendre en charge IPv6 afin de gérer les règles de pare-feu pour IPv6 en plus d'IPv4.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/default/ufw
&lt;span class="c"&gt;# Il faut s'assurer que la valeur d'IPv6 est yes.&lt;/span&gt;
&lt;span class="c"&gt;# IPV6=yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lorsque l'UFW est activé, il sera configuré pour écrire des règles de pare-feu IPv4 et IPv6.&lt;/p&gt;

&lt;p&gt;Avant d'activer UFW, on veut s'assurer que le pare-feu est configuré pour nous permettre de nous connecter via SSH.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Mise en place des politiques par défaut.
&lt;/h3&gt;

&lt;p&gt;Ce sont des règles qui contrôlent la manière de traiter le trafic qui ne correspond pas explicitement à d'autres règles.&lt;/p&gt;

&lt;p&gt;Par défaut, UFW est configuré pour refuser toutes les connexions entrantes et autoriser toutes les connexions sortantes. Cela signifie que toute personne essayant d'atteindre le serveur ne pourra pas se connecter, tandis que toute application à l'intérieur du serveur pourra atteindre le monde extérieur.&lt;/p&gt;

&lt;p&gt;Pour définir les valeurs par défaut utilisées par UFW, on peut utiliser la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Refuser les connexions entrantes.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw default deny incoming

&lt;span class="c"&gt;# Autoriser les connexions sortantes.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw default allow outgoing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Ces paramètres par défaut du pare-feu peuvent suffire pour un ordinateur personnel, mais les serveurs doivent généralement répondre aux demandes entrantes d'utilisateurs extérieurs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4. Autoriser les connexions SSH.
&lt;/h3&gt;

&lt;p&gt;Si on active le pare-feu UFW maintenant, il refuserait toutes les connexions entrantes. Cela signifie qu'on devra créer des règles qui autorisent explicitement les connexions entrantes légitimes &lt;strong&gt;(connexions SSH ou HTTP, par exemple)&lt;/strong&gt; si on veut que le serveur réponde à ce type de demandes. Si on utilise un serveur cloud, on voudra probablement autoriser les connexions SSH entrantes afin de pouvoir se connecter à notre serveur et le gérer.&lt;/p&gt;

&lt;p&gt;Pour configurer le serveur afin d'autoriser les connexions SSH entrantes, on peut utiliser la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Création des règles de pare-feu qui autoriseront toutes les connexions sur le port 22 (port que le démon SSH écoute par défaut).&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;UFW sait quel port &lt;code&gt;allow ssh&lt;/code&gt; désigne parce qu'il est listé comme un service dans le fichier &lt;code&gt;/etc/services&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On peut aussi écrire une règle équivalente en spécifiant le &lt;strong&gt;port&lt;/strong&gt; au lieu du nom du service.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si on a configuré le démon SSH pour utiliser un port différent, on devra spécifier le port approprié. Par exemple, si SSH écoute le port &lt;code&gt;2222&lt;/code&gt;, on peut utiliser cette commande pour autoriser les connexions sur ce port :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 2222
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Activation d'UFW.
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Activation du pare-feu.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;On recevra un avertissement qui indique que la commande peut perturber les connexions SSH existantes. On a déjà mis en place une règle de pare-feu qui autorise les connexions SSH, donc on peut continuer. Il suffit juste de répondre à l'invite avec &lt;code&gt;y&lt;/code&gt; et d'appuyer sur &lt;code&gt;ENTER&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pour connaître les règles fixées, on peut exécuter la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status verbose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Autoriser d'autres connexions.
&lt;/h3&gt;

&lt;p&gt;À ce stade, on doit autoriser toutes les autres connexions auxquelles le serveur a besoin de répondre. Les connexions qu'on doit autoriser dépendent de nos besoins spécifiques.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pour autoriser le protocole HTTP sur le port 80 :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow http
&lt;span class="c"&gt;# ou&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 80

&lt;span class="c"&gt;# Pour autoriser le protocole HTTPS sur le port 443 :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow https
&lt;span class="c"&gt;# ou&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Il existe plusieurs autres moyens d'autoriser d'autres connexions, outre la spécification d'un port ou d'un service connu :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Plages de ports spécifiques.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adresses IP spécifiques.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sous réseaux.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connexion à une interface réseau spécifique.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  6.1. Plages de ports spécifiques.
&lt;/h4&gt;

&lt;p&gt;On peut spécifier des plages de ports avec UFW. Certaines applications utilisent &lt;strong&gt;plusieurs ports&lt;/strong&gt;, au lieu d'un seul.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pour autoriser les connexions X11 qui utilisent les ports 6000-6007, on peut utiliser les commandes suivantes :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 6000:6007 /tcp
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 6000:6007 /udp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lorsqu'on spécifie des plages de ports avec UFW, &lt;strong&gt;on doit spécifier le protocole (&lt;em&gt;&lt;u&gt;tcp&lt;/u&gt;&lt;/em&gt; ou &lt;em&gt;&lt;u&gt;udp&lt;/u&gt;&lt;/em&gt;)&lt;/strong&gt; auquel les règles doivent s'appliquer.&lt;/p&gt;

&lt;p&gt;Le fait de ne pas spécifier le protocole autorise automatiquement les 2 protocoles, ce qui est correct dans la plupart des cas.&lt;/p&gt;

&lt;h4&gt;
  
  
  6.2. Adresses IP spécifiques.
&lt;/h4&gt;

&lt;p&gt;Si on souhaite autoriser les connexions à partir d'une adresse IP spécifique (professionnelle ou personnelle, ex: &lt;code&gt;203.0.113.4&lt;/code&gt;), on doit spécifier &lt;code&gt;from&lt;/code&gt;, puis l'adresse IP :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow from 203.0.113.4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On peut spécifier un port spécifique auquel l'adresse IP est autorisée à se connecter en ajoutant &lt;code&gt;to any port&lt;/code&gt; suivi du numéro de port.&lt;/p&gt;

&lt;p&gt;Ex : Si on souhaite autoriser &lt;code&gt;203.0.113.4&lt;/code&gt; à se connecter au port &lt;code&gt;22&lt;/code&gt; (SSH), on peut utilier la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow from 203.0.113.4 to any port 22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  6.3. Sous réseaux.
&lt;/h4&gt;

&lt;p&gt;Si on souhaite autoriser un sous-réseau d'adresses IP, on peut le faire en utilisant la &lt;strong&gt;notation CIDR (Classless Inter-Domain Routing)&lt;/strong&gt; pour &lt;strong&gt;&lt;em&gt;spécifier un masque de réseau&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Si on souhaite autoriser toutes les adresses IP entre 203.0.113.1 à 203.0.113.254, on peut utiliser la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow from 203.0.113.0/24
&lt;span class="c"&gt;# Les 24 premiers bits permettent d'identifier le réseau.&lt;/span&gt;
&lt;span class="c"&gt;# Les 8 derniers bits permettent d'identifier les hôtes sur ce réseau.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On peut également spécifier le port de destination auquel le sous-réseau &lt;code&gt;203.0.113.0/24&lt;/code&gt; est autorisé à se connecter. Exemple :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow from 203.0.113.0/24 to any port 22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  6.4. Connexions à une interface réseau spécifique.
&lt;/h4&gt;

&lt;p&gt;Si on souhaite créer une règle de pare-feu qui s'applique uniquement à une interface réseau spécifique &lt;strong&gt;&lt;em&gt;(ex: eth0, eth1, enp3s2, ...)&lt;/em&gt;&lt;/strong&gt;, on peut le faire en spécifiant &lt;code&gt;allow in on&lt;/code&gt; suivi du nom de l'interface.&lt;/p&gt;

&lt;p&gt;On peut consulter les interfaces réseau avant de continuer, avec &lt;code&gt;ip addr&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Output Excerpt
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state
&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST&amp;gt; mtu 1500 qdisc noop state DOWN group default
&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si notre serveur a une &lt;strong&gt;interface réseau publique&lt;/strong&gt; appelée &lt;code&gt;eth0&lt;/code&gt;, on peut l'autoriser à recevoir du trafic HTTP (port 80) avec la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Cette commande va permettre au sserveur de recevoir&lt;/span&gt;
&lt;span class="c"&gt;# des requêtes HTTP de l'internet public.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow &lt;span class="k"&gt;in &lt;/span&gt;on eth0 to any port 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si on veut que notre serveur de base de données MySQL (port 3306) écoute les connexions sur l'&lt;strong&gt;interface de réseau privé&lt;/strong&gt; &lt;code&gt;eth1&lt;/code&gt;, on peut utiliser la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow &lt;span class="k"&gt;in &lt;/span&gt;on eth1 to any port 3306
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cela permettrait à d'autres serveurs du réseau privé de se connecter à notre base de données MySQL.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Refuser les connexions.
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;UFW est configuré pour refuser toutes les connexions entrantes. Cela simplifie le processus de création d'une politique de pare-feu sécurisée en obligeant à créer des règles qui autorisent explicitement le passage de ports et d'adresses IP spécifiques.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Au cas où on souhaite refuser des connexions spécifiques en fonction de l'adresse IP source ou du sous-réseau, on peut modifier la politique d'entrée par défaut &lt;strong&gt;(allow)&lt;/strong&gt; en créant des règles &lt;strong&gt;deny&lt;/strong&gt; pour &lt;strong&gt;&lt;em&gt;&lt;u&gt;tous les services ou adresses IP pour lesquels on ne souhaite pas autoriser les connexions&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Si on veut refuser des connexions HTTP.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw deny http

&lt;span class="c"&gt;# Si on veut refuser toutes les connexions à partir de 203.0.113.4.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw deny from 203.0.113.4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8. Suppression de règles.
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Il faut savoir supprimer des règles de pare-feu xD.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Il existe 2 façons différentes de spécifier les règles à supprimer :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Par le numéro de la règle &lt;strong&gt;&lt;em&gt;(delete by rule number)&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Par la règle elle-même &lt;strong&gt;&lt;em&gt;(de la même façon que les règles ont été spécifiées lors de leur création)&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  8.1. Par numéro de règle.
&lt;/h4&gt;

&lt;p&gt;La première chose à faire c'est d'obtenir une liste des règles de pare-feu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status numbered
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvz96ittge99zewmmy6ih.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvz96ittge99zewmmy6ih.png" alt="Image description" width="507" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si on veut supprimer la règle 2 (celle qui autorise les connexions sur le port 80 [HTTP]), on peut la spécifier dans une commande de suppression UFW :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw delete 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ça va afficher une demande de confirmation puis supprimera la règle 2, qui autorise les connexions HTTP.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt; Si on a activé IPv6, on voudra également supprimer la règle IPv6 correspondante.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  8.2. Par règle réelle.
&lt;/h3&gt;

&lt;p&gt;L'alternative aux numéros de règle est de &lt;strong&gt;spécifier la règle réelle à supprimer&lt;/strong&gt;. Par exemple, si on veut supprimer la règle &lt;code&gt;allow http&lt;/code&gt;, on peut l'écrire comme ceci :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw delete allow http
&lt;span class="c"&gt;# ou&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw delete allow 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Cette méthode supprimera les règles IPv4 et IPv6, si elles existent.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  9. Vérification de l'état et des règles d'UFW.
&lt;/h3&gt;

&lt;p&gt;On peut à tout moment vérifier le statut d'UFW :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status verbose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si UFW est désactivé :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpjkd1m3bqdktmdydu14e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpjkd1m3bqdktmdydu14e.png" alt="Image description" width="580" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si UFW est actif, la sortie indiquera qu'il est actif et énumérera toutes les règles qui sont définies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuh8g2yzsx4y4ru4tizzj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuh8g2yzsx4y4ru4tizzj.png" alt="Image description" width="538" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On peut utiliser la commande &lt;code&gt;status&lt;/code&gt; si on souhaite vérifier comment UFW a configuré le pare-feu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10. Désactivation ou réinitialisation d'UFW (facultatif).
&lt;/h3&gt;

&lt;p&gt;Si on souhaite désactiver UFW :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw disable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour la réactiver :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour supprimer toutes les règles qui ont été définies précédemment, désactiver UFW et repartir à zéro avec UFW :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw reset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Il faut garder à l'esprit que les règles par défaut ne retrouveront pas leurs paramètres d'origine, si on les a modifiées à un moment quelconque.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  XI. &lt;u&gt;Le pare-feu firewalld pour Rocky&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;On va voir comment configurer le pare-feu &lt;code&gt;firewalld&lt;/code&gt; pour le serveur Rocky Linux 8 et aborder les principes fondamentaux de la gestion du pare-feu avec l'outil d'administration &lt;code&gt;firewall-cmd&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Révision des concepts de base dans Firewalld.
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1.1. Zones.
&lt;/h4&gt;

&lt;p&gt;Le service &lt;strong&gt;Firewalld&lt;/strong&gt; gère des groupes de règles utilisant des entités appelées &lt;strong&gt;&lt;em&gt;zones&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Les &lt;strong&gt;zones&lt;/strong&gt; sont des &lt;strong&gt;&lt;em&gt;&lt;u&gt;ensembles de règles&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; qui dictent le trafic qui doit être autorisé en fonction du &lt;strong&gt;&lt;em&gt;&lt;u&gt;niveau de confiance&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; que l'on a dans le réseau.&lt;/p&gt;

&lt;p&gt;Les interfaces réseau sont &lt;strong&gt;&lt;em&gt;affectées à une zone&lt;/em&gt;&lt;/strong&gt; pour dicter le comportement que le pare-feu doit autoriser.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pour les ordinateurs susceptibles de se déplacer fréquemment entre les réseaux &lt;strong&gt;&lt;em&gt;(ex: ordinateurs portables)&lt;/em&gt;&lt;/strong&gt;, ce type de flexibilité constitue une bonne méthode pour &lt;strong&gt;modifier les règles en fonction de l'environnement&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;On peut avoir mis en place des règles strictes &lt;strong&gt;&lt;em&gt;interdisant la plupart du trafic lorsqu'on travaille sur un réseau WiFi public&lt;/em&gt;&lt;/strong&gt;, tout en &lt;strong&gt;&lt;u&gt;autorisant des restrictions plus souples lorsqu'on est connecté à notre réseau domestique&lt;/u&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Il est toujours utile de se familiariser avec l'idée générale derrière chacune des &lt;strong&gt;&lt;u&gt;zones prédéfinies&lt;/u&gt;&lt;/strong&gt; pour &lt;code&gt;firewalld&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Les zones prédéfinies à l'intérieur du pare-feu &lt;code&gt;firewalld&lt;/code&gt; sont par ordre &lt;strong&gt;décroissant&lt;/strong&gt; de &lt;strong&gt;confiance&lt;/strong&gt; :&lt;br&gt;
&lt;code&gt;N.C. = Niveau de confiance.&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;drop (N.C. 0) :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Toutes les connexions entrantes sont abandonnées sans réponse.&lt;/li&gt;
&lt;li&gt;Toutes les connexions sortantes sont possibles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;block (N.C. 1) :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Toutes les connexions entrantes sont abandonnées avec un message &lt;code&gt;icmp-host-prohibited&lt;/code&gt; ou &lt;code&gt;icmp6-adm-prohibited&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Toutes les connexions sortantes sont possibles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;public (N.C. 2) :&lt;/strong&gt; Représente des réseaux publics non fiables. On ne fait pas confiance aux autres ordinateurs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On peut autoriser certaines connexions entrantes &lt;strong&gt;&lt;em&gt;au cas par cas&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Toutes les connexions sortantes sont possibles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;external (N.C. 3) :&lt;/strong&gt; Réseaux externes dans le cas où on utilise le pare-feu comme &lt;strong&gt;&lt;em&gt;passerelle&lt;/em&gt;&lt;/strong&gt;. Il est configuré pour le &lt;strong&gt;&lt;u&gt;masquage NAT&lt;/u&gt;&lt;/strong&gt; afin que le réseau interne reste &lt;strong&gt;&lt;em&gt;privé mais accessible&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;internal (N.C. 4) :&lt;/strong&gt; C'est l'autre côté de la zone externe, utilisé pour la partie interne d'une passerelle. Les ordinateurs sont assez &lt;strong&gt;&lt;u&gt;fiables&lt;/u&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;em&gt;certains services supplémentaires sont disponibles&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;dmz (N.C. 5) :&lt;/strong&gt; Utilisé pour les ordinateurs situés dans une DMZ (ordinateurs &lt;strong&gt;&lt;em&gt;isolés&lt;/em&gt;&lt;/strong&gt; qui &lt;strong&gt;&lt;em&gt;n'auront pas accès au reste de notre réseau&lt;/em&gt;&lt;/strong&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;work (N.C. 6) :&lt;/strong&gt; Utilisé pour les machines de travail. Il fait confiance à la plupart des ordinateurs du réseau. Quelques services supplémentaires pourraient être autorisés.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;home (N.C. 7) :&lt;/strong&gt; Un environnement familial. Il fait confiance à la plupart des autres ordinateurs. Quelques services supplémentaires seront acceptés.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;trusted (N.C. 8) :&lt;/strong&gt; Il fait confiance à toutes les machines du réseau. C'est la plus ouverte des options disponibles et doit être utilisée avec parcimonie.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour utiliser le pare-feu, on peut :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Créer des règles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modifier les propriétés des zones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Attribuer les interfaces réseau aux zones les plus appropriées.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  1.2. Permanence des règles.
&lt;/h4&gt;

&lt;p&gt;Dans &lt;code&gt;firewalld&lt;/code&gt;, les règles peuvent être &lt;strong&gt;appliquées à l'ensemble des règles d'&lt;em&gt;exécution actuel&lt;/em&gt; ou devenir &lt;em&gt;permanent&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Par défaut, lorsqu'une règle est &lt;strong&gt;&lt;em&gt;ajoutée&lt;/em&gt;&lt;/strong&gt; ou &lt;strong&gt;&lt;em&gt;modifiée&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;seul le &lt;em&gt;&lt;u&gt;pare-feu en cours d'exécution&lt;/u&gt;&lt;/em&gt; est &lt;em&gt;modifié&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Après le prochain redémarrage - ou rechargement du service &lt;code&gt;firewalld&lt;/code&gt; - seules les &lt;strong&gt;&lt;em&gt;règles permanentes&lt;/em&gt;&lt;/strong&gt; resteront.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La plupart des opérations &lt;code&gt;firewall-cmd&lt;/code&gt; peuvent prendre un indicateur &lt;code&gt;--permanent&lt;/code&gt; pour indiquer que les modifications doivent être &lt;strong&gt;&lt;em&gt;&lt;u&gt;appliquées à la configuration permanente&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Le pare-feu en cours d'exécution peut être enregistré dans la configuration permanente avec la commande &lt;code&gt;firewall-cmd --runtime-to-permanent&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cette séparation entre l'&lt;strong&gt;exécution&lt;/strong&gt; et la &lt;strong&gt;configuration permanente&lt;/strong&gt; signifie que l'on peut &lt;strong&gt;&lt;em&gt;tester en toute sécurité les règles de pare-feu actif&lt;/em&gt;&lt;/strong&gt;, puis &lt;strong&gt;&lt;u&gt;recharger pour recommencer en cas de problèmes&lt;/u&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  2. Installation et activation de Firewalld.
&lt;/h3&gt;

&lt;p&gt;Il est installé par défaut sur certaines distributions Linux comme Rocky Linux.&lt;/p&gt;

&lt;p&gt;Il peut s'avérer nécessaire d'installer le pare-feu par nous-même.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;firewalld &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Après ça, on peut activer le service avec &lt;code&gt;systemctl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;firewalld
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start firewalld
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On peut vérifier que le service est exécuté et accessible avec :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--state&lt;/span&gt;
&lt;span class="c"&gt;# ou bien :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status firewalld
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.1. Exploration des valeurs par défaut.
&lt;/h4&gt;

&lt;p&gt;On peut voir quelle zone est actuellement sélectionnée par défaut avec :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--get-default-zone&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fotiis7kvef7v0gku7gov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fotiis7kvef7v0gku7gov.png" alt="Image description" width="291" height="74"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Puisqu'on n'a pas donné à firewalld aucune commande pour s'écarter de la zone par défaut et qu'aucune des interfaces n'est configurée pour se lier à une autre zone, cette zone sera également la seule zone &lt;strong&gt;active&lt;/strong&gt; (la zone qui contrôle le trafic de nos interfaces). On peut vérifier avec :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--get-active-zones&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fob3qeb5hbpdjt7cdc6bk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fob3qeb5hbpdjt7cdc6bk.png" alt="Image description" width="291" height="74"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sur cet exemple, on peut voir que le serveur dispose de deux interfaces réseau contrôlées par le pare-feu (&lt;code&gt;eth0&lt;/code&gt; et &lt;code&gt;eth1&lt;/code&gt;). Ils sont tous deux actuellement gérés selon les règles définies pour la zone &lt;strong&gt;public&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On peut imprimer les règles liées à la configuration de la zone par défaut avec :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--list-all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdwlyuq5fnn2f42d046d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdwlyuq5fnn2f42d046d.png" alt="Image description" width="384" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On peut voir à partir de la sortie que cette zone est à la fois la zone par défaut et active, et que les interfaces &lt;code&gt;eth0&lt;/code&gt; et &lt;code&gt;eth1&lt;/code&gt; sont associées à cette zone. Sur la ligne &lt;code&gt;services:&lt;/code&gt;, on peut également voir que cette zone autorise le trafic pour un client &lt;strong&gt;DHCP&lt;/strong&gt; (pour l'attribution d'adresses IP), &lt;strong&gt;SSH&lt;/strong&gt; (pour l'administration à distance) et &lt;strong&gt;Cockpit&lt;/strong&gt; (une console Web).&lt;/p&gt;

&lt;h4&gt;
  
  
  2.2. Exploration des zones alternatives.
&lt;/h4&gt;

&lt;p&gt;Pour obtenir lq liste des zones disponibles, on peut faire :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--get-zones&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn6mkr3q04nim1cfzpso6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn6mkr3q04nim1cfzpso6.png" alt="Image description" width="507" height="57"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pour voir la configuration spécifique associée à une zone :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;home &lt;span class="nt"&gt;--list-all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F13qdp1x9zqx7yp8cft2y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F13qdp1x9zqx7yp8cft2y.png" alt="Image description" width="496" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On peut afficher toutes les &lt;strong&gt;définitions de zone&lt;/strong&gt; en utilisant l'option &lt;code&gt;--list-all-zones&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Sélection des zones pour les interfaces.
&lt;/h3&gt;

&lt;p&gt;Chaque interface sera mise dans la &lt;strong&gt;&lt;u&gt;zone par défaut&lt;/u&gt;&lt;/strong&gt; au démarrage du pare-feu.&lt;/p&gt;

&lt;h4&gt;
  
  
  3.1. Changer la zone d'une interface.
&lt;/h4&gt;

&lt;p&gt;On peut déplacer une interface entre des zones au cours d'une session en utilisant le paramètre &lt;code&gt;--zone=&lt;/code&gt; en combinaison avec le paramètre &lt;code&gt;--change-interface=&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ex : On peut déplacer l'interface &lt;code&gt;eth0&lt;/code&gt; vers la zone &lt;strong&gt;home&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;home &lt;span class="nt"&gt;--change-interface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;eth0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qlmjbnicahks5eh43zm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qlmjbnicahks5eh43zm.png" alt="Image description" width="403" height="67"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Remarque :&lt;/strong&gt; À chaque fois qu'on déplace une interface vers une nouvelle zone, on doit savoir qu'&lt;strong&gt;&lt;em&gt;on modifie les services qui seront opérationnels&lt;/em&gt;&lt;/strong&gt;. Dans ce cas, on doit &lt;strong&gt;&lt;em&gt;déplacer vers la zone &lt;u&gt;home&lt;/u&gt; pour laquelle SSH est disponible&lt;/em&gt;&lt;/strong&gt;. Cela signifie que la connexion ne devrait pas être interrompue. Certaines autres zones n'ont pas SSH activé par défaut, et &lt;strong&gt;&lt;em&gt;le passage à l'une de ces zones pourrait entraîner une interruption de la connexion&lt;/em&gt;&lt;/strong&gt;, nous empêchant de nous reconnecter à notre serveur.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pour vérifier que le déplacement ait réussi :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--get-active-zones&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbv5tgxx0edwy2c0ypma3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbv5tgxx0edwy2c0ypma3.png" alt="Image description" width="403" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3.2. Ajustement de la zone par défaut.
&lt;/h4&gt;

&lt;p&gt;Si toutes les interfaces peuvent être bien &lt;strong&gt;&lt;em&gt;gérées par une seule zone prédéfinie&lt;/em&gt;&lt;/strong&gt;, on doit désigner cette &lt;strong&gt;zone &lt;em&gt;&lt;u&gt;par défaut&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; avec le paramètre &lt;code&gt;--set-default-zone=&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--set-default-zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;home
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdiofif78jutozmke0byr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdiofif78jutozmke0byr.png" alt="Image description" width="403" height="66"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Définition des règles pour les applications.
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Exceptions du pare-feu.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4.1. Ajouter un service aux zones.
&lt;/h4&gt;

&lt;p&gt;La méthode la plus simple consiste à &lt;strong&gt;ajouter les &lt;em&gt;services&lt;/em&gt; ou les &lt;em&gt;ports&lt;/em&gt; dont on a besoin aux zone qu'on utilise&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On peut obtenir une liste des définitions de services disponibles en utilisant l'option &lt;code&gt;--get-services&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--get-services&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Output
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Remarque :&lt;/strong&gt; On peut trouver plus de détails sur chacun de ces services en consultant leur fichier &lt;code&gt;.xml&lt;/code&gt; associé dans le répertoire &lt;code&gt;/usr/lib/firewalld/services&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Ex :&lt;/strong&gt; Le service SSH est défini comme ceci :&lt;/p&gt;

&lt;p&gt;&lt;em&gt;/usr/lib/firewalld/services/ssh.xml&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;service&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;short&amp;gt;&lt;/span&gt;SSH&lt;span class="nt"&gt;&amp;lt;/short&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;description&amp;gt;&lt;/span&gt;Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.&lt;span class="nt"&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;port&lt;/span&gt; &lt;span class="na"&gt;protocol=&lt;/span&gt;&lt;span class="s"&gt;"tcp"&lt;/span&gt; &lt;span class="na"&gt;port=&lt;/span&gt;&lt;span class="s"&gt;"22"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/service&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour activer un service pour une zone, on peut utiliser le paramètre &lt;code&gt;--add-service=&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Par défaut, cela ajustera uniquement la session actuelle du pare-feu et ne persistera pas au-delà des redémarrages ou des redémarrages du service.&lt;/p&gt;

&lt;p&gt;Heureusement, on peut ajuster la configuration permanente du pare-feu en incluant le flag &lt;code&gt;--permanent&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ex :&lt;/strong&gt; Si on utilise un serveur Web servant du trafic HTTP conventionnel, on peut temporairement autoriser ce trafic pour les interfaces de la zone &lt;strong&gt;public&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http
&lt;span class="c"&gt;# On peut omettre le flag --zone pour modifier la&lt;/span&gt;
&lt;span class="c"&gt;# zone par défaut.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, on peut vérifier que l'opération a réussi en utilisant les flags &lt;code&gt;--list-all&lt;/code&gt; ou &lt;code&gt;--list-services&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--list-services&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6xtd2toop1yni5js6v4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6xtd2toop1yni5js6v4.png" alt="Image description" width="403" height="66"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Désormais, le trafic Web HTTP sur le port 80 est autorisé par notre zone &lt;strong&gt;public&lt;/strong&gt;. Si le serveur Web est configuré pour utiliser &lt;strong&gt;SSL/TLS &lt;em&gt;(Secure Sockets Layer / Transport Layer Security)&lt;/em&gt;&lt;/strong&gt;, on doit également ajouter le service &lt;code&gt;https&lt;/code&gt;. On peut l'ajouter à la session en cours et à l'ensemble de règles permanent :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https &lt;span class="nt"&gt;--permanent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Les services inclus avec l'installation de firewalld représentent la plupart des applications les plus courantes auxquelles on doit peut-être autoriser l'accès. Cependant, &lt;strong&gt;&lt;em&gt;il y aura probablement des scénarios dans lesquels ces services ne répondront pas à nos besoins&lt;/em&gt;&lt;/strong&gt;. Dans cette situation, on a 2 options :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ouvrir un port pour les zones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Définir un service.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4.2. Ouverture d'un port pour les zones.
&lt;/h4&gt;

&lt;p&gt;Le moyen le plus simple d'ajouter la prise en charge de notre application spécifique consiste à &lt;strong&gt;ouvrir &lt;em&gt;&lt;u&gt;les ports qu'elle utilise&lt;/u&gt;&lt;/em&gt; dans la/les zone.s appropriée.s&lt;/strong&gt;. Cela se fait en spécifiant le port ou la plage de ports, ainsi que le protocole associé (TCP ou UDP) pour les ports.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TCP (Transmission Control Protocol) :&lt;/strong&gt; C'est une norme de communication qui permet aux programmes applicatifs et aux dispositifs informatiques d'échanger des messages sur un réseau.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UDP (User Datagram Protocol) :&lt;/strong&gt; C'est un protocole de communication utilisé sur Internet pour les transmissions particulièrement sensibles au facteur temps, telles que la lecture de vidéos ou les recherches DNS.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Par exemple, si notre application s'exécute sur le port 5000 et utilise TCP, on peut l'ajouter temporairement à la zone &lt;code&gt;public&lt;/code&gt; à l'aide du paramètre &lt;code&gt;--add-port&lt;/code&gt;. Les protocoles peuvent être désignés comme suit :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5000/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9n55f9jyuyot9qf62b1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9n55f9jyuyot9qf62b1.png" alt="Image description" width="403" height="66"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On peut vérifier que cela a réussi en utilisant le flag &lt;code&gt;--list-ports&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--list-ports&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9kijmk2e8upxcfbw6n2h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9kijmk2e8upxcfbw6n2h.png" alt="Image description" width="403" height="66"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Il est également possible de spécifier une &lt;strong&gt;&lt;em&gt;plage séquentielle de ports&lt;/em&gt;&lt;/strong&gt; en séparant le port de début et de fin de la plage par un tiret. Par exemple, si notre application utilise les ports UDP 4990 à 4999, on peut les ouvrir publiquement avec :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4990-4999/udp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Après les test, on peut les ajouter au pare-feu permanent de 2 façons :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Utiliser &lt;code&gt;sudo firewall-cmd --runtime-to-permanent&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Réexécuter les commandes avec le flag &lt;code&gt;--permanent&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Utiliser `sudo firewall-cmd --runtime-to-permanent`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--runtime-to-permanent&lt;/span&gt;
&lt;span class="c"&gt;# Réexécuter les commandes avec le flag `--permanent`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5000/tcp
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4990-4999/udp
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--list-ports&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fun3ydmuufnkodlgvuibw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fun3ydmuufnkodlgvuibw.png" alt="Image description" width="403" height="108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4.3. Définir un service.
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;Ouvrir des ports pour nos zones est une solution simple, mais il peut être &lt;strong&gt;&lt;em&gt;difficile de savoir à quoi sert chacune d'entre elles&lt;/em&gt;&lt;/strong&gt;. Si jamais on met hors service un service sur notre serveur, on aura peut-être du mal à cataloguer les ports ouverts qui sont encore requis. Pour éviter cette situation, &lt;strong&gt;&lt;em&gt;&lt;u&gt;on peut définir un noveau service&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Les services sont des &lt;strong&gt;&lt;em&gt;collections de ports&lt;/em&gt; avec un &lt;em&gt;nom&lt;/em&gt; et une &lt;em&gt;description&lt;/em&gt; associés&lt;/strong&gt;. La gestion du pare-feu à l'aide de services est généralement plus facile à gérer que le mappage de ports, mais &lt;strong&gt;&lt;em&gt;&lt;u&gt;nécessite une configuration initiale&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On peut commencer par copier un script existant dans &lt;code&gt;/usr/lib/firewalld/services&lt;/code&gt; vers le répertoire &lt;code&gt;/etc/firewalld/services&lt;/code&gt; où le pare-feu recherche les définitions non standard.&lt;/p&gt;

&lt;p&gt;Par exemple, on peut copier la définition du service SSH à utiliser pour notre &lt;strong&gt;exemple&lt;/strong&gt; de définition de service comme ceci. Le nom du service dans la liste des services de pare-feu sera le nom de ce fichier, moins le suffixe &lt;code&gt;.xml&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, on doit ouvrir le fichier puis le modifier, car actuellement, elle ne contient que la configuration du service SSH :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;service&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;short&amp;gt;&lt;/span&gt;SSH&lt;span class="nt"&gt;&amp;lt;/short&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;description&amp;gt;&lt;/span&gt;Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.&lt;span class="nt"&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;port&lt;/span&gt; &lt;span class="na"&gt;protocol=&lt;/span&gt;&lt;span class="s"&gt;"tcp"&lt;/span&gt; &lt;span class="na"&gt;port=&lt;/span&gt;&lt;span class="s"&gt;"22"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/service&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La majorité de cette définition est constituée de &lt;strong&gt;&lt;em&gt;&lt;u&gt;métadonnées&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On doit &lt;strong&gt;&lt;em&gt;modifier le nom court du service&lt;/em&gt;&lt;/strong&gt; dans les balises &lt;code&gt;&amp;lt;short&amp;gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On doit &lt;strong&gt;&lt;em&gt;ajouter une description&lt;/em&gt;&lt;/strong&gt; afin d'avoir plus d'informations si jamais on a besoin d'auditer le service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;La seule configuration qu'on doit effectuer et qui affecte réellement la fonctionnalité du service sera probablement la &lt;strong&gt;&lt;em&gt;définition du port&lt;/em&gt;&lt;/strong&gt; dans laquelle on identifie le &lt;strong&gt;numéro de port&lt;/strong&gt; et le &lt;strong&gt;protocole&lt;/strong&gt; à ouvrir.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Plusieurs balises  peuvent être spécifiées.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour notre service &lt;code&gt;example&lt;/code&gt;, imaginons qu'on devait ouvrir le port &lt;code&gt;7777&lt;/code&gt; pour &lt;code&gt;TCP&lt;/code&gt; et &lt;code&gt;8888&lt;/code&gt; pour &lt;code&gt;UDP&lt;/code&gt;. On peut modifier la définition existante avec quelque chose comme ceci :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;service&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;short&amp;gt;&lt;/span&gt;Service Exemple&lt;span class="nt"&gt;&amp;lt;/short&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;description&amp;gt;&lt;/span&gt;C'est juste un exemple de service.&lt;span class="nt"&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;port&lt;/span&gt; &lt;span class="na"&gt;protocol=&lt;/span&gt;&lt;span class="s"&gt;"tcp"&lt;/span&gt; &lt;span class="na"&gt;port=&lt;/span&gt;&lt;span class="s"&gt;"7777"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;port&lt;/span&gt; &lt;span class="na"&gt;protocol=&lt;/span&gt;&lt;span class="s"&gt;"udp"&lt;/span&gt; &lt;span class="na"&gt;port=&lt;/span&gt;&lt;span class="s"&gt;"8888"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/service&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, après enregistrement, on peut recharger le pare-feu pour accéder à notre nouveau service :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On peut constater qu'il figure désormais parmi la liste des services disponibles :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--get-services&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;br&gt;
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server &lt;code&gt;example&lt;/code&gt; finger freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server&lt;/p&gt;

&lt;p&gt;On peut désormais utiliser ce service dans les zones comme on le fera normalement.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Création des zones.
&lt;/h3&gt;

&lt;p&gt;Bien que les zones prédéfinies devraient fonctionner pour la plupart des utilisateurs, il peut être utile de &lt;strong&gt;&lt;em&gt;définir nos propres zones qui décrivent davantage leur fonction&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Par exemple, on doit peut-être créer une zone pour notre serveur Web, appelée &lt;code&gt;publicweb&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cependant, on devra peut-être configurer une autre zone pour le service &lt;strong&gt;DNS&lt;/strong&gt; qu'on fournit sur notre réseau privé. On peut créer une autre zone appelée &lt;code&gt;privateDNS&lt;/code&gt; pour cela.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Lors de l'ajout d'une zone, &lt;strong&gt;&lt;em&gt;on doit l'ajouter à la configuration permanente du pare-feu&lt;/em&gt;&lt;/strong&gt;. On peut ensuite &lt;strong&gt;&lt;em&gt;&lt;u&gt;recharger&lt;/u&gt; pour importer la configuration dans notre session en cours&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On peut créer ces 2 zones en utilisant &lt;code&gt;firewall-cmd --new-zone&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--new-zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;publicweb
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--new-zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;privateDNS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vérification :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--get-zones&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;br&gt;
block dmz drop external home internal &lt;code&gt;privateDNS&lt;/code&gt; public &lt;code&gt;publicweb&lt;/code&gt; trusted work&lt;/p&gt;

&lt;p&gt;On doit recharger le pare-feu pour intégrer ces nouvelles zones dans la configuration d'exécution active :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--get-zones&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;br&gt;
block dmz drop external home internal &lt;code&gt;privateDNS&lt;/code&gt; public &lt;code&gt;publicweb&lt;/code&gt; trusted work&lt;/p&gt;

&lt;p&gt;On peut maintenant commencer à &lt;strong&gt;attribuer les &lt;em&gt;&lt;u&gt;services&lt;/u&gt;&lt;/em&gt; et &lt;em&gt;&lt;u&gt;ports&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; appropriés à nos zones. C'est une bonne idée d'&lt;strong&gt;&lt;em&gt;ajuster le pare-feu d'exécution&lt;/em&gt;&lt;/strong&gt;, puis d'&lt;strong&gt;&lt;em&gt;enregistrer ces modifications dans la configuration permanente&lt;/em&gt;&lt;/strong&gt; après les tests.&lt;/p&gt;

&lt;p&gt;Par exemple, pour la zone &lt;code&gt;publicweb&lt;/code&gt;, on peut ajouter les services SSH, HTTP, HTTPS :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;publicweb &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ssh 
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;publicweb &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;publicweb &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;publicweb &lt;span class="nt"&gt;--list-all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F095lqnpo8389jutadvs4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F095lqnpo8389jutadvs4.png" alt="Image description" width="403" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ensuite, on peut ajouter le service DNS à notre zone &lt;code&gt;privateDNS&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;privateDNS &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dns
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;privateDNS &lt;span class="nt"&gt;--list-all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ajorh2u98jkpxa1ujjh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ajorh2u98jkpxa1ujjh.png" alt="Image description" width="403" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ensuite, on peut basculer nos interfaces sur ces nouvelles zones pour les tester :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;publicweb &lt;span class="nt"&gt;--change-interface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;eth0
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;privateDNS &lt;span class="nt"&gt;--change-interface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;eth1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;À ce stade, on a la possibilité de tester notre configuration. Si ces valeurs nous conviennent, on doit ajouter ces règles à la configuration permanente.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;--permanent&lt;/code&gt; : on doit réexécuter toutes les commandes précédentes avec ce flag, sinon :&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;--runtime-to-permanent&lt;/code&gt; : permet d'enregistrer définitivement l'intégralité de notre configuration d'exécution :&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--runtime-to-permanent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, on doit recharger le pare-feu pour tester que les modifications persistent :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vérification des zones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--get-active-zones&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F95b2khrpgorlsf8tlszu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F95b2khrpgorlsf8tlszu.png" alt="Image description" width="403" height="124"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vérification des services appropriés pour chaque zone :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;publicweb &lt;span class="nt"&gt;--list-services&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81vvx2boa3okojxyxk9j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81vvx2boa3okojxyxk9j.png" alt="Image description" width="403" height="67"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;privateDNS &lt;span class="nt"&gt;--list-services&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jlz34tyiukkvnp2wxeo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jlz34tyiukkvnp2wxeo.png" alt="Image description" width="403" height="67"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pour faire d'une de ces zones la zone par défaut pour les autres interfaces, on peut configurer ce comportement avec le paramètre &lt;code&gt;--set-default-zone=&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--set-default-zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;publicweb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;À RETENIR&lt;/u&gt; :&lt;/strong&gt; Le service firewalld permet de &lt;strong&gt;&lt;em&gt;configurer des règles et des ensembles de règles maintenables&lt;/em&gt;&lt;/strong&gt; qui prennent en compte notre &lt;strong&gt;&lt;u&gt;environnement réseau&lt;/u&gt;&lt;/strong&gt;. Il nous permet d'&lt;strong&gt;&lt;em&gt;effectuer une transition transparente entre différentes politiques de pare-feu&lt;/em&gt;&lt;/strong&gt; grâce à l'utilisation de &lt;strong&gt;&lt;em&gt;&lt;u&gt;zones&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;. Acquérir une connaissance pratique de ce système nous permettra de profiter de la flexibilité et de la puissance qu'offre cet outil.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  XII. &lt;u&gt;Comment modifier le hostname dans le terminal&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;Sous Linux, la commande &lt;code&gt;hostnamectl&lt;/code&gt; sert à gérer le nom d'hôte de la machine : elle est très pratique si l'on souhaite &lt;strong&gt;donner un autre nom à son &lt;em&gt;serveur&lt;/em&gt; ou son &lt;em&gt;poste de travail&lt;/em&gt;&lt;/strong&gt; à partir de la ligne de commande.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ici, nous prendrons l'exemple d'une machine Debian 11 mais &lt;strong&gt;elle fonctionne de la même façon sur les systèmes Linux où il y a &lt;em&gt;systemd&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. La commande &lt;code&gt;hostnamectl&lt;/code&gt;.
&lt;/h3&gt;

&lt;p&gt;Le &lt;code&gt;hostname&lt;/code&gt; d'une machine correspond à son &lt;strong&gt;nom d'hôte&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;La commande &lt;strong&gt;&lt;em&gt;hostnamectl&lt;/em&gt; sert à gérer le nom d'hôte&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sous linux, le nom d'hôte est stocké dans le fichier &lt;code&gt;/etc/hostname&lt;/code&gt; du système. De ce fait, la commande var permettre de changer le nom d'hôte sans avoir à ouvrir et éditer manuellement ce fichier.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cette commande est simple à utiliser, mais elle est indispensable pour toutes les personnes qui souhaitent apprendre l'administration de Linux.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Comment afficher le nom d'hôte actuel ?
&lt;/h3&gt;

&lt;p&gt;Pour visualiser le nom actuel, on peut :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lire le contenu du fichier &lt;code&gt;/etc/hostname&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/hostname
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;utiliser la commande &lt;code&gt;hostname&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;utiliser la commande &lt;code&gt;hostnamectl&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pour l'affichage de tous les informations :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;hostnamectl

&lt;span class="c"&gt;# Pour l'affichage du nom d'hôte uniquement :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;hostnamectl &lt;span class="nb"&gt;hostname&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On peut aussi obtenir le nom de la machine en regardant le prompt du Terminal. Ex : &lt;code&gt;root@debian&lt;/code&gt; signifie que l'on est connecté avec &lt;strong&gt;root&lt;/strong&gt; sur la machine &lt;strong&gt;debian&lt;/strong&gt;. [Parfois, ce nom n'est pas convainquant car il peut n'afficher qu'une partie du nom et non pas le nom au complet].&lt;/p&gt;

&lt;p&gt;La commande &lt;strong&gt;hostnamectl&lt;/strong&gt; retourne d'autres informations comme :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;le type de châssis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;l'ID de la machine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;le système d'exploitation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;la version du noyau Linux.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;l'architecture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Le fabriquant du matériel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Le model du matériel, ...&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Comment utiliser la commande hostnamectl ?
&lt;/h3&gt;

&lt;p&gt;Sous Linux, la commande &lt;code&gt;hostnamectl&lt;/code&gt; est capable de gérer 2 noms d'hôtes différents :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Le nom d'hôte statique :&lt;/strong&gt; c'est le nom d'hôte &lt;strong&gt;principal&lt;/strong&gt;, indiqué dans le fichier &lt;code&gt;/etc/hostname&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Le nom d'hôte &lt;em&gt;pretty&lt;/em&gt; :&lt;/strong&gt; c'est le &lt;strong&gt;nom d'usage&lt;/strong&gt;, qui est &lt;strong&gt;secondaire&lt;/strong&gt; et qui sera inclus à &lt;code&gt;/etc/machine-info&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L'objectif est de changer le nom d'hôte vers un nouveau nom :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;hostnamectl set-hostname new-name
&lt;span class="c"&gt;# ou&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;hostnamectl set-hostname new-name &lt;span class="nt"&gt;--static&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suite à cette commande, le contenu du fichier &lt;code&gt;/etc/hostname&lt;/code&gt; est différent : il retourne "new-name"!&lt;/p&gt;

&lt;p&gt;Maintenant, on va déterminer un nom secondaire (&lt;em&gt;pretty&lt;/em&gt;) pour cette machine, où l'on va pouvoir être plus précis. Par exemple, le nom "new-name test.mg" en utilisant l'option &lt;code&gt;--pretty&lt;/code&gt; à la place de &lt;code&gt;--static&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;hostnamectl set-hostname &lt;span class="s2"&gt;"My new host name new-name test.mg"&lt;/span&gt; &lt;span class="nt"&gt;--pretty&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, si l'on regarde le nom d'hôte avec hostnamectl, on peut voir l'apparition d'une nouvelle ligne!&lt;/p&gt;

&lt;p&gt;Quant au fichier &lt;code&gt;/etc/machine-info&lt;/code&gt;, il existe et contient bien cette information.&lt;/p&gt;

&lt;p&gt;Pour afficher uniquement le nom statique ou le nom pretty, on peut utiliser l'une des 2 commandes suivantes :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;hostnamectl &lt;span class="nt"&gt;--static&lt;/span&gt; status
&lt;span class="nv"&gt;$ &lt;/span&gt;hostnamectl &lt;span class="nt"&gt;--pretty&lt;/span&gt; status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Modifier le nom d'hôte dans Debian à l'aide de &lt;code&gt;/etc/hosts&lt;/code&gt;.
&lt;/h3&gt;

&lt;p&gt;Après avoir changé le nom d'hôte manuellement à partir du fichier &lt;code&gt;/etc/hostname&lt;/code&gt;, il serait préférable de modifier aussi le fichier &lt;code&gt;/etc/hosts&lt;/code&gt; en remplaçant l'ancien nom d'hôte par le nouveau :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.0.1        localhost
12.0.0.1         new-hostname
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;N.B. :&lt;/strong&gt; Si on n'effectue pas cette étape, on rencontrera le message d'avertissement &lt;strong&gt;"sudo: unable to resolve host"&lt;/strong&gt; à chaque fois qu'on exécute &lt;strong&gt;&lt;em&gt;sudo&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  XIII. &lt;u&gt;Comment creer, modifier, supprimer un utilisateur&lt;/u&gt;.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Définition.
&lt;/h3&gt;

&lt;p&gt;Un utilisateur se définit comme suit dans le fichier &lt;code&gt;/etc/passwd&lt;/code&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login&lt;/li&gt;
&lt;li&gt;Mot de passe&lt;/li&gt;
&lt;li&gt;UID&lt;/li&gt;
&lt;li&gt;GID du &lt;strong&gt;groupe principal&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Commentaire&lt;/li&gt;
&lt;li&gt;Répertoire de connexion&lt;/li&gt;
&lt;li&gt;Interpréteur de commandes (&lt;code&gt;/bin/bash&lt;/code&gt;, &lt;code&gt;/bin/nologin&lt;/code&gt;, ...).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il existe 3 types d'utilisateurs :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;root :&lt;/strong&gt; Administrateur du système.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;utilisateur système :&lt;/strong&gt; Utilisé par le système pour la &lt;strong&gt;&lt;em&gt;gestion des droits d'accès&lt;/em&gt;&lt;/strong&gt; des applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;utilisateur ordinaire (ou utilisateur commun) :&lt;/strong&gt; Autre compte permettant de se connecter au système.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fichiers modifiés, ajout de lignes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/passwd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/shadow&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Types d'utilisateurs.
&lt;/h3&gt;

&lt;h4&gt;
  
  
  2.1. Utilisateur racine.
&lt;/h4&gt;

&lt;p&gt;L'utilisateur &lt;code&gt;root&lt;/code&gt; est l'administrateur du système d'exploitation et &lt;strong&gt;dispose de &lt;em&gt;&lt;u&gt;toutes&lt;/u&gt;&lt;/em&gt; les autorisations nécessaires pour effectuer des opérations&lt;/strong&gt;. En général, seul l'&lt;code&gt;utilisateur root&lt;/code&gt; peut installer/désinstaller ou mettre à jour les programmes et bibliothèques de base du système. Il s'agit d'&lt;strong&gt;un seul compte utilisateur disposant de privilèges sur l'ensemble du système&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;L'utilisateur root est donc l'utilisateur le plus puissant du système.&lt;/p&gt;

&lt;h4&gt;
  
  
  2.2. Utilisateur spécial.
&lt;/h4&gt;

&lt;p&gt;Il s'agit des utilisateurs qui &lt;strong&gt;&lt;em&gt;n'ont pas d'identifiant&lt;/em&gt;&lt;/strong&gt;. Ils ne disposent pas de tous les privilèges de l'utilisateur &lt;code&gt;root&lt;/code&gt;. En fonction du compte, ils assument différents rôles spécialisés.&lt;/p&gt;

&lt;p&gt;Ceux-ci sont &lt;strong&gt;&lt;u&gt;&lt;em&gt;créés automatiquement&lt;/em&gt;&lt;/u&gt; lors de l'installation d'une application&lt;/strong&gt;. &lt;code&gt;bin&lt;/code&gt;, &lt;code&gt;sync&lt;/code&gt;, &lt;code&gt;lp&lt;/code&gt;, &lt;code&gt;mail&lt;/code&gt;, &lt;code&gt;operator&lt;/code&gt;, &lt;code&gt;squid&lt;/code&gt; sont quelques exemples d'utilisateurs spéciaux.&lt;/p&gt;

&lt;h4&gt;
  
  
  2.3. Utilisateurs ordinaires.
&lt;/h4&gt;

&lt;p&gt;Les utilisateurs communs ne disposent de tous les privilèges que dans leur répertoire de travail, généralement leur répertoire personnel. &lt;strong&gt;&lt;em&gt;Ils n'ont pas les privilèges nécessaires pour &lt;u&gt;gérer le système&lt;/u&gt; ou &lt;u&gt;installer le logiciel&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;. Ils ne peuvent pas effectuer ces tâches sans disposer de privilèges spéciaux via &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Ajout d'un utilisateur.
&lt;/h3&gt;

&lt;p&gt;Sur un système basé sur Debian, il existe plusieurs options pour ajouter des utilisateurs à partir de l'interface de gestion. La première commande est &lt;code&gt;adduser&lt;/code&gt;, &lt;strong&gt;qui est un script Perl et utilise la commande&lt;/strong&gt; &lt;code&gt;useradd&lt;/code&gt; dans le backend dont on verra l'utilisation plus tard.&lt;/p&gt;

&lt;p&gt;Il faut utiliser la commande &lt;code&gt;sudo&lt;/code&gt; comme préfixe et &lt;code&gt;nom d'utilisateur&lt;/code&gt; comme argument.&lt;/p&gt;

&lt;h4&gt;
  
  
  3.1. La commande &lt;code&gt;useradd&lt;/code&gt; (low level).
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Syntaxe&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;ROOT]&lt;span class="nv"&gt;$ &lt;/span&gt;useradd &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-u&lt;/span&gt; UID] &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;GID] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-d&lt;/span&gt; répertoire] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-s&lt;/span&gt; shell] login

&lt;span class="c"&gt;# Exemple :&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;ROOT]&lt;span class="nv"&gt;$ &lt;/span&gt;useradd &lt;span class="nt"&gt;-u&lt;/span&gt; 1000 &lt;span class="nt"&gt;-g&lt;/span&gt; 513 &lt;span class="nt"&gt;-d&lt;/span&gt; /home/GroupeA/asjosvah  &lt;span class="nt"&gt;-s&lt;/span&gt; /bin/sh asjosvah
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Options de la commande useradd :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F07vfiu7waew7ncdshsio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F07vfiu7waew7ncdshsio.png" alt="Image description" width="493" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠⚠⚠ &lt;strong&gt;&lt;em&gt;À la création, le compte &lt;u&gt;ne possède pas de mot de passe&lt;/u&gt; et est &lt;u&gt;verrouillé/inactif&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;. Il faut assigner un mot de passe pour déverrouiller/activer le compte. Pour ce faire, on doit utiliser la commande &lt;code&gt;passwd&lt;/code&gt; pour attribuer un mot de passe après le création du compte.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;passwd asjosvah
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Règles de nommage des comptes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pas d'accents, de majuscules ni caractères spéciaux : &lt;strong&gt;: " # , = \ / ? '&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Différents du nom d'un groupe ou fichier système existant.&lt;/li&gt;
&lt;li&gt;Définir les options &lt;strong&gt;-u&lt;/strong&gt;, &lt;strong&gt;-g&lt;/strong&gt; et &lt;strong&gt;-s&lt;/strong&gt; à la création.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2bx5buhrcog2jgg5q67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2bx5buhrcog2jgg5q67.png" alt="Image description" width="505" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Un utilisateur peut faire partie de plusieurs groupes en plus de son groupe principal.&lt;/p&gt;

&lt;p&gt;Pour les groupes secondaires, il faut utiliser l'option &lt;strong&gt;-G&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;ROOT]&lt;span class="nv"&gt;$ &lt;/span&gt;useradd &lt;span class="nt"&gt;-u&lt;/span&gt; 500 &lt;span class="nt"&gt;-g&lt;/span&gt; GroupA &lt;span class="nt"&gt;-G&lt;/span&gt; GroupP, GroupC &lt;span class="nt"&gt;-d&lt;/span&gt; /home/GroupA/asjosvah &lt;span class="nt"&gt;-s&lt;/span&gt; /bin/sh - asjosvah
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On peut modifier les valeurs par défaut de création d'utilisateur, en modifiant le fichier &lt;code&gt;/etc/default/useradd&lt;/code&gt; avec la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;ROOT]&lt;span class="nv"&gt;$ &lt;/span&gt;useradd &lt;span class="nt"&gt;-D&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-b&lt;/span&gt; répertoire_base_dir] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-g&lt;/span&gt; groupe] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-s&lt;/span&gt; shell]

&lt;span class="c"&gt;# Exemple :&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;ROOT]&lt;span class="nv"&gt;$ &lt;/span&gt;useradd &lt;span class="nt"&gt;-D&lt;/span&gt; &lt;span class="nt"&gt;-b&lt;/span&gt; /home &lt;span class="nt"&gt;-g&lt;/span&gt; 500 &lt;span class="nt"&gt;-s&lt;/span&gt; /bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voici les options de la commande useradd pour modifier les valeurs par défaut :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgd9ddqdmonaflqw0dsfl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgd9ddqdmonaflqw0dsfl.png" alt="Image description" width="541" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3.2. La commande &lt;code&gt;adduser&lt;/code&gt; (préférable).
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;adduser johndoe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;D'autres détails peuvent être spécifiés à l'invite. À l'exception du nom d'utilisateur et du mot de passe, les autres détails sont facultatifs.&lt;/p&gt;

&lt;p&gt;On peut vérifier que l'utilisateur a été créé en utilisant la commande &lt;code&gt;id&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;adduser johndoe
Ajout de l&lt;span class="s1"&gt;'utilisateur `johndoe'&lt;/span&gt; ...
Ajout d&lt;span class="s1"&gt;'un nouveau groupe `johndoe'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;1003&lt;span class="o"&gt;)&lt;/span&gt; ...
Ajout d&lt;span class="s1"&gt;'un nouvel utilisateur `johndoe'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;1003&lt;span class="o"&gt;)&lt;/span&gt; avec le groupe &lt;span class="sb"&gt;`&lt;/span&gt;johndoe&lt;span class="s1"&gt;' ...
Création du répertoire personnel `/home/johndoe'&lt;/span&gt; ...
Copie des fichiers de &lt;span class="sb"&gt;`&lt;/span&gt;/etc/skel&lt;span class="s1"&gt;' ...
Nouveau mot de passe :
Retapez le nouveau mot de passe :
passwd : password updated successfully
Modification des informations de l'&lt;/span&gt;utilisateur pour johndoe
Saisissez la nouvelle valeur ou appuyez sur ENTRÉE pour la valeur par défaut
        Nom complet &lt;span class="o"&gt;[]&lt;/span&gt; : John Doe
        Numéro de chambre &lt;span class="o"&gt;[]&lt;/span&gt; :
        Téléphone professionnel &lt;span class="o"&gt;[]&lt;/span&gt; :
        Téléphone à domicile &lt;span class="o"&gt;[]&lt;/span&gt; :
        Autre &lt;span class="o"&gt;[]&lt;/span&gt; :
Les informations sont-elles correctes ? &lt;span class="o"&gt;[&lt;/span&gt;O/n] O
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;id &lt;/span&gt;johndoe
&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1003&lt;span class="o"&gt;(&lt;/span&gt;johndoe&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1003&lt;span class="o"&gt;(&lt;/span&gt;johndoe&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1003&lt;span class="o"&gt;(&lt;/span&gt;johndoe&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Modification de l'utilisateur.
&lt;/h3&gt;

&lt;p&gt;Il est souvent nécessaire de &lt;strong&gt;&lt;em&gt;modifier certaines &lt;u&gt;propriétés&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; des utilisateurs existants en fonction des &lt;strong&gt;&lt;em&gt;besoins de l'organisation&lt;/em&gt;&lt;/strong&gt;, des &lt;strong&gt;&lt;em&gt;demandes des utilisateurs&lt;/em&gt;&lt;/strong&gt; ou des &lt;strong&gt;&lt;em&gt;migrations du système&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;La plupart de ces propriétés sont faciles à modifier, mais il faut s'assurer de l'&lt;strong&gt;impact sur l'environnement de l'utilisateur&lt;/strong&gt; et &lt;strong&gt;sur l'accès aux fichiers qu'il possède ou auxquels il accède&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On peut modifier les propriétés suivantes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shell par défaut&lt;/li&gt;
&lt;li&gt;Répertoire personnel&lt;/li&gt;
&lt;li&gt;ID de l'utilisateur&lt;/li&gt;
&lt;li&gt;Groupe par défaut&lt;/li&gt;
&lt;li&gt;Ajout/suppression de groupe&lt;/li&gt;
&lt;li&gt;Commentaire GECOS (General Electric Comprehensive Operating System).&lt;/li&gt;
&lt;li&gt;Nom d'utilisateur&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4.1. Modification du shell par défaut.
&lt;/h4&gt;

&lt;p&gt;L'interpréteur de commandes par défaut est l'interpréteur de commandes créé lorsqu'un utilisateur lance une nouvelle session d'interpréteur de commandes, soit localement, soit via &lt;strong&gt;SSH&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;La plupart des systèmes modernes disposent d'un &lt;code&gt;Bash&lt;/code&gt; utilisateur par défaut, bien qu'il puisse varier en fonction de la &lt;strong&gt;&lt;em&gt;distribution Linux&lt;/em&gt;&lt;/strong&gt; ou de l'&lt;strong&gt;&lt;em&gt;environnement de l'utilisateur&lt;/em&gt;&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# sudo usermod -s new_interpreter&lt;/span&gt;

&lt;span class="c"&gt;# Exemple :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;getent passwd asjosvah
asjosvah:x:1005:1005::/data/newhome:/bin/sh
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-s&lt;/span&gt; /bin/bash asjosvah
&lt;span class="nv"&gt;$ &lt;/span&gt;getent passwd asjosvah
asjosvah:x:1005:1005::/data/newhome:/bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comme on peut le voir, le shell a été modifié de &lt;code&gt;/bin/sh&lt;/code&gt; à &lt;code&gt;/bin/bash&lt;/code&gt; pour l'utilisateur &lt;code&gt;asjosvah&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.2. Modification du répertoire personnel.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# sudo usermod -d [new_path_dir] [login]&lt;/span&gt;

&lt;span class="c"&gt;# Exemple :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;getent passwd asjosvah
asjosvah:x:1005:1005::/data/newhome:/bin/bash
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-d&lt;/span&gt; /data/asjosvah asjosvah
&lt;span class="nv"&gt;$ &lt;/span&gt;getent passwd asjosvah
asjosvah:x:1005:1005::/data/asjosvah:/bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comme on peut le voir, le répertoire personnel a été modifié de &lt;code&gt;/data/newhome&lt;/code&gt; à &lt;code&gt;/data/asjosvah&lt;/code&gt; pour l'utilisateur &lt;code&gt;asjosvah&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANT :&lt;/strong&gt; Avant de procéder au changement, on doit s'assurer que le nouveau répertoire dispose des &lt;strong&gt;&lt;em&gt;droits de propriété&lt;/em&gt;&lt;/strong&gt; et des &lt;strong&gt;&lt;em&gt;autorisations nécessaires&lt;/em&gt;&lt;/strong&gt;. Dans le cas contraire, l'utilisateur risque de rencontrer des problèmes lors de la connexion ou du travail dans le nouveau répertoire personnel.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  4.3. Modification de l'ID de l'utilisateur.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# sudo usermod -u [new_UID] [login]&lt;/span&gt;

&lt;span class="c"&gt;# Exemple :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;getent passwd asjosvah
asjosvah:x:1005:1005::/data/asjosvah:/bin/bash
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-u&lt;/span&gt; 1010 asjosvah
&lt;span class="nv"&gt;$ &lt;/span&gt;getent passwd asjosvah
asjosvah:x:1010:1005::/data/asjosvah:/bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comme on peut le voir, l'UID a été modifié de &lt;code&gt;1005&lt;/code&gt; à &lt;code&gt;1010&lt;/code&gt; pour l'utilisateur &lt;code&gt;asjosvah&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANT :&lt;/strong&gt; La modification de l'UID change la façon dont le système de fichiers Linux attribue la propriété et l'autorisation à un fichier ou à un répertoire. &lt;strong&gt;&lt;em&gt;On doit s'assurer que le répertoire personnel de l'utilisateur et son contenu, ainsi que tous les autres fichiers du système appartenant à l'origine à l'utilisateur (avec l'ancien UID), sont modifiés pour être mappés avec l'UID&lt;/em&gt;&lt;/strong&gt;. Si on ne le fait pas, on risque de rencontrer des problèmes lors de la session CLI et de l'accès aux fichiers par l'utilisateur.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  4.4. Modification du groupe par défaut.
&lt;/h4&gt;

&lt;p&gt;C'est généralement l'ID de groupe par défaut de l'utilisateur, qui est créé lors de la création de l'utilisateur, à moins qu'un autre GID ne soit spécifié.&lt;/p&gt;

&lt;p&gt;On peut modifier le groupe par défaut d'un utilisateur :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# sudo usermod -g [new_GID] [login]&lt;/span&gt;

&lt;span class="c"&gt;# Exemple :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;getent passwd asjosvah
asjosvah:x:1010:1005::/data/asjosvah:/bin/bash
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-g&lt;/span&gt; 1001 asjosvah
asjosvah:x:1010:1001::/data/asjosvah:/bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comme on peut le voir, le GID a été modifié de &lt;code&gt;1005&lt;/code&gt; à &lt;code&gt;1001&lt;/code&gt; pour l'utilisateur &lt;code&gt;asjosvah&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANT :&lt;/strong&gt; On doit s'assurer que le nouveau GID est défini dans le &lt;strong&gt;&lt;em&gt;répertoire personnel&lt;/em&gt;&lt;/strong&gt; de l'utilisateur, dans son &lt;strong&gt;&lt;em&gt;contenu&lt;/em&gt;&lt;/strong&gt; et dans tous les &lt;strong&gt;&lt;em&gt;autres fichiers ou répertoires&lt;/em&gt;&lt;/strong&gt; applicables afin de migrer correctement leurs droits de propriété.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  4.5. Ajout de groupe.
&lt;/h4&gt;

&lt;p&gt;Un utilisateur peut faire partie de groupes secondaires. Il est possible d'ajouter ou de supprimer des groupes supplémentaires auxquels un utilisateur appartient :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# sudo usermod -a -G [group_name_to_add_to_login] [login]&lt;/span&gt;
&lt;span class="c"&gt;# ou&lt;/span&gt;
&lt;span class="c"&gt;# sudo gpasswd -a [login] [group_name_to_add_to_login]&lt;/span&gt;


&lt;span class="c"&gt;# Exemple :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;id &lt;/span&gt;asjosvah
&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-G&lt;/span&gt; docker asjosvah
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;id &lt;/span&gt;asjosvah
&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt;,1001&lt;span class="o"&gt;(&lt;/span&gt;docker&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comme on peut le voir, la liste des groupes secondaires a été modifié de &lt;code&gt;groups=1005(asjosvah)&lt;/code&gt; à &lt;code&gt;groups=1005(asjosvah),1001(docker)&lt;/code&gt; pour l'utilisateur &lt;code&gt;asjosvah&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.6. Suppression de groupe d'un utilisateur.
&lt;/h4&gt;

&lt;p&gt;Pour supprimer un utilisateur de l'un des groupes secondaires, on peut utiliser la commande &lt;code&gt;gpasswd&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# sudo gpasswd -d [login] [group_to_remove_from_login]&lt;/span&gt;
&lt;span class="c"&gt;# ou&lt;/span&gt;
&lt;span class="c"&gt;# sudo deluser [login] [group_to_remove_from_login]&lt;/span&gt;


&lt;span class="c"&gt;# Exemple :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;id &lt;/span&gt;asjosvah
&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt;,1001&lt;span class="o"&gt;(&lt;/span&gt;docker&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;gpasswd &lt;span class="nt"&gt;-d&lt;/span&gt; asjosvah docker
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;id &lt;/span&gt;asjosvah
&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comme on peut le voir, la liste des groupes secondaires a été modifié de &lt;code&gt;groups=1005(asjosvah),1001(docker)&lt;/code&gt; à &lt;code&gt;groups=1005(asjosvah)&lt;/code&gt; pour l'utilisateur &lt;code&gt;asjosvah&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.7. Modification du commentaire GECOS.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# sudo usermod -c [COMMENT_OR_USER_INFO]&lt;/span&gt;

&lt;span class="c"&gt;# Exemple :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;getent passwd asjosvah
asjosvah:x:1005:1005::/data/asjosvah:/bin/bash

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"As Josvah - System Admin"&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;getent passwd asjosvah
asjosvah:x:1005:1005:As Josvah - System Admin:/data/asjosvah:/bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comme on peut le voir, le commentaire GECOS a été modifié de &lt;code&gt;&lt;/code&gt; à &lt;code&gt;As Josvah - System Admin&lt;/code&gt; pour l'utilisateur &lt;code&gt;asjosvah&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.8. Modification du nom d'utilisateur.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# sudo usermod -l [new_login_username] [old_login_username]&lt;/span&gt;

&lt;span class="c"&gt;# Exemple :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;id &lt;/span&gt;asjosvah
&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-l&lt;/span&gt; as_josvah asjosvah
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;id &lt;/span&gt;as_josvah
&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;as_josvah&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANT :&lt;/strong&gt; Il ne faut pas oublier de mettre à jour les références de l'utilisateur en fonction du nouveau nom lorsqu'il est utilisé. Même dans des commandes comme &lt;code&gt;id&lt;/code&gt;, le nouveau nom d'utilisateur doit être spécifié.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  5. Suppression d'un utilisateur.
&lt;/h3&gt;

&lt;h4&gt;
  
  
  5.1. La commande &lt;code&gt;userdel&lt;/code&gt; (préférable).
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# sudo userdel [login]&lt;/span&gt;

&lt;span class="c"&gt;# Exemple :&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;id &lt;/span&gt;asjosvah
&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1005&lt;span class="o"&gt;(&lt;/span&gt;asjosvah&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;userdel asjosvah
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;id &lt;/span&gt;asjosvah
&lt;span class="nb"&gt;id&lt;/span&gt; : &lt;span class="s1"&gt;'asjosvah'&lt;/span&gt; : no such user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour supprimer un utilisateur ainsi que son répertoire personnel et son répertoire de courrier, on ajoute le flag &lt;code&gt;-r&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;userdel &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;login]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5.2. La commande &lt;code&gt;deluser&lt;/code&gt;.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;deluser &lt;span class="o"&gt;[&lt;/span&gt;login]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour supprimer le répertoire personnel et le spool de courrier, on ajoute le flag &lt;code&gt;--remove-home&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;deluser &lt;span class="nt"&gt;--remove-home&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;login]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Le fichier &lt;code&gt;/etc/passwd&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fou8erb20uwcxz7qkg2n6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fou8erb20uwcxz7qkg2n6.png" alt="Image description" width="532" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Le fichier &lt;code&gt;/etc/shadow&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffvkqpux0lt3qi2z1wqae.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffvkqpux0lt3qi2z1wqae.png" alt="Image description" width="536" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  XIV. &lt;u&gt;Comment gérer les groupes ?&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;Un utilisateur faisant obligatoirement partie d'un groupe, il est préférable de créer les groupes avant d'ajouter les utilisateurs. Par conséquent, &lt;strong&gt;un groupe peut ne pas avoir de membres&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Chaque groupe possède un &lt;strong&gt;GID unique&lt;/strong&gt;. Un groupe peut être dupliqué. Par convention, &lt;strong&gt;les GID des groupes systèmes vont de 0 (root) à 499&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Création d'un groupe dans le système.
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;ROOT]&lt;span class="nv"&gt;$ &lt;/span&gt;groupadd &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-g&lt;/span&gt; GID] &lt;span class="o"&gt;[&lt;/span&gt;nom_groupe]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg37fsdfdc9g2n1g7hgin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg37fsdfdc9g2n1g7hgin.png" alt="Image description" width="536" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Règles de nommage des groupes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pas d'accents, ni caractères spéciaux.&lt;/li&gt;
&lt;li&gt;Différents du nom d'utilisateur ou fichier système existant.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Modification de l'information du groupe existant.
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;ROOT]&lt;span class="nv"&gt;$ &lt;/span&gt;groupmod &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-g&lt;/span&gt; new_GID] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-n&lt;/span&gt; nouveau_nom] ancien_nom 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Suppression d'un groupe dans le système.
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;ROOT]&lt;span class="nv"&gt;$ &lt;/span&gt;groupdel &lt;span class="o"&gt;[&lt;/span&gt;nom_groupe]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Ajout d'un groupe existant à un utilisateur.
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;adduser &lt;span class="o"&gt;[&lt;/span&gt;login] &lt;span class="o"&gt;[&lt;/span&gt;groupe]

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;useradd &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;UID] &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;groupe_principal] &lt;span class="nt"&gt;-G&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;groupes_secondaires] &lt;span class="o"&gt;[&lt;/span&gt;login]

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;gpasswd &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;login] &lt;span class="o"&gt;[&lt;/span&gt;groupe] 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Suppression d'un utilisateur dans un groupe.
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;deluser &lt;span class="o"&gt;[&lt;/span&gt;login] &lt;span class="o"&gt;[&lt;/span&gt;groupe]

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;gpasswd &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;login] &lt;span class="o"&gt;[&lt;/span&gt;groupe]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Le fichier &lt;code&gt;/etc/group&lt;/code&gt;.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbnjfzhincjk24it3cgti.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbnjfzhincjk24it3cgti.png" alt="Image description" width="536" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Le fichier &lt;code&gt;/etc/gshadow&lt;/code&gt;.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv5aj4ff1cn4ymkv02e9q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv5aj4ff1cn4ymkv02e9q.png" alt="Image description" width="536" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  XV. &lt;u&gt;Comment limiter le nombre d'essai d'authentification en utilisant sudo&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;Pour limiter le nombre d'essais d'authentification sous Debian, on peut utiliser le &lt;strong&gt;&lt;em&gt;module PAM (Pluggable Authentication Modules)&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;pam_tally2&lt;/code&gt; ou &lt;code&gt;pam_faillock&lt;/code&gt;. Voici comment procéder en utilisant &lt;code&gt;pam_faillock&lt;/code&gt;, qui est une méthode moderne et souvent recommandée pour gérer les tentatives de connexion infructueuses.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;PAM (Pluggable Authentication Modules)&lt;/strong&gt; : c'est un &lt;strong&gt;&lt;em&gt;framework&lt;/em&gt;&lt;/strong&gt; flexible pour &lt;strong&gt;&lt;em&gt;gérer les mécanismes d'authentification&lt;/em&gt;&lt;/strong&gt; sur les systèmes Unix et Linux. Il permet &lt;strong&gt;&lt;em&gt;&lt;u&gt;d'ajouter, de supprimer ou de configurer les méthodes d'authentification&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; de manière modulaire et centralisée sans avoir à modifier les applications elles-mêmes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. Étapes pour configurer &lt;code&gt;pam_faillock&lt;/code&gt;.
&lt;/h3&gt;

&lt;p&gt;1) Installer &lt;code&gt;libpam-modules&lt;/code&gt; (si ce n'est pas déjà fait) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;libpam-modules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) Configurer PAM pour utiliser &lt;code&gt;pam_faillock&lt;/code&gt; :&lt;br&gt;
    - Modifier le fichier &lt;code&gt;/etc/pam.d/common-auth&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;auth    required      pam_faillock.so preauth silent deny=3 unlock_time=600 # unlock_time=0 pour ne jamais verrouiller l'utilisateur.
auth    [default=die] pam_faillock.so authfail deny=3 unlock_time=600 # unlock_time=0 pour ne jamais verrouiller l'utilisateur.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ces lignes signifient :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;deny=3&lt;/code&gt; : Bloque l'utilisateur après 3 tentatives échouées.&lt;br&gt;
&lt;code&gt;unlock_time=600&lt;/code&gt; : Déverrouille l'utilisateur après 600 secondes (10 minutes).&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Modifier le fichier `/etc/pam.d/common-account` :
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;account required pam_faillock.so
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;3) Sauvegarder et fermer les fichiers.&lt;/p&gt;

&lt;p&gt;4) Tester la configuration.&lt;/p&gt;

&lt;p&gt;On peut maintenant tester la configuration en tentant de nous connecter avec un mot de passe incorrect plusieurs fois. Après le nombre de tentatives échouées spécifiées, le compte devrait être vérrouillé temporairement.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Recommandations.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sauvegarde&lt;/strong&gt; : Avant de modifier les fichiers PAM, il est recommandé de créer une sauvegarde des fichiers de configuration actuels.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /etc/pam.d/common-auth /etc/pam.d/common-auth.bak
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /etc/pam.d/common-account /etc/pam.d/common-account.bak
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Précautions&lt;/strong&gt; : On doit toujours être prudent lors de la modification des fichiers PAM, car une mauvaise configuration peut entraîner des problèmes d'accès au système. On doit s'assurer de suivre les étapes attentivement.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  XVI. &lt;u&gt;Comment afficher un message en cas d'erreur d'authentification&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;Pour afficher un message personnalisé en cas d'erreur d'authentification sur Debian en utilisant PAM, on peut utiliser le module &lt;code&gt;pam_echo&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Créer un fichier contenant le message d'erreur.
&lt;/h3&gt;

&lt;p&gt;Créer un fichier qui contient le message d'erreur qu'on souhaite afficher.&lt;/p&gt;

&lt;p&gt;ex : &lt;code&gt;/etc/security/failed_auth_message&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;L'authentification a échoué -_-#. Vérifiez votre login et mot de passe s'il vous plaît!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Configurer PAM pour afficher le message en cas d'erreur d'authentification.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Modifier le fichier &lt;code&gt;/etc/pam.d/common-auth&lt;/code&gt;, en ajoutant la ligne suivante :
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
auth    [default=die] pam_echo.so file=/etc/security/failed_auth_message
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Créer un fichier contenant le message d'erreur final.
&lt;/h3&gt;

&lt;p&gt;Exemple : /usr/local/bin/final_message.sh&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Vous avez échoué 3 fois!!! Veuillez réessayer plus tard!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x /usr/local/bin/final_message.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Configurer PAM pour afficher le message en cas d'echac des n tentatives d'authentification.
&lt;/h3&gt;

&lt;p&gt;Ajouter les lignes suivantes pour configurer &lt;code&gt;pam_faillock&lt;/code&gt; et &lt;code&gt;pam_exec&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
auth    [default=die] pam_exec.so /usr/local/bin/final_message.sh
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Donc, au final, notre fichier &lt;code&gt;/etc/pam.d/common-auth&lt;/code&gt; doit ressembler à ça :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;auth    required      pam_faillock.so preauth silent deny=5 unlock_time=0
auth    [default=die] pam_echo.so file=/etc/security/failed_auth_message
auth    [default=die] pam_faillock.so authfail deny=5 unlock_time=0
auth    [default=die] pam_exec.so /usr/local/bin/final_message.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  XVII. &lt;u&gt;Comment archiver chaque action utilisant sudo dans /var/log/sudo&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;On doit configurer &lt;code&gt;sudo&lt;/code&gt; pour qu'il enregistre toutes les commandes dans un fichier de journal dédié.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Configurer le fichier sudoers pour la journalisation.
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;visudo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ajouter cette ligne dans le fichier ouvert par &lt;code&gt;visudo&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Defaults        logfile="/var/log/sudo.log"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Configurer les permissions et créer le fichier de journal.
&lt;/h3&gt;

&lt;p&gt;On doit s'assurer que le fichier de journal existe et qu'il a les permissions appropriées pour que &lt;code&gt;sudo&lt;/code&gt; puisse y écrire :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /var/log/sudo.log
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;640 /var/log/sudo.log
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo chown &lt;/span&gt;root:adm /var/log/sudo.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Vérifier la configuration.
&lt;/h3&gt;

&lt;p&gt;Une fois les modifications apportées, on peut tester la configuration en exécutant quelques commandes avec &lt;code&gt;sudo&lt;/code&gt; et en vérifiant que les actions sont bien enregistrées dans &lt;code&gt;/var/log/sudo.log&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Exemples et bonnes pratiques.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sécurité&lt;/strong&gt; : On doit s'assurer que le fichier de journal des commandes &lt;code&gt;sudo&lt;/code&gt; est &lt;strong&gt;&lt;em&gt;protégé contre les modifications non autorisées&lt;/em&gt;&lt;/strong&gt; en définissant des permissions strictes. Seuls les utilisateurs autorisés (typiquement root et les membres du groupe &lt;code&gt;adm&lt;/code&gt;) devraient avoir accès à ce fichier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rotation des journaux&lt;/strong&gt; : Pour éviter que le fichier de journal ne devienne trop volumineux, on doit configurer la rotation des journaux à l'aide de &lt;code&gt;logrotate&lt;/code&gt; :&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On doit d'abord créer un fichier de configuration pour &lt;code&gt;logrotate&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/logrotate.d/sudo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensuite, on ajoute le contenu suivant pour la rotation des journaux :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/var/log/sudo.log &lt;span class="o"&gt;{&lt;/span&gt;
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 640 root adm
    postrotate
        /usr/sbin/service rsyslog reload &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
    endscript
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ce fichier de configuration fait tourner le journal des commandes sudo &lt;strong&gt;&lt;em&gt;&lt;u&gt;tous les jours&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;, garde 7 jours de journaux, et &lt;strong&gt;&lt;em&gt;&lt;u&gt;compresse les anciens fichiers&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  XVIII. &lt;u&gt;C'est quoi mode TTY (security)&lt;/u&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Un peu d'histoire sur les ttys sur Unix.
&lt;/h3&gt;

&lt;p&gt;Sur Unix, &lt;strong&gt;tty&lt;/strong&gt; provient du mot anglais &lt;strong&gt;T&lt;/strong&gt;ele*&lt;em&gt;TY&lt;/em&gt;&lt;em&gt;pewritter que l'on peut traduire par **téléimprimeur&lt;/em&gt;&lt;em&gt;, **télétype&lt;/em&gt;* ou &lt;strong&gt;téléscripteurs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;À la fin du XIXème siècle et pendant tout une partie du XXème siècle, les communications à longue distance ont été effectués par &lt;strong&gt;téléscripteur&lt;/strong&gt;. C'est un appareil d'I/O qui comprend :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un clavier alphanumérique.&lt;/li&gt;
&lt;li&gt;Un émetteur de signaux électriques commandé par les barres du clavier.&lt;/li&gt;
&lt;li&gt;Un traducteur des signaux reçus.&lt;/li&gt;
&lt;li&gt;Un dispositif d'impression sur page ou sur bande.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cela permet d'envoyer et de recevoir des &lt;strong&gt;messages dactylographiés&lt;/strong&gt; à travers divers canaux de communication tels qu'une &lt;strong&gt;liaison filaire&lt;/strong&gt; ou &lt;strong&gt;onde radio&lt;/strong&gt;. Les &lt;strong&gt;&lt;em&gt;messages télégraphiées&lt;/em&gt;&lt;/strong&gt; ont utilisé les &lt;strong&gt;téléscripteurs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On les voit aussi souvent dans les films de la seconde guerre mondiale, dans les centres de communication de l'armée avec de nombreuses secrétaires sur des bureaux.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxvd8khsrkx9iyvx6axh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxvd8khsrkx9iyvx6axh.png" alt="Image description" width="525" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dans les années 70 sont apparus, des téléimprimeurs ressemblant à des machines à écrire qui avait pour sortie une imprimante.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnrbri7n9y4pmr69qs1wx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnrbri7n9y4pmr69qs1wx.png" alt="Image description" width="475" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;À la fin des années 70, les téléimprimeurs ont été largement remplacés par des &lt;strong&gt;terminaux informatiques&lt;/strong&gt; entièrement électroniques qui ont généralement un &lt;strong&gt;moniteur d'ordinateur&lt;/strong&gt; au lieu d'une imprimante.&lt;/p&gt;

&lt;p&gt;Ces terminaux à base de &lt;strong&gt;CRT (Cathode-Ray Tube)&lt;/strong&gt; commençaient à émerger, tels que la série VT de Dell. À l'origine, l'interface ne pouvait imprimer que le texte sur l'écran, qui utilisait &lt;strong&gt;&lt;em&gt;80 colonnes et 24 lignes&lt;/em&gt;&lt;/strong&gt;. L'interface graphique évolue plus tard et a permis de dessiner des images et d'utiliser un dispositif de pointage tel qu'une souris.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2nv8ejcj2dtg4lkezubf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2nv8ejcj2dtg4lkezubf.png" alt="Image description" width="518" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ainsi, dans de nombreux langages de programmation, le texte de sortie de l'affichage dans une fenêtre de &lt;strong&gt;terminal&lt;/strong&gt; est appelé &lt;strong&gt;impression&lt;/strong&gt;. À l'origine, ce n'était pas une métaphore mais un fait.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;De ce fait, le terme tty correspond au téléimprimeur qui correspond aux &lt;strong&gt;&lt;em&gt;terminaux&lt;/em&gt;&lt;/strong&gt; utilisés au moment de la création d'&lt;strong&gt;&lt;em&gt;Unix&lt;/em&gt;&lt;/strong&gt; qui est un périphérique I/O.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linux&lt;/strong&gt; étant un descendant libre d'Unix, il hérite des terminologies. À noter que &lt;strong&gt;MacOSX&lt;/strong&gt; étant aussi issu d'Unix, il utilise aussi ces terminologies.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Qu'est-ce que tty sur Linux ?
&lt;/h3&gt;

&lt;p&gt;L'OS Linux représente tout dans un système de fichiers.&lt;/p&gt;

&lt;p&gt;Les &lt;strong&gt;périphériques matériels&lt;/strong&gt; que nous connectons sont également représentés en tant que fichiers grâce à &lt;strong&gt;udev&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le &lt;u&gt;terminal&lt;/u&gt; est également représenté comme un fichier.&lt;/strong&gt; Il nous permet d'interagir avec le système en passant des données au système et en affichant la sortie produite par le système.&lt;/p&gt;

&lt;p&gt;Dans la terminologie UNIX, une TTY est un type particulier de fichier de périphérique qui implémente un certain nombre de commandes supplémentaires &lt;strong&gt;&lt;em&gt;(Input-Output Controls ou IOCTL)&lt;/em&gt;&lt;/strong&gt; au-delà de la lecture et de l'écriture. Dans sa signification la plus courante, &lt;strong&gt;terminal = TTY&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Certaines TTYs sont &lt;strong&gt;&lt;em&gt;fournies par le noyau&lt;/em&gt;&lt;/strong&gt; pour le compte d'un périphérique matériel, par exemple avec l'&lt;strong&gt;&lt;em&gt;entrée provenant du &lt;u&gt;clavier&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; et la &lt;strong&gt;&lt;em&gt;sortie vers un &lt;u&gt;écran&lt;/u&gt; en mode texte&lt;/em&gt;&lt;/strong&gt;, ou avec l'&lt;strong&gt;&lt;em&gt;entrée et la sortie transmises sur une &lt;u&gt;ligne de série&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;D'autres TTYs, parfois appelées &lt;strong&gt;pseudo-TTY&lt;/strong&gt;, sont fournis (à travers une fine couche de noyau) par des programmes appelés &lt;strong&gt;émulateurs de terminaux&lt;/strong&gt;, tels que &lt;strong&gt;&lt;em&gt;Xterm (exécuté dans le système X Window)&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;screen (qui fournit une couche d'isolement entre un programme et un autre terminal)&lt;/strong&gt;, &lt;strong&gt;SSH (qui relie un terminal sur une machine à des programmes sur une autre machine)&lt;/strong&gt;, &lt;strong&gt;expect (pour les interactions de terminal de script&lt;/strong&gt;, etc.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ainsi, notre terminal est représenté par le fichier &lt;code&gt;/dev/tty&lt;/code&gt;. Copier des fichiers vers ce dernier montre ce que l'on obtient en sortie de ce fichier.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. Qu'est ce qu'un pts ?
&lt;/h3&gt;

&lt;p&gt;PTS (Pseudo Terminal Slave) est un type de terminal virtuel utilisé dans les systèmes Unix et Linux pour &lt;strong&gt;&lt;em&gt;permettre à plusieurs sessions de terminal d'exécuter simultanément sur un seul système&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ils jouent un rôle crucial dans la gestion des interactions utilisateur avec le système d'exploitation et entre les différents processus et applications.&lt;/p&gt;

&lt;p&gt;Voici quelques points clés à retenir sur les PTS :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Terminal Virtuel&lt;/strong&gt; : Un PTS est un terminal virtuel, ce qui signifie qu'il n'est pas directement lié à un périphérique matériel spécifique comme un clavier ou un écran, mais qu'&lt;strong&gt;&lt;em&gt;il est géré par le système d'exploitation&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Émulation de Terminal&lt;/strong&gt; : Les PTS &lt;strong&gt;&lt;em&gt;émulent le comportement des terminaux physiques&lt;/em&gt;&lt;/strong&gt; en permettant aux utilisateurs d'interagir avec le système via une interface de ligne de commande. &lt;strong&gt;&lt;em&gt;Chaque PTS est associé à un processus ou à une session utilisateur&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Attribution Dynamique&lt;/strong&gt; : Les PTS sont généralement attribués dynamiquement par le système d'exploitation &lt;strong&gt;&lt;em&gt;lorsque de nouveaux terminaux sont ouverts&lt;/em&gt;&lt;/strong&gt;. Par exemple, lorsqu'on ouvre une &lt;u&gt;nouvelle fenêtre de terminal&lt;/u&gt; ou établit une &lt;u&gt;connexion SSH&lt;/u&gt;, un nouveau PTS est généralement créé pour cette session.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Identification&lt;/strong&gt; : Les PTS sont généralement identifiés par des nombres, tels que &lt;code&gt;pts/0&lt;/code&gt;, &lt;code&gt;pts/1&lt;/code&gt;, etc. Ces numéros sont attribués de manière séquentielle à mesure que de nouveaux terminaux sont ouverts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Communication&lt;/strong&gt; : Les PTS sont utilisés pour permettre la communication entre les processus et les sessions de terminal. Par exemple, lorsqu'on exécute une application dans un terminal et que cette application nécessite une interaction avec un autre processus ou une autre application, elle peut utiliser un PTS pour communiquer avec cette autre entité.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  XIX. &lt;u&gt;Comment recuperer la signature du VM dans le fichier .vdi au format sha1&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;Pour récupérer la signature SHA1 d'un fichier VDI (VirtualBox Disk Image), on peut utiliser l'outil de hachage SHA1 fourni par notre système d'exploitation. Voici comment procéder en utilisant la ligne de commande :&lt;/p&gt;

&lt;p&gt;1) Ouvrir le terminal&lt;/p&gt;

&lt;p&gt;2) Utiliser la commande suivante pour calculer la signature SHA1 du fichier VDI :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sha1sum &lt;/span&gt;chemin_vers_le_fichier.vdi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Il faut s'assurer de remplacer &lt;code&gt;chemin_vers_le_fichier.vdi&lt;/code&gt; par le &lt;strong&gt;&lt;em&gt;&lt;u&gt;chemin absolu ou relatif&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; vers le fichier VDI.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cette commande générera la signature SHA1 du fichier VDI spécifié. On peut utiliser cette signature pour vérifier l'intégrité du fichier ou pour toute autre utilisation qui nécessite une vérification de l'identité du fichier.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  XX. &lt;u&gt;C'est quoi le format SHA1&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SHA1 (Secure Hash Algorithm 1)&lt;/strong&gt; est un algorithme de hachage cryptographique. Un algorithme de hachage prend en entrée des données de taille variable et génère en sortie une valeur de hachage (ou empreinte) de taille fixe.&lt;/p&gt;

&lt;p&gt;L'objectif principal d'un algorithme de hachage est de &lt;strong&gt;&lt;em&gt;&lt;u&gt;produire une empreinte unique&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; pour chaque ensemble de données d'entrée, de sorte que &lt;strong&gt;&lt;em&gt;des données différentes produisent généralement des empreintes différentes&lt;/em&gt;&lt;/strong&gt;, et qu'&lt;strong&gt;&lt;em&gt;il est difficile de trouver deux ensembles de données différents qui produisent la même empreinte&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;SHA1 produit une empreinte de &lt;strong&gt;160 bits (20 octets)&lt;/strong&gt;, généralement représentée sous forme hexadécimale. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  XXI. &lt;u&gt;Comment dupliquer une VM&lt;/u&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Arrêter la VM.
&lt;/h3&gt;

&lt;p&gt;On doit s'assurer que la machine virtuelle qu'on souhaite dupliquer est arrêtée.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Copier le fichier VDI.
&lt;/h3&gt;

&lt;p&gt;On doit localiser le fichier VDI de la machine virtuelle qu'on souhaite dupliquer. Ce fichier contient le &lt;strong&gt;disque dur virtuel de la machine&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On doit copier ce fichier quelque part sur notre disque dur physique.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Ouvrir VirtualBox.
&lt;/h3&gt;

&lt;p&gt;Il faut lancer VirtualBox sur l'ordinateur.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Importer la VM.
&lt;/h3&gt;

&lt;p&gt;Dans virtualBox : Fichier &amp;gt; Importer un appareil virtuel &amp;gt; fichier_a_dupliquer.vdi&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Suivre l'assistant d'importation.
&lt;/h3&gt;

&lt;p&gt;On doit suivre les instructions de l'assistant d'importation pour importer la machine virtuelle. On peut choisir de garder les paramètres par défaut ou de les personnaliser selon nos besoins. On doit s'assurer de sélectionner &lt;code&gt;Créer une nouvelle identité de disque dur&lt;/code&gt; si on souhaite que la machine virtuelle dupliquée utilise un &lt;strong&gt;&lt;em&gt;nouveau disque dur virtuel&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Configurer la VM dupliquée (facultatif).
&lt;/h3&gt;

&lt;p&gt;Une fois la VM importée, on peut modifier ses paramètres dans VirtualBox si nécessaire, comme son nom, sa quantité de mémoire, ses périphériques connectés, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Démarrer la VM dupliquée.
&lt;/h3&gt;

&lt;p&gt;Une fois qu'on a configuré la VM dupliquée comme on le souhaite, on peut la démarrer.&lt;/p&gt;

&lt;h2&gt;
  
  
  XXII. &lt;u&gt;Comment utiliser les "save state"&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;L'option &lt;strong&gt;Save State&lt;/strong&gt; dans VirtualBox permet de sauvegarder l'état actuel d'une machine virtuelle, y compris la mémoire de la machine virtuelle, l'état des périphériques et l'état du système d'exploitation. Cela nous permet de mettre en pause une machine virtuelle et de la reprendre ultérieurement exactement là où on l'a laissé, sans perdre aucune donnée ou état de fonctionnement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1) Arrêter la machine virtuelle&lt;/strong&gt; : On doit s'assurer que la machine virtuelle que l'on souhaite mettre en pause est arrêtée.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) Sélectionner la machine virtuelle&lt;/strong&gt; : Dans la fenêtre principale de VirtualBox, on sélectionne la machine virtuelle que l'on souhaite sauvegarder l'état.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) Choisir l'option &lt;code&gt;Save State&lt;/code&gt;&lt;/strong&gt; : Dans la barre d'outils de VirtualBox, on clique sur le bouton &lt;code&gt;Machine&lt;/code&gt; pour ouvrir le menu déroulant, puis sélectionner &lt;code&gt;Sauvegarder l'état&lt;/code&gt; ou &lt;code&gt;Save State&lt;/code&gt;. Alternativement, on peut faire un clic droit sur la machine virtuelle sélectionnée dans la liste des machines et choisir &lt;code&gt;Sauvegarder l'état&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4) Attendre la sauvegarde de l'état&lt;/strong&gt; : VirtualBox sauvegarde l'état de la machine virtuelle. Selon la taille de la mémoire de la machine virtuelle et la vitesse du système, cela peut prendre quelques instants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5) Reprendre la machine virtuelle&lt;/strong&gt; : Lorsqu'on souhaite reprendre le travail, on ouvre VirtualBox, puis on sélectionne la machine virtuelle qu'on a sauvegardée. On peut maintenant démarrer la machine virtuelle en appuyant sur le bouton &lt;code&gt;Démarrer&lt;/code&gt; dans la barre d'outils de VirtualBox. La machine virtuelle reprendra exactement là où on l'a laissée avec tous les programmes ouverts et les documents en cours d'exécution.&lt;/p&gt;

</description>
      <category>systems</category>
      <category>devops</category>
    </item>
    <item>
      <title>Ten Queens puzzle using recursivity in C language</title>
      <dc:creator>As Manjaka Josvah</dc:creator>
      <pubDate>Sat, 27 Jan 2024 23:59:47 +0000</pubDate>
      <link>https://dev.to/ashcript/ten-queens-puzzle-using-recursivity-in-c-language-58o</link>
      <guid>https://dev.to/ashcript/ten-queens-puzzle-using-recursivity-in-c-language-58o</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiun6gea29y4hctujlyvq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiun6gea29y4hctujlyvq.png" alt="Image description" width="726" height="641"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>c</category>
      <category>programming</category>
    </item>
    <item>
      <title>C Basic methods</title>
      <dc:creator>As Manjaka Josvah</dc:creator>
      <pubDate>Thu, 25 Jan 2024 14:15:54 +0000</pubDate>
      <link>https://dev.to/ashcript/c-basic-methods-1f56</link>
      <guid>https://dev.to/ashcript/c-basic-methods-1f56</guid>
      <description>&lt;p&gt;&lt;strong&gt;We are going to learn about the basic C programming methods and their implementations from scratch&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  String copy
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;strcpy&lt;/li&gt;
&lt;li&gt;strncpy&lt;/li&gt;
&lt;li&gt;strlcpy&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  String compare
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;strcmp&lt;/li&gt;
&lt;li&gt;strncmp&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  String concatenate
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;strcat&lt;/li&gt;
&lt;li&gt;strncat&lt;/li&gt;
&lt;li&gt;strlcat&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  I. String copy
&lt;/h1&gt;

&lt;p&gt;&lt;u&gt;Definition&lt;/u&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It allows us to copy a source string to another destination string.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;strcpy&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;strcpy&lt;/strong&gt; is a C standard library function that copies a string from one location to another. It is defined in the string. h header file. The function takes two arguments: a destination buffer where the copied string will be stored, and a source string that will be copied.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It returns the new constructed string (i.e. dest).&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Algorithm&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set the parameters : &lt;code&gt;char *dest, char *src&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Copy all elements in src to dest, i.e. everything inside dest will be removed from 0 to length(src) - 1, and put an "\0" value at the end, when all characters inside src are copied.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;u&gt;Code&lt;/u&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;

&lt;span class="kt"&gt;char&lt;/span&gt;    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;ft_strcpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sc"&gt;'\0'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'\0'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;strncpy&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;strncpy&lt;/strong&gt; similar to strcpy but it adds an extra parameter &lt;strong&gt;size&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;u&gt;Algorithm&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;If size is greater than the length of src , the dest result is padded with null characters (\0) up to length count . Return Value. The strncpy() function returns a pointer to &lt;strong&gt;dest&lt;/strong&gt; .&lt;/p&gt;

&lt;p&gt;if size &amp;gt; length(src) =&amp;gt; append \0 to dest until we reach size.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Code&lt;/u&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;

&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="nf"&gt;ft_strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt;             &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sc"&gt;'\0'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;char&lt;/span&gt;    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;ft_strncpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="n"&gt;len_src&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;len_src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ft_strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;len_src&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'\0'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;strlcpy&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Similar to strncpy, but don't append a lot of null after surpassing the src length.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;u&gt;Algorithm&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;it checks for both &lt;code&gt;i &amp;lt; size - 1 &amp;amp;&amp;amp; i &amp;lt; length(src)&lt;/code&gt; before appending src to dest&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Code&lt;/u&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;

&lt;span class="kt"&gt;unsigned&lt;/span&gt;    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;ft_strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt;             &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sc"&gt;'\0'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;unsigned&lt;/span&gt;    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;ft_strlcpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="n"&gt;src_len&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;src_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ft_strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;src_len&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'\0'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src_len&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h1&gt;
  
  
  II. String compare
&lt;/h1&gt;

&lt;p&gt;&lt;u&gt;Definition&lt;/u&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It allows us to compare two strings. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;strcmp&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;The strcmp function is a critical part of the C language, defined and prototyped in the string. h header file. It is used for comparing two character arrays or strings lexicographically. This means that it checks every character at every index in both strings for equality.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;u&gt;Algorithm&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set the parameters : &lt;code&gt;char *str1, char *str2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;compare each elements in str1 with str2.&lt;/li&gt;
&lt;li&gt;If an element in str1 is not equal to str2, the comparison process stops, and it returns the difference between the 2 different elements of str1 and str2.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The return value from &lt;em&gt;strcmp&lt;/em&gt; is 0 if the two strings are equal, less than 0 if str1 compares less than str2 , and greater than 0 if str1 compares greater than str2 . No other assumptions should be made about the value returned by strcmp.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Code&lt;/u&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;ft_strcmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;strncmp&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;strncmp&lt;/strong&gt; is a function in C which is used to compare two array of characters upon N indexes and return if the first array is less, equal or greater than the second array. It overcomes the limitations of strcmp function by allowing programmers to set the number of characters to compare.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;u&gt;Algorithm&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set the parameters : &lt;code&gt;char *str1, char *str2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;compare each elements in str1 with str2.&lt;/li&gt;
&lt;li&gt;If an element in str1 is not equal to str2, the comparison process stops, and it returns the difference between the 2 different elements of str1 and str2.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The return value from &lt;em&gt;strcmp&lt;/em&gt; is 0 if the two strings are equal, less than 0 if str1 compares less than str2 , and greater than 0 if str1 compares greater than str2 . No other assumptions should be made about the value returned by strcmp.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;code&lt;/u&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;ft_strncmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  III. String concatenate
&lt;/h1&gt;

&lt;p&gt;&lt;u&gt;Definition&lt;/u&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;String concatenation in C can be simply defined as the addition of two strings or updating them. In C language we can add two or more strings end to end or can update them using the concatenation process. The concatenation helps to combine two or more strings together and provide them as a single string value.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;strcat&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;The strcat() function concatenates string2 to string1 and ends the resulting string with the null character. The strcat() function operates on null-ended strings. The string arguments to the function should contain a null character (\0) that marks the end of the string. &lt;strong&gt;No length checking is performed&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;u&gt;Algorithm&lt;/u&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;

&lt;span class="kt"&gt;char&lt;/span&gt;    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;ft_strcat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;str1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sc"&gt;'\0'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;str1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;str1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'\0'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;strncat&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;The strncat() function appends the first count characters of string2 to string1 and ends the resulting string with a null character (\0). If count is greater than the length of string2, the length of string2 is used in place of count.&lt;br&gt;
&lt;code&gt;if (size &amp;gt; length(str2)) =&amp;gt; size = length(str2)&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;u&gt;Algorithm&lt;/u&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;

&lt;span class="kt"&gt;char&lt;/span&gt;    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;ft_strncat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sc"&gt;'\0'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'\0'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;strlcat&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;u&gt;The logical algorithm BTS&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfq244ujkat80pwjgdwv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfq244ujkat80pwjgdwv.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vieb3d2lmrbcapdaegz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vieb3d2lmrbcapdaegz.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Algorithm&lt;/u&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;

&lt;span class="kt"&gt;char&lt;/span&gt;    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;ft_strlcat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sc"&gt;'\0'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'\0'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>c</category>
      <category>programming</category>
    </item>
    <item>
      <title>Greeting 🤣</title>
      <dc:creator>As Manjaka Josvah</dc:creator>
      <pubDate>Wed, 17 May 2023 20:44:27 +0000</pubDate>
      <link>https://dev.to/ashcript/greeting-36h</link>
      <guid>https://dev.to/ashcript/greeting-36h</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Hello&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nf"&gt;world&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;world&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;console.log&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>typescript</category>
    </item>
    <item>
      <title>Hello World! (as usual 🥴)</title>
      <dc:creator>As Manjaka Josvah</dc:creator>
      <pubDate>Thu, 04 May 2023 20:54:06 +0000</pubDate>
      <link>https://dev.to/ashcript/hello-world-as-usual--3g82</link>
      <guid>https://dev.to/ashcript/hello-world-as-usual--3g82</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nc"&gt;HelloWorld&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;console.log&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>newbie</category>
    </item>
  </channel>
</rss>
