<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://doc.lesmorin.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ycharbi</id>
	<title>Wiki doc - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://doc.lesmorin.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ycharbi"/>
	<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php/Sp%C3%A9cial:Contributions/Ycharbi"/>
	<updated>2026-04-13T02:51:55Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Busybox&amp;diff=1538</id>
		<title>Busybox</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Busybox&amp;diff=1538"/>
		<updated>2024-09-07T19:11:30Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Socket réseau en utilisateur standard */ Correction d'un résidu d'ancienne balise de syntaxe qui causait un problème d'affichage avec le modèle &amp;quot;Astuce&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
[https://fr.wikipedia.org/wiki/BusyBox Busybox] est un exécutable regroupant une multitude d'utilitaires généralement disponibles via [https://fr.wikipedia.org/wiki/GNU_Core_Utilities GNU Core Utilities]. Il a l'avantage de ne prendre que très peu de place et peut être utilisé pour faire des [[Busybox_init|systèmes embarqués très simples]].&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
==Via le gestionnaire de paquet==&lt;br /&gt;
 apt install busybox&lt;br /&gt;
&lt;br /&gt;
==Via les sources==&lt;br /&gt;
Le paquet &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;build-essential&amp;lt;/code&amp;gt; est nécessaire pour utiliser la commande &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;make&amp;lt;/code&amp;gt;.&lt;br /&gt;
 wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2&lt;br /&gt;
 tar xf busybox-1.36.1.tar.bz2&lt;br /&gt;
 cd busybox-1.36.1/&lt;br /&gt;
 make defconfig&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
Note : le code source est également disponible dans [https://{{SERVERNAME}}/fichiers/système/applications/busybox/busybox-1.36.1.tar.bz2 nos fichiers].&lt;br /&gt;
&lt;br /&gt;
{{astuce|Il est possible d'embarquer les dépendances nécessaires au fonctionnement de l'ensemble directement dans le binaire via la commande de compilation &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;make LDFLAGS=&amp;quot;--static&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; (ce dernier sera par conséquent plus lourd). Ceci est utile lorsque ''Busybox'' est intégré à un système dépourvu des bibliothèques en question.}}&lt;br /&gt;
&lt;br /&gt;
Un exécutable ''busybox'' a été créé dans le répertoire courant.&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;make defconfig&amp;lt;/code&amp;gt; permet de créer le fichier de configuration pour &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;make&amp;lt;/code&amp;gt; (''.config''). Les commandes de pré-configurations possibles sont :&lt;br /&gt;
* '''make defconfig''' : Créé la configuration la plus saine possible. Ça active la plupart des fonctionnalités sans quelques outils de débogage ainsi que les outils nécessitants des modifications du système comme les noms de périphériques ''selinux'' ou ''devfs''. Utiliser cette option si vous voulez démarrer depuis un ''Busybox'' complet pour, par la suite, écrémer les fonctionnalités pour en avoir un plus petit.&lt;br /&gt;
* '''make allnoconfig''' : Désactive tout. Cela crée une petite version de ''Busybox'' qui ne fait rien. Commencez ici si vous savez exactement ce que vous voulez et que vous souhaitez sélectionner uniquement ces fonctionnalités.&lt;br /&gt;
* '''make menuconfig''' : Modifie interactivement le fichier ''.config'' via une interface de menu à plusieurs niveaux. Utilisez-le après l'un des deux précédents.&lt;br /&gt;
Les autres options sont :&lt;br /&gt;
* '''make oldconfig''' : Mettre à jour un vieux fichier ''.config'' pour une nouvelle version de ''Busybox''.&lt;br /&gt;
* '''make allyesconfig''' : Sélectionnez absolument tout. Cela crée une version statiquement liée de ''Busybox'' remplie de code de débogage, avec des dépendances sur ''selinux'', en utilisant des noms de ''devfs''... Cela s'assure que tout est compilé. Que le résultat fasse quelque chose d'utile ou non est une question ouverte.&lt;br /&gt;
* '''make randconfig''' : Créer une configuration aléatoire à des fins de tests.&lt;br /&gt;
&lt;br /&gt;
=Socket réseau en utilisateur standard=&lt;br /&gt;
Par défaut, un système ''Linux'' n'autorise la création et la gestion d'un socket réseau que par l'utilisateur ''root''. Il peut être pratique de permettre certains exécutables à le faire via un utilisateur standard (c'est chiant d'avoir à taper le mot de passe ''root'' tout le temps). Pour ce faire, nous utiliserons les [[Linux capabilities]].&lt;br /&gt;
&lt;br /&gt;
'''Autorisation de redirection réseau'''&lt;br /&gt;
 setcap CAP_NET_BIND_SERVICE=+eip /bin/busybox&lt;br /&gt;
&lt;br /&gt;
{{Astuce|On peut voir cette autorisation avec la commande &amp;lt;code&amp;gt;getcap /bin/busybox&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
Les utilisateurs standards peuvent désormais utiliser le serveur ''HTTP'' ou autres intégré à ''Busybox''.&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://superuser.com/questions/710253/allow-non-root-process-to-bind-to-port-80-and-443/892391&lt;br /&gt;
&lt;br /&gt;
=Usage=&lt;br /&gt;
Nous allons partir du principe que l'emplacement de notre binaire ''busybox'' se trouve dans notre variable d'environnement &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;$PATH&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Lister les programmes disponibles dans notre Busybox'''&lt;br /&gt;
 busybox&lt;br /&gt;
&lt;br /&gt;
'''Afficher le manuel des outils contenus dans Busybox'''&lt;br /&gt;
 man busybox&lt;br /&gt;
&lt;br /&gt;
''Avec un &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;/&amp;lt;/code&amp;gt; suivi du nom de la commande + &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;entrer&amp;lt;/code&amp;gt; + &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;n&amp;lt;/code&amp;gt; on tombe directement sur le manuel de l'outil désiré.''&lt;br /&gt;
&lt;br /&gt;
==Serveur WEB==&lt;br /&gt;
'''Utiliser le serveur WEB intégré'''&lt;br /&gt;
 busybox httpd -f -v -h /tmp/foo/&lt;br /&gt;
&lt;br /&gt;
''Le serveur httpd ne liste pas les fichiers, il faut entrer une URL complète comme pour le TFTP. Cependant, il redirige automatiquement sur un index.html si présent.''&lt;br /&gt;
&lt;br /&gt;
Paramètres :&lt;br /&gt;
* '''-f''' : Ne rend pas la main. Ça permet de fermer le serveur web avec un &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;ctrl+c&amp;lt;/code&amp;gt; au lieu de ce faire chier avec les commandes &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;ps&amp;lt;/code&amp;gt; et &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;kill&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''-v''' : affiche les IP des clients se connectant et le message renvoyé par le serveur&lt;br /&gt;
* '''-h''' : Spécifie le répertoire de travail du serveur. Si ce paramètre n'est pas renseigné, le répertoire courant est utilisé&lt;br /&gt;
&lt;br /&gt;
==Serveur DHCP==&lt;br /&gt;
'''Créer le fichiers du processus'''&lt;br /&gt;
 touch /tmp/udhcpd.pid&lt;br /&gt;
&lt;br /&gt;
'''Créer le fichier contenant les baux DHCP'''&lt;br /&gt;
 touch /tmp/udhcpd.leases&lt;br /&gt;
&lt;br /&gt;
'''Créer un fichier de configuration'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;gt; /tmp/udhcpd.conf &amp;lt;&amp;lt; _EOF_&lt;br /&gt;
# Plage d'adresse attribuable&lt;br /&gt;
start 192.168.0.1 # Par défaut: 192.168.0.20&lt;br /&gt;
end 192.168.0.253 # Par défaut: 192.168.0.254&lt;br /&gt;
&lt;br /&gt;
# Interface réseau d'écoute&lt;br /&gt;
interface eth1 # Par défaut: eth0&lt;br /&gt;
&lt;br /&gt;
# Nombre maximum de baux &lt;br /&gt;
max_leases 253 # Par défaut: 254&lt;br /&gt;
&lt;br /&gt;
# Stocker le temps restant pour chaque bail dans le fichier des baux&lt;br /&gt;
# C'est utile sur les systèmes embarqués ne pouvant garder l'heure après un redémarrage&lt;br /&gt;
# Si cette valeur est définie à &amp;quot;no&amp;quot;, l'heure de fin de bail sera stocker dans le fichier&lt;br /&gt;
# des baux au lieu du temps restant avant expiration&lt;br /&gt;
&lt;br /&gt;
#remaining yes # Par défaut: yes&lt;br /&gt;
&lt;br /&gt;
# Localisation du fichier des baux&lt;br /&gt;
lease_file /tmp/udhcpd.leases&lt;br /&gt;
&lt;br /&gt;
# Localisation du fichier processus&lt;br /&gt;
pidfile /tmp/udhcpd.pid # Par défaut: /var/run/udhcpd.pid&lt;br /&gt;
&lt;br /&gt;
# Les options suivantes sont pour le PXE&lt;br /&gt;
#siaddr 192.168.0.22 # Par défaut: 0.0.0.0&lt;br /&gt;
#sname zorak # Par défaut: (none)&lt;br /&gt;
#boot_file /var/nfs_root # Par défaut: (none)&lt;br /&gt;
&lt;br /&gt;
# Options DHCP&lt;br /&gt;
# Elles peuvent être spécifiées via le mot clé &amp;quot;option&amp;quot; ou &amp;quot;opt&amp;quot; qui est un alias.&lt;br /&gt;
# La seule options définie par défaut est &amp;quot;lease&amp;quot; pour définir la durée des baux&lt;br /&gt;
opt dns 192.168.170.171 80.67.169.12&lt;br /&gt;
option subnet 255.255.255.0&lt;br /&gt;
opt router 192.168.0.254&lt;br /&gt;
#opt wins 192.168.10.10 # Ajoute un serveur WINS&lt;br /&gt;
#option dns 129.219.13.81 # Ajoute un autre DNS aux 2 autres ci-dessus&lt;br /&gt;
option domain local&lt;br /&gt;
option lease 864000 # 10 jours en secondes&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez adapter les adresses et nom d'interface avec les commande suivante en remplaçant ''toto'' par la donnée appropriée:&lt;br /&gt;
 sed -i 's/192\.168\.0\./192\.168\.toto./g' /tmp/udhcpd.conf&lt;br /&gt;
 sed -i 's/eth1/toto/g' /tmp/udhcpd.conf&lt;br /&gt;
&lt;br /&gt;
Paramètres possibles :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paramètre !! Effet !! Valeur par défaut&lt;br /&gt;
|-&lt;br /&gt;
| Paramètre 1 || Il fait ça || yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Liste exhaustive des options supportés. Voir le fichier source ''options.c'' :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Option !! Effet&lt;br /&gt;
|-&lt;br /&gt;
| toto || titi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Exécuter le serveur DHCP'''&lt;br /&gt;
 busybox udhcpd -fv /tmp/udhcpd.conf&lt;br /&gt;
&lt;br /&gt;
Paramètres :&lt;br /&gt;
* '''-f''' : Ne rend pas la main. Ça permet de fermer le serveur DHCP avec un &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;ctrl+c&amp;lt;/code&amp;gt; au lieu de ce faire chier avec les commandes &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;ps&amp;lt;/code&amp;gt; et &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;kill&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''-v''' : affiche les requêtes ''ACK'' et ''OFFER'' entre le serveur et les clients (on voit l'IP attribué de ce fait)&lt;br /&gt;
&lt;br /&gt;
'''Sources de la section'''&lt;br /&gt;
* Page officielle de udhcpd: https://udhcp.busybox.net/&lt;br /&gt;
* Fichier de configuration exemple: https://udhcp.busybox.net/udhcpd.conf&lt;br /&gt;
&lt;br /&gt;
==NTP==&lt;br /&gt;
===Serveur NTP===&lt;br /&gt;
Définir l'horloge système depuis une source réseau&lt;br /&gt;
 busybox ntpd -d -n -I eth0 -l -p 0.debian.pool.ntp.org&lt;br /&gt;
&lt;br /&gt;
Paramètres :&lt;br /&gt;
* '''-d''' : mode verbeux&lt;br /&gt;
* '''-n''' : ne pas démoniser (ne pas exécuter en arrière plan)&lt;br /&gt;
* '''-I''' : écouter sur l'interface spécifiée pour les requêtes clientes&lt;br /&gt;
* '''-l''' : ouvre le socket ''UDP'' sur le port 123 pour les requêtes clientes&lt;br /&gt;
* '''-p''' : serveur de référence sur lequel se synchronise notre serveur&lt;br /&gt;
&lt;br /&gt;
==TFTP==&lt;br /&gt;
===Client TFTP===&lt;br /&gt;
Télécharger un fichier via ''TFTP''&lt;br /&gt;
 busybox tftp -r toto.txt 192.168.100.2 -g&lt;br /&gt;
&lt;br /&gt;
Téléverser un fichier via ''TFTP''&lt;br /&gt;
 busybox tftp -l toto.txt 192.168.100.2 -p&lt;br /&gt;
&lt;br /&gt;
===Serveur TFTP===&lt;br /&gt;
Le serveur ''TFTP'' est rarement embarqué dans le ''Busybox'' des distributions ''Linux''. Dans ce cas, il faudra le compilé soit même (testé avec la version 1.36.1).&lt;br /&gt;
&lt;br /&gt;
''Busybox tftpd'' a besoin de s'appuyer sur un programme (lui même présent dans ''Busybox'') d'ouverture de socket réseau : &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;udpsvd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 /tmp/busybox-1.36.1/busybox udpsvd -vE 0.0.0.0 69 /tmp/busybox-1.36.1/busybox tftpd -c /tmp/tftp/&lt;br /&gt;
&lt;br /&gt;
Paramètres :&lt;br /&gt;
* '''-r''' : lecture seule&lt;br /&gt;
* '''-c''' : téléversements autorisés&lt;br /&gt;
* '''-u''' : rendre l'utilisateur passé en paramètre propriétaire des fichiers téléversés&lt;br /&gt;
* '''-l''' : journaliser dans ''Syslog'' en plus du ''Stdout'' (non fonctionnel d'après mes tests)&lt;br /&gt;
&lt;br /&gt;
==Netcat==&lt;br /&gt;
Les commandes [[netcat]] sont identique à la version ''APT'' (avec quelques options en moins).&lt;br /&gt;
 busybox nc -l -p 2323&lt;br /&gt;
&lt;br /&gt;
 busybox nc ipserver 2323&lt;br /&gt;
&lt;br /&gt;
'''Envoyer un [https://tutorials.technology/tutorials/How-to-transfer-files-over-the-network-using-Netcat.html fichier]'''&lt;br /&gt;
&lt;br /&gt;
Sur le serveur :&lt;br /&gt;
 busybox nc -l -p 9999 &amp;gt; /tmp/titi.dat&lt;br /&gt;
&lt;br /&gt;
Sur le client :&lt;br /&gt;
 busybox nc 192.168.0.1 9999 &amp;lt; /tmp/titi/titi.dat&lt;br /&gt;
&lt;br /&gt;
==Terminal série==&lt;br /&gt;
On peut remplacer l'usage de [[Minicom]] par ''Busybox'' avec l'outil embarqué ''Microcom''.&lt;br /&gt;
 busybox microcom -s 9600 /dev/ttyUSB0&lt;br /&gt;
&lt;br /&gt;
Pour quitter ''Microcom'', faites la séquence d'échappement &amp;lt;code lang=&amp;quot;bash&amp;quot; inline&amp;gt;ctrl+x&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* https://busybox.net/FAQ.html#configure&lt;br /&gt;
* https://busybox.net/downloads/BusyBox.html&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Proftpd&amp;diff=1537</id>
		<title>Proftpd</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Proftpd&amp;diff=1537"/>
		<updated>2024-09-01T20:51:37Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* SFTP */ Correction d'une faute de français&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Service_partage]]&lt;br /&gt;
&lt;br /&gt;
[http://proftpd.org/ ProFTPd] est un logiciel permettant de monter un serveur de fichiers basé sur les protocoles ''FTP'' ; ''FTPS'' et [[Sftp-server|SFTP]]. Il a la particularité d'utiliser des fichiers de configuration proches de ceux d'[[Apache2]].&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
Référence dans son domaine, il est probablement disponible dans les dépôts de la distribution ''Linux'' que vous utilisez. Pour ''Debian 12'', la commande suivante permet d'installer le paquet&lt;br /&gt;
 apt install --no-install-recommends proftpd proftpd-mod-crypto&lt;br /&gt;
&lt;br /&gt;
''ProFTPd'' supporte un grand nombre de modules. Le paquet &amp;lt;code&amp;gt;proftpd-mod-crypto&amp;lt;/code&amp;gt; permet d'utiliser ''FTP'' sur ''TLS'', aussi appelé ''FTPS'' ainsi que ''SFTP'', le protocole de transfert de fichiers sur [[Openssh|SSH]].&lt;br /&gt;
&lt;br /&gt;
==SFTP==&lt;br /&gt;
De nos jours, l'utilisation des protocoles ''FTP'' et sont pendant chiffré, ''FTPS'', est dépréciée. Les raisons principales de cette tendance, malgré les qualités indéniables de ces derniers sont principalement dû à l'explosion des ''NAT/PAT'' sur les réseaux ''WAN'' ainsi que la systématisation des règles de pare-feux. ''FTP'' est en effet un vieux protocole imaginé à une époque où il était normal (allez savoir pourquoi) d'utiliser une multitude de ports pour réaliser une action simple. Aussi, le port 20/''TCP'' était utilisé pour les données alors que le 21/''TCP'' servait pour transmettre les commandes. La version chiffrée quant à elle utilisait carrément des plages de ports au dessus de 1024 en plus de ceux mentionnés, rendant toute tentative de filtrage fin veine et occasionnait des problèmes de fiabilité avec certaines passerelles ''NAT'' (que je n'ai pour ma part jamais rencontré).&lt;br /&gt;
&lt;br /&gt;
Cependant, la vacance occasionnée par la dépréciation de ces protocoles n'a jamais été réellement comblée. [[Apache2#Partage_WebDAV|WebDAV]] n'est pas très fiable dans ces implémentations (surtout sous [[Windows_net_use#Usages_concrets|Windows]]) et est plus que casse pied à configurer côté serveur (y'a toujours un truc qui va pas) ; ''HTTP'' seul ne permet pas le transfert de répertoires, [[Samba]] et [[Nfs|NFS]] ne sont pas fait pour du ''WAN'' en plus de proposer une sécurité (surtout pour ce dernier) très discutable, ''ISCSI'' ne fonctionne qu'en mode bloc ; [[Sftp-server|SFTP]] embarqué dans un serveur ''SSH'' utilise traditionnellement des utilisateurs ''POSIX'', ce qui oblige à porter une attention toute particulière au durcissement de la configuration en plus de permettre des répercutions catastrophiques en cas de faille (un utilisateur destiné au transfert de fichiers peut, en fin de compte, se connecter au serveur...) ; etc... Aucun remplaçant potentiel n'a donc su prendre la relève avec la légèreté et les fonctionnalités du protocole de transfert de fichiers (''File Transfer Protocol'') traditionnel :&lt;br /&gt;
* installation et utilisation simple&lt;br /&gt;
* utilisateurs virtuels avec base de données de multiple types allant du fichier plain à la base [[MariaDB - Gestion utilisateurs|SQL]] en passant par l'annuaire [[Ldap|LDAP]]&lt;br /&gt;
* emprisonnement des comptes utilisateurs dans un répertoire (''chroot'')&lt;br /&gt;
* pas de ''shell''&lt;br /&gt;
* gestion des droits&lt;br /&gt;
* reprise de téléchargements partiels&lt;br /&gt;
* performances maximales&lt;br /&gt;
* support très large&lt;br /&gt;
&lt;br /&gt;
L'implémentation de ''SFTP'' proposée par ''ProFTPd'' s'avère alors particulièrement intéressante car elle est décorrélée de tout serveur ''SSH'' et permet l'utilisation de comptes virtuels emprisonnés sans utilisation de ''shell'', réduisant ainsi drastiquement la surface d'attaque. De plus, ce logiciel est reconnu comme apportant un soin prononcé à la sécurité et est éprouvé depuis plusieurs décennies. Il permettra donc de proposer un service quasiment similaire tout en apportant la confidentialité exigée par l'époque...&lt;br /&gt;
&lt;br /&gt;
===Configuration du service===&lt;br /&gt;
En mode ''SFTP'' uniquement&lt;br /&gt;
 mv /etc/proftpd/proftpd.conf /etc/proftpdproftpd.conf.ori&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/proftpd/proftpd.conf&lt;br /&gt;
# Chargement du module SFTP&lt;br /&gt;
LoadModule mod_sftp.c&lt;br /&gt;
&lt;br /&gt;
# Désactiver le service FTPS&lt;br /&gt;
&amp;lt;IfModule mod_tls.c&amp;gt;&lt;br /&gt;
	TLSEngine off&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Activer SFTP&lt;br /&gt;
&amp;lt;IfModule mod_sftp.c&amp;gt;&lt;br /&gt;
	SFTPEngine on&lt;br /&gt;
	Port 2222&lt;br /&gt;
	# Pièger l'utilisateur (chroot) dans son répertoire personnel&lt;br /&gt;
	DefaultRoot ~&lt;br /&gt;
	# Journalisation&lt;br /&gt;
	SFTPLog /var/log/proftpd/sftp.log&lt;br /&gt;
	SyslogLevel info&lt;br /&gt;
	TransferLog /var/log/proftpd/xferlog&lt;br /&gt;
	SystemLog /var/log/proftpd/proftpd.log&lt;br /&gt;
	# UseLastlog on&lt;br /&gt;
&lt;br /&gt;
	SFTPHostKey /etc/proftpd/ssh_host_ed25519_key&lt;br /&gt;
&lt;br /&gt;
	# Méthode d'authentification&lt;br /&gt;
	SFTPAuthMethods publickey&lt;br /&gt;
	SFTPAuthorizedUserKeys file:/etc/proftpd/authorized_keys/%u&lt;br /&gt;
	RequireValidShell off&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Utiliser les utilisateurs virtuels&lt;br /&gt;
&amp;lt;IfModule mod_auth.c&amp;gt;&lt;br /&gt;
	AuthOrder mod_auth_file.c&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Base des utilisateurs virtuels&lt;br /&gt;
&amp;lt;IfModule mod_auth_file.c&amp;gt;&lt;br /&gt;
	AuthUserFile /etc/proftpd/ftpd.passwd&lt;br /&gt;
	AuthGroupFile /etc/proftpd/ftpd.group&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Limiter l'accès aux utilisateurs virtuels&lt;br /&gt;
&amp;lt;Limit LOGIN&amp;gt;&lt;br /&gt;
	AllowUser toto&lt;br /&gt;
	DenyAll&lt;br /&gt;
&amp;lt;/Limit&amp;gt;&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{astuce|La configuration proposée impose l'usage de clés ''SSH'' pour la connexion des clients. Pour permettre l'utilisation des mots de passes en cas d'absence de clé, le mot &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; peut être ajouté à la suite après un espace dans le paramètre correspondant de la façon suivante : &amp;lt;code&amp;gt;SFTPAuthMethods publickey password&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
L'outil '''exige''' que le nom d'hôte redirige obligatoirement sur son adresse ''IP'' (il doit probablement utiliser cette information pour la création du socket ''TCP''). Définissez cette donnée en l'adaptant à votre configuration :&lt;br /&gt;
 echo -e &amp;quot;10.0.0.100\t${HOSTNAME}&amp;quot; &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
&lt;br /&gt;
===Éléments secrets===&lt;br /&gt;
Génération d'une clé ''SSH'' serveur&lt;br /&gt;
 ssh-keygen -t ed25519 -f /etc/proftpd/ssh_host_ed25519_key -N &amp;quot;&amp;quot;&lt;br /&gt;
 chmod 600 /etc/proftpd/ssh_host_ed25519_key&lt;br /&gt;
&lt;br /&gt;
Utilisation des clés ''SSH'' pour les clients&lt;br /&gt;
 mkdir /etc/proftpd/authorized_keys&lt;br /&gt;
&lt;br /&gt;
''Proftpd'' utilise volontairement un format de clé ''SSH'' différent d'[[Openssh|OpenSSH]] pour éviter les conflits avec ce dernier. Il a ainsi choisit la forme décrite dans la [https://www.rfc-editor.org/rfc/rfc4716 RFC 4716]. Il est possible de convertir une clé existante sans altération de l'originale (par retour sur ''stdout'') via la commande suivante sur le client&lt;br /&gt;
 ssh-keygen -e -f ~/.ssh/id_ed25519.pub&lt;br /&gt;
&lt;br /&gt;
Le résultat est à mettre dans le fichier de clés portant le nom de votre utilisateur ([http://www.proftpd.org/docs/contrib/mod_sftp.html#SFTPAuthorizedUserKeys directive] &amp;lt;code&amp;gt;SFTPAuthorizedUserKeys file:/etc/proftpd/authorized_keys/%u&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Exemple avec l'utilisateur ''toto''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt;&amp;gt; /etc/proftpd/authorized_keys/toto&lt;br /&gt;
---- BEGIN SSH2 PUBLIC KEY ----&lt;br /&gt;
VOTRE&lt;br /&gt;
CLÉ PUBLIQUE&lt;br /&gt;
AU FORMAT&lt;br /&gt;
RFC 4716&lt;br /&gt;
---- END SSH2 PUBLIC KEY ----&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est bien entendu possible de chaîner plusieurs clés dans ce même fichier. Il y aura donc autant de sections ''BEGIN/END'' que de clés.&lt;br /&gt;
&lt;br /&gt;
 chmod 600 /etc/proftpd/authorized_keys/toto&lt;br /&gt;
&lt;br /&gt;
===Utilisateurs virtuels===&lt;br /&gt;
Création du répertoire personnel de l'utilisateur virtuel&lt;br /&gt;
 mkdir -p /var/lib/proftpd/toto&lt;br /&gt;
 chown 2000:2000 /var/lib/proftpd/toto&lt;br /&gt;
&lt;br /&gt;
Création dudit utilisateur&lt;br /&gt;
 ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --uid=2000 --gid 2000 --home=/var/lib/proftpd/toto --shell=/bin/false --sha256 --name=toto&lt;br /&gt;
 ftpasswd --group --file=/etc/proftpd/ftpd.group --gid=2000 --member=toto --name=Moi&lt;br /&gt;
&lt;br /&gt;
{{astuce|Il est possible de remplacer le mot de passe haché par un &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; ou tout autre caractère ne correspondant pas à un mot de passe haché dans le fichier &amp;lt;code&amp;gt;passwd&amp;lt;/code&amp;gt; afin de désactiver le mot de passe. L'option &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--lock&amp;lt;/code&amp;gt; peut également être passée à la [http://www.proftpd.org/docs/contrib/ftpasswd.html commande] de création de l'utilisateur (concatène ce caractère au mot haché). Seule les connexions par clé ''SSH'' seront alors autorisées.}}&lt;br /&gt;
&lt;br /&gt;
===Test et application===&lt;br /&gt;
Il est possible de tester la configuration avec la commande suivante&lt;br /&gt;
 proftpd -t -d 10&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; permet d'augmenter le niveau de verbosité du journal sur la sortie standard (de 0 à 10). Il est également possible d'augmenter le niveau de journalisation en conduite en passant la valeur &amp;lt;code&amp;gt;debug&amp;lt;/code&amp;gt; à la directive &amp;lt;code&amp;gt;SyslogLevel&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Redémarrer le service pour prendre en compte les modifications (inutile pour la création ou le changement de mot de passe d'un utilisateur)&lt;br /&gt;
 systemctl restart proftpd.service&lt;br /&gt;
&lt;br /&gt;
Vous pouvez désormais utiliser un client ''SFTP'' pour vérifier le bon fonctionnement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec celui d{{'}}''OpenSSH'' :&lt;br /&gt;
 sftp -oPort=2222 toto@10.0.0.100&lt;br /&gt;
ou&lt;br /&gt;
 sftp -P 2222 toto@10.0.0.100&lt;br /&gt;
&lt;br /&gt;
===Sources de la section===&lt;br /&gt;
* http://www.proftpd.org/docs/directives/&lt;br /&gt;
* https://linux.die.net/man/8/proftpd&lt;br /&gt;
* https://fr.linux-console.net/?p=5239&lt;br /&gt;
* https://blog.victor-hery.com/2019/03/installer-sftp-proftpd.html&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Proftpd&amp;diff=1536</id>
		<title>Proftpd</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Proftpd&amp;diff=1536"/>
		<updated>2024-09-01T20:47:06Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Page créée avec « Category:Service_partage  [http://proftpd.org/ ProFTPd] est un logiciel permettant de monter un serveur de fichiers basé sur les protocoles ''FTP'' ; ''FTPS'' et SFTP. Il a la particularité d'utiliser des fichiers de configuration proches de ceux d'Apache2.  =Installation= Référence dans son domaine, il est probablement disponible dans les dépôts de la distribution ''Linux'' que vous utilisez. Pour ''Debian 12'', la commande suivante... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Service_partage]]&lt;br /&gt;
&lt;br /&gt;
[http://proftpd.org/ ProFTPd] est un logiciel permettant de monter un serveur de fichiers basé sur les protocoles ''FTP'' ; ''FTPS'' et [[Sftp-server|SFTP]]. Il a la particularité d'utiliser des fichiers de configuration proches de ceux d'[[Apache2]].&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
Référence dans son domaine, il est probablement disponible dans les dépôts de la distribution ''Linux'' que vous utilisez. Pour ''Debian 12'', la commande suivante permet d'installer le paquet&lt;br /&gt;
 apt install --no-install-recommends proftpd proftpd-mod-crypto&lt;br /&gt;
&lt;br /&gt;
''ProFTPd'' supporte un grand nombre de modules. Le paquet &amp;lt;code&amp;gt;proftpd-mod-crypto&amp;lt;/code&amp;gt; permet d'utiliser ''FTP'' sur ''TLS'', aussi appelé ''FTPS'' ainsi que ''SFTP'', le protocole de transfert de fichiers sur [[Openssh|SSH]].&lt;br /&gt;
&lt;br /&gt;
==SFTP==&lt;br /&gt;
De nos jours, l'utilisation des protocoles ''FTP'' et sont pendant chiffré, ''FTPS'', est dépréciée. Les raisons principales de cette tendance, malgré les qualités indéniables de ces derniers est principalement dû à l'explosion des ''NAT/PAT'' sur les réseaux ''WAN'' ainsi que la systématisation des règles de pare-feux. ''FTP'' est en effet un vieux protocole imaginé à une époque où il était normal (allez savoir pourquoi) d'utiliser une multitude de ports pour réaliser une action simple. Aussi, le port 20/''TCP'' était utilisé pour les données alors que le 21/''TCP'' servait pour transmettre les commandes. La version chiffrée quant à elle utilisait carrément des plages de ports au dessus de 1024 en plus de ceux mentionnés, rendant toute tentative de filtrage fin veine et occasionnait des problèmes de fiabilité avec certaines passerelles ''NAT'' (que je n'ai pour ma part jamais rencontré).&lt;br /&gt;
&lt;br /&gt;
Cependant, la vacance occasionnée par la dépréciation de ces protocoles n'a jamais été réellement comblée. [[Apache2#Partage_WebDAV|WebDAV]] n'est pas très fiable dans ces implémentations (surtout sous [[Windows_net_use#Usages_concrets|Windows]]) et est plus que casse pied à configurer côté serveur (y'a toujours un truc qui va pas) ; ''HTTP'' seul ne permet pas le transfert de répertoires, [[Samba]] et [[Nfs|NFS]] ne sont pas fait pour du ''WAN'' en plus de proposer une sécurité (surtout pour ce dernier) très discutable, ''ISCSI'' ne fonctionne qu'en mode bloc ; [[Sftp-server|SFTP]] embarqué dans un serveur ''SSH'' utilise traditionnellement des utilisateurs ''POSIX'', ce qui oblige à porter une attention toute particulière au durcissement de la configuration en plus de permettre des répercutions catastrophiques en cas de faille (un utilisateur destiné au transfert de fichiers peut, en fin de compte, se connecter au serveur...) ; etc... Aucun remplaçant potentiel n'a donc su prendre la relève avec la légèreté et les fonctionnalités du protocole de transfert de fichiers (''File Transfer Protocol'') traditionnel :&lt;br /&gt;
* installation et utilisation simple&lt;br /&gt;
* utilisateurs virtuels avec base de données de multiple types allant du fichier plain à la base [[MariaDB - Gestion utilisateurs|SQL]] en passant par l'annuaire [[Ldap|LDAP]]&lt;br /&gt;
* emprisonnement des comptes utilisateurs dans un répertoire (''chroot'')&lt;br /&gt;
* pas de ''shell''&lt;br /&gt;
* gestion des droits&lt;br /&gt;
* reprise de téléchargements partiels&lt;br /&gt;
* performances maximales&lt;br /&gt;
* support très large&lt;br /&gt;
&lt;br /&gt;
L'implémentation de ''SFTP'' proposée par ''ProFTPd'' s'avère alors particulièrement intéressante car elle est décorrélée de tout serveur ''SSH'' et permet l'utilisation de comptes virtuels emprisonnés sans utilisation de ''shell'', réduisant ainsi drastiquement la surface d'attaque. De plus, ce logiciel est reconnu comme apportant un soin prononcé à la sécurité et est éprouvé depuis plusieurs décennies. Il permettra donc de proposer un service quasiment similaire tout en apportant la confidentialité exigée par l'époque...&lt;br /&gt;
&lt;br /&gt;
===Configuration du service===&lt;br /&gt;
En mode ''SFTP'' uniquement&lt;br /&gt;
 mv /etc/proftpd/proftpd.conf /etc/proftpdproftpd.conf.ori&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/proftpd/proftpd.conf&lt;br /&gt;
# Chargement du module SFTP&lt;br /&gt;
LoadModule mod_sftp.c&lt;br /&gt;
&lt;br /&gt;
# Désactiver le service FTPS&lt;br /&gt;
&amp;lt;IfModule mod_tls.c&amp;gt;&lt;br /&gt;
	TLSEngine off&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Activer SFTP&lt;br /&gt;
&amp;lt;IfModule mod_sftp.c&amp;gt;&lt;br /&gt;
	SFTPEngine on&lt;br /&gt;
	Port 2222&lt;br /&gt;
	# Pièger l'utilisateur (chroot) dans son répertoire personnel&lt;br /&gt;
	DefaultRoot ~&lt;br /&gt;
	# Journalisation&lt;br /&gt;
	SFTPLog /var/log/proftpd/sftp.log&lt;br /&gt;
	SyslogLevel info&lt;br /&gt;
	TransferLog /var/log/proftpd/xferlog&lt;br /&gt;
	SystemLog /var/log/proftpd/proftpd.log&lt;br /&gt;
	# UseLastlog on&lt;br /&gt;
&lt;br /&gt;
	SFTPHostKey /etc/proftpd/ssh_host_ed25519_key&lt;br /&gt;
&lt;br /&gt;
	# Méthode d'authentification&lt;br /&gt;
	SFTPAuthMethods publickey&lt;br /&gt;
	SFTPAuthorizedUserKeys file:/etc/proftpd/authorized_keys/%u&lt;br /&gt;
	RequireValidShell off&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Utiliser les utilisateurs virtuels&lt;br /&gt;
&amp;lt;IfModule mod_auth.c&amp;gt;&lt;br /&gt;
	AuthOrder mod_auth_file.c&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Base des utilisateurs virtuels&lt;br /&gt;
&amp;lt;IfModule mod_auth_file.c&amp;gt;&lt;br /&gt;
	AuthUserFile /etc/proftpd/ftpd.passwd&lt;br /&gt;
	AuthGroupFile /etc/proftpd/ftpd.group&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Limiter l'accès aux utilisateurs virtuels&lt;br /&gt;
&amp;lt;Limit LOGIN&amp;gt;&lt;br /&gt;
	AllowUser toto&lt;br /&gt;
	DenyAll&lt;br /&gt;
&amp;lt;/Limit&amp;gt;&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{astuce|La configuration proposée impose l'usage de clés ''SSH'' pour la connexion des clients. Pour permettre l'utilisation des mots de passes en cas d'absence de clé, le mot &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; peut être ajouté à la suite après un espace dans le paramètre correspondant de la façon suivante : &amp;lt;code&amp;gt;SFTPAuthMethods publickey password&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
L'outil '''exige''' que le nom d'hôte redirige obligatoirement sur son adresse ''IP'' (il doit probablement utiliser cette information pour la création du socket ''TCP''). Définissez cette donnée en l'adaptant à votre configuration :&lt;br /&gt;
 echo -e &amp;quot;10.0.0.100\t${HOSTNAME}&amp;quot; &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
&lt;br /&gt;
===Éléments secrets===&lt;br /&gt;
Génération d'une clé ''SSH'' serveur&lt;br /&gt;
 ssh-keygen -t ed25519 -f /etc/proftpd/ssh_host_ed25519_key -N &amp;quot;&amp;quot;&lt;br /&gt;
 chmod 600 /etc/proftpd/ssh_host_ed25519_key&lt;br /&gt;
&lt;br /&gt;
Utilisation des clés ''SSH'' pour les clients&lt;br /&gt;
 mkdir /etc/proftpd/authorized_keys&lt;br /&gt;
&lt;br /&gt;
''Proftpd'' utilise volontairement un format de clé ''SSH'' différent d'[[Openssh|OpenSSH]] pour éviter les conflits avec ce dernier. Il a ainsi choisit la forme décrite dans la [https://www.rfc-editor.org/rfc/rfc4716 RFC 4716]. Il est possible de convertir une clé existante sans altération de l'originale (par retour sur ''stdout'') via la commande suivante sur le client&lt;br /&gt;
 ssh-keygen -e -f ~/.ssh/id_ed25519.pub&lt;br /&gt;
&lt;br /&gt;
Le résultat est à mettre dans le fichier de clés portant le nom de votre utilisateur ([http://www.proftpd.org/docs/contrib/mod_sftp.html#SFTPAuthorizedUserKeys directive] &amp;lt;code&amp;gt;SFTPAuthorizedUserKeys file:/etc/proftpd/authorized_keys/%u&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Exemple avec l'utilisateur ''toto''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt;&amp;gt; /etc/proftpd/authorized_keys/toto&lt;br /&gt;
---- BEGIN SSH2 PUBLIC KEY ----&lt;br /&gt;
VOTRE&lt;br /&gt;
CLÉ PUBLIQUE&lt;br /&gt;
AU FORMAT&lt;br /&gt;
RFC 4716&lt;br /&gt;
---- END SSH2 PUBLIC KEY ----&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est bien entendu possible de chaîner plusieurs clés dans ce même fichier. Il y aura donc autant de sections ''BEGIN/END'' que de clés.&lt;br /&gt;
&lt;br /&gt;
 chmod 600 /etc/proftpd/authorized_keys/toto&lt;br /&gt;
&lt;br /&gt;
===Utilisateurs virtuels===&lt;br /&gt;
Création du répertoire personnel de l'utilisateur virtuel&lt;br /&gt;
 mkdir -p /var/lib/proftpd/toto&lt;br /&gt;
 chown 2000:2000 /var/lib/proftpd/toto&lt;br /&gt;
&lt;br /&gt;
Création dudit utilisateur&lt;br /&gt;
 ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --uid=2000 --gid 2000 --home=/var/lib/proftpd/toto --shell=/bin/false --sha256 --name=toto&lt;br /&gt;
 ftpasswd --group --file=/etc/proftpd/ftpd.group --gid=2000 --member=toto --name=Moi&lt;br /&gt;
&lt;br /&gt;
{{astuce|Il est possible de remplacer le mot de passe haché par un &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; ou tout autre caractère ne correspondant pas à un mot de passe haché dans le fichier &amp;lt;code&amp;gt;passwd&amp;lt;/code&amp;gt; afin de désactiver le mot de passe. L'option &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--lock&amp;lt;/code&amp;gt; peut également être passée à la [http://www.proftpd.org/docs/contrib/ftpasswd.html commande] de création de l'utilisateur (concatène ce caractère au mot haché). Seule les connexions par clé ''SSH'' seront alors autorisées.}}&lt;br /&gt;
&lt;br /&gt;
===Test et application===&lt;br /&gt;
Il est possible de tester la configuration avec la commande suivante&lt;br /&gt;
 proftpd -t -d 10&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; permet d'augmenter le niveau de verbosité du journal sur la sortie standard (de 0 à 10). Il est également possible d'augmenter le niveau de journalisation en conduite en passant la valeur &amp;lt;code&amp;gt;debug&amp;lt;/code&amp;gt; à la directive &amp;lt;code&amp;gt;SyslogLevel&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Redémarrer le service pour prendre en compte les modifications (inutile pour la création ou le changement de mot de passe d'un utilisateur)&lt;br /&gt;
 systemctl restart proftpd.service&lt;br /&gt;
&lt;br /&gt;
Vous pouvez désormais utiliser un client ''SFTP'' pour vérifier le bon fonctionnement.&lt;br /&gt;
&lt;br /&gt;
Exemple avec celui d{{'}}''OpenSSH'' :&lt;br /&gt;
 sftp -oPort=2222 toto@10.0.0.100&lt;br /&gt;
ou&lt;br /&gt;
 sftp -P 2222 toto@10.0.0.100&lt;br /&gt;
&lt;br /&gt;
===Sources de la section===&lt;br /&gt;
* http://www.proftpd.org/docs/directives/&lt;br /&gt;
* https://linux.die.net/man/8/proftpd&lt;br /&gt;
* https://fr.linux-console.net/?p=5239&lt;br /&gt;
* https://blog.victor-hery.com/2019/03/installer-sftp-proftpd.html&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Openssh&amp;diff=1535</id>
		<title>Openssh</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Openssh&amp;diff=1535"/>
		<updated>2024-08-26T17:01:40Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout de deux précision concernant les clés publiques + emplacement des balises &amp;quot;syntaxhighlight inline&amp;quot; par &amp;quot;code&amp;quot; pour optimisation + remplacement d'un lien mort + corrections typographiques + correction d'une balise de coloration syntaxique&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:service_ssh]]&lt;br /&gt;
[[Category:shell]]&lt;br /&gt;
&lt;br /&gt;
=Authentification par clef SSH=&lt;br /&gt;
Au lieu de s'authentifier par mot de passe, les utilisateurs peuvent s'authentifier grâce à la cryptographie asymétrique et son couple de clefs privée/publique, comme le fait le serveur ''SSH'' auprès du client ''SSH''.&lt;br /&gt;
&lt;br /&gt;
==Générer ses clefs==&lt;br /&gt;
Pour générer un couple de clefs, tapez sur le client :&lt;br /&gt;
 ssh-keygen -t ed25519&lt;br /&gt;
&lt;br /&gt;
ou avec plus de paramètres :&lt;br /&gt;
&lt;br /&gt;
 ssh-keygen -a 100 -t ed25519 -f ~/.ssh/id_ed25519&lt;br /&gt;
&lt;br /&gt;
Paramètres :&lt;br /&gt;
* '''-a''' : nombre d'itérations de la [https://fr.wikipedia.org/wiki/Fonction_de_d%C3%A9rivation_de_cl%C3%A9 fonction de dérivation de clé]. Permet de rendre la clé plus résistante aux attaques par force brut. La valeur par défaut est définie à 16&lt;br /&gt;
* '''-t''' : type de clé. La taille d'une clé ''ed25519'' est fixée dans le code d{{'}}''OpenSSH''. Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; permet de la spécifier pour les autres formats&lt;br /&gt;
* '''-f''' : fichier de destination&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faut envoyer le fichier '''~/.ssh/id_ed25519.pub''' du client sur le serveur, tapez sur le client :&lt;br /&gt;
 scp /home/user/.ssh/id_ed25519.pub UTILISATEUR@SERVEUR:/home/user/.ssh/authorized_keys&lt;br /&gt;
&lt;br /&gt;
ou&lt;br /&gt;
&lt;br /&gt;
 ssh-copy-id -i ~/.ssh/id_ed25519.pub UTILISATEUR@SERVEUR&lt;br /&gt;
&lt;br /&gt;
''Note: le même paramètre &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; peut être utilisé avec la commande &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt; afin de spécifier la clé à utiliser si plusieurs sont présentes.''&lt;br /&gt;
&lt;br /&gt;
{{astuce|Pour [https://www.phcomp.co.uk/Tutorials/Unix-And-Linux/ssh-check-server-fingerprint.html vérifier l'empreinte] d'une clef, il faut utiliser la [https://linux.die.net/man/1/ssh-keygen commande] &amp;lt;code&amp;gt;ssh-keygen -lf /chemin/de/la/clef&amp;lt;/code&amp;gt;. Le hachis résultant est à comparer avec celui de la clef qui est présenté lors de la première connexion à un serveur (les deux doivent bien sûr être identiques). L'algorithme par défaut est le ''SHA256''. Pour modifier ce paramètre, il est possible d'utiliser le paramètre &amp;lt;code&amp;gt;-E &amp;lt;algo_hash&amp;gt;&amp;lt;/code&amp;gt;. Exemple : &amp;lt;code&amp;gt;ssh-keygen -lE md5 -f ~/.ssh/id_ed25519&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
En cas de suppression accidentelle de la clé publique, il est possible de la régénérer (à l'identique) à partir de la clé privée&lt;br /&gt;
 ssh-keygen -yf ~/.ssh/id_ed25519&lt;br /&gt;
&lt;br /&gt;
==Restreindre l'usage d'une clef==&lt;br /&gt;
Il est possible de limiter le périmètre d'usage d'une clef ''SSH'' via quelques paramètres dans le fichier ''authorized_keys'' du client. Il est ainsi possible de permettre la connexion d'un client avec une clef spécifique seulement depuis une liste d'''IP'' tout en forçant une commande précise. Par exemple:&lt;br /&gt;
 vim ~/.ssh/authorized_keys&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
from=&amp;quot;192.168.1.4,192.168.1.10&amp;quot;,command=&amp;quot;ls -al --color /&amp;quot; ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKWbjAEe0X+NFr0WjEgdJ2vKAIYwYSW6WkJvP2Zg/M4q root@toto&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le client n'effectuera alors automatiquement la commande définie par le paramètre ''command'' avant que la connexion ne se ferme d'elle même. De plus, la clef ne sera utilisable que depuis les adresses ''IP'' listés.&lt;br /&gt;
&lt;br /&gt;
===Sources de la section===&lt;br /&gt;
* https://stackoverflow.com/questions/402615/how-to-restrict-ssh-users-to-a-predefined-set-of-commands-after-login&lt;br /&gt;
* https://www.linuxjournal.com/article/8257&lt;br /&gt;
* http://man.openbsd.org/OpenBSD-current/man5/sshd_config.5#ForceCommand&lt;br /&gt;
&lt;br /&gt;
==Déactiver l'authentification par mot de passe==&lt;br /&gt;
Si nous voulons déactiver l'accès par mot de passe, il faut ajouter la ligne suivante au fichier '''/etc/ssh/sshd_config''' :&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:#808080&amp;quot;&amp;gt;[...]&amp;lt;/span&amp;gt;&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
&lt;br /&gt;
Vous pouvez vous référer à la section traitant du fichier de configuration d{{'}}''OpenSSH'' [[#Fichier sshd_config|plus bas]].&lt;br /&gt;
&lt;br /&gt;
=Déactiver known hosts de SSH=&lt;br /&gt;
==Problème==&lt;br /&gt;
Lors d'une exécution d'un script contenant du ''SSH'', et lorsque vous avez changé une de vos machines sur la quelle vous vous connectez, ssh demande une intervention humaine :&lt;br /&gt;
&lt;br /&gt;
 The authenticity of host '192.168.1.2 (192.168.1.2)' can't be established.&lt;br /&gt;
 ECDSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.&lt;br /&gt;
 Are you sure you want to continue connecting (yes/no)?&lt;br /&gt;
&lt;br /&gt;
Lorsque vous avez change l'ordinateur en gardant la même ''IP'' :&lt;br /&gt;
&lt;br /&gt;
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;br /&gt;
 @       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @&lt;br /&gt;
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;br /&gt;
 The RSA host key for foo-bar.net has changed,&lt;br /&gt;
 and the key for the corresponding IP address 127.0.0.1&lt;br /&gt;
 is unchanged. This could either mean that&lt;br /&gt;
 DNS SPOOFING is happening or the IP address for the host&lt;br /&gt;
 and its host key have changed at the same time.&lt;br /&gt;
 Offending key for IP in /home/user/.ssh/known_hosts:6&lt;br /&gt;
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;br /&gt;
 @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @&lt;br /&gt;
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;br /&gt;
 IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette intervention est que le script n'avance pas sans vous.&lt;br /&gt;
Pour ma part, j'ai un script qui se lance lors d'une coupure électrique, sans mon intervention mon script qui permet l'extinction de mes machines virtuelles ne se termine pas... c'est pas cool.&lt;br /&gt;
&lt;br /&gt;
==Résolution==&lt;br /&gt;
Voici une solution que j'ai trouvé : il faut passer des paramètres à notre commande ''SSH'' :&lt;br /&gt;
&lt;br /&gt;
 ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@192.168.1.2&lt;br /&gt;
&lt;br /&gt;
{{attention|Ceci désactive la vérification de la somme de contrôle des clés ''SSH''. Ne faîtes ceci que si vous savez ce que vous faîtes car cela rend votre connexion plus sensible à des attaques [https://fr.wikipedia.org/wiki/Attaque_de_l'homme_du_milieu de l'homme du milieu].}}&lt;br /&gt;
&lt;br /&gt;
=Séquences d'échappement=&lt;br /&gt;
Parfois lors de la perte d'une session ''SSH'' (problème de connexion ou bug coté serveur) le SHELL ne renvoi pas de ''broken pipe'', ce qui fait que l'on se retrouve avec un terminal bloqué (hyper casse couille) et la seule façon de s'en sortir est d'user de la commande &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt;. La seule ? Pas tout à fait.&lt;br /&gt;
&lt;br /&gt;
Il existe un truc qui déchire et qu'on ne trouve nul par (c'est toujours les meilleurs choses les mieux gardées) : les séquences d'échappement.&lt;br /&gt;
&lt;br /&gt;
Ces séquences permettent d'interagir avec le SHELL se trouvant en dessous de la session ''SSH'' via le client ''OpenSSH'' lui même. Ainsi, on peu demander à ce cher client de tuer lui même la session au lieu de devoir le faire à sa place quand rien ne va plus (sympa non ?).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
Voici la liste exhaustive de ces merveilles (à précéder par la touche &amp;lt;code&amp;gt;&amp;lt;Entrer&amp;gt;&amp;lt;/code&amp;gt;) :&lt;br /&gt;
* '''~.''' : Termine la connexion (et toute les sessions multiplexées)&lt;br /&gt;
* '''~B''' : Envoi un ''BREAK'' au système distant&lt;br /&gt;
* '''~C''' : Ouvre un prompt ''ssh'' (la commande &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; permet de lister ce que l'on peut y faire)&lt;br /&gt;
* '''~R''' : Renégocie la clé de session (SSH version 2 uniquement)&lt;br /&gt;
* '''~V/v''' : Augmente/diminue le degré de verbosity (LogLevel)&lt;br /&gt;
* '''~^Z''' : Met ''SSH'' en pause&lt;br /&gt;
* '''~#''' : Liste toute les connexions redirigées&lt;br /&gt;
* '''~&amp;amp;''' : Quitte la session ''SSH'' sans la fermer. On ne peut pas revenir dessus, ça ne sert donc complètement à rien (je ne vois pas pourquoi quelqu'un à développer ça ?!)&lt;br /&gt;
*  '''~?''' : Écrit cette liste en anglais avec le vrai texte&lt;br /&gt;
* '''~~''' : Dans le cas ou le tild (''~'') entre en conflit avec quelque chose, il est possible de le taper 2 fois avant une séquence d'échappement pour l'envoyer.&lt;br /&gt;
&lt;br /&gt;
{{info|Ceci ne fonctionne que lorsque le ''shell'' ne nous donne pas la main. Vous pouvez tester sur une page de &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; pour tester par exemple.}}&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://askubuntu.com/questions/29942/how-can-i-break-out-of-ssh-when-it-locks&lt;br /&gt;
* https://lonesysadmin.net/2011/11/08/ssh-escape-sequences-aka-kill-dead-ssh-sessions/amp/&lt;br /&gt;
&lt;br /&gt;
=Absence de broken pipe après un redémarrage=&lt;br /&gt;
Sur une ''Debian 8'' (''Jessie''), le fait de redémarrer une machine alors que l'on est connecté en ''SSH'' sur celle-ci ne renvoi pas de ''broken pipe'' (la session n'est pas clôturée à l'extinction). Ceci est très énervant car on se retrouve avec un terminal bloqué sur un prompt inactif et l'arrivé du fameux ''broken pipe'' se fait, dans le meilleur des cas, attendre une bonne minute, dans le pire, pour toujours... Pour régler cette merde il suffit d'installer la librairie ''Systemd'' qui gère se comportement et de redémarrer la machine.&lt;br /&gt;
 apt install libpam-systemd&lt;br /&gt;
 reboot&lt;br /&gt;
&lt;br /&gt;
=Tunnel SSH=&lt;br /&gt;
Faire un tunnel ''SSH'' :&lt;br /&gt;
 ssh -L 5232:localhost:5232 root@192.168.180.32&lt;br /&gt;
&lt;br /&gt;
Paramètres :&lt;br /&gt;
* '''-L''' : Rediriger un flux ''TCP'' ou un socket UNIX sur le client local&lt;br /&gt;
* '''Format''' : ''&amp;lt;port local que l'on utilisera sur notre machine&amp;gt;''''':'''''&amp;lt;adresse de l'hôte distant&amp;gt;''''':'''''&amp;lt;port du service distant&amp;gt;''&lt;br /&gt;
Ceci mérite une explication pour être clair. Parfois, on installe un programme ([http://radicale.org Radicale] pour mon exemple) qui écoute exclusivement sur son localhost (127.0.0.1) via le port 5232. Quand le serveur n'a pas d'interface graphique (ce qui est normalement le cas si on est pas ''Windobien''), on a pas de navigateur internet. Il peut être utile d'accéder quand même à l'interface d'admin du service (en fait on en a absolument besoin). Il faut donc rediriger le trafic du localhost de l'hôte distant sur notre machine pour l'administration. On prend donc le trafic localhost:5232 du serveur et on le balance sur le localhost:5232 de notre PC local d'admin.&lt;br /&gt;
&lt;br /&gt;
=Relai SSH=&lt;br /&gt;
Dans le cas d'une machine accessible seulement depuis une autre (cas d'un PC derrière un routeur ''NAT'' par exemple) embarquant un serveur ''SSH'', il est possible de l'utiliser comme ''Proxy SSH'' afin de joindre celle-ci. Ceci m'est utile pour administrer des machines virtuelles opérants dans un ''VLAN NATté'' par l'hyperviseur avec ma [[#Authentification_par_clef_SSH|clé SSH]]. Pour ce faire, depuis le client:&lt;br /&gt;
 ssh -J titi@relai toto@destination&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://tuxicoman.jesuislibre.net/2017/02/connexion-ssh-a-travers-un-ordinateur-relai-avec-proxyjump.html&lt;br /&gt;
&lt;br /&gt;
=SSH inversé=&lt;br /&gt;
Il est possible de se connecter au client ayant initié une session ''SSH'' via la création d'un socket spécifique. Cette technique se nomme le ''reverse SSH''. Cela peut-être utile dans le cas d'un dépannage ou pour transférer des fichiers à une machine ne disposant pas d'un accès publique à Internet (cas d'un ''NAT'' par exemple). Cette méthode permet alors la prise en main d'un client sans redirection de port au niveau de son accès ''WAN''.&lt;br /&gt;
&lt;br /&gt;
Depuis le client vers le dépanneur :&lt;br /&gt;
 ssh -NR 12345:localhost:22 utilisateur-dépanneur@ip-dépanneur&lt;br /&gt;
&lt;br /&gt;
Paramètres :&lt;br /&gt;
* '''-N''' : n'exécute ni aucune commande ni aucun shell. Cela permet de n'utiliser la session ''SSH'' que pour ouvrir un socket distant et non pour administrer la destination. Dans notre cas, la session sert juste à créer le socket sur lequel nous allons nous connecter&lt;br /&gt;
* '''-R''' : redirige le socket local vers le socket distant. C'est ce paramètre qui permettra au dépanneur de se connecter au client via un socket local créé pour l'occasion&lt;br /&gt;
* '''12345:localhost:22''' : socket-sur-dépanneur:adresse-d'écoute-du-socket:socket-à-rediriger-vers-12345&lt;br /&gt;
&lt;br /&gt;
Depuis le dépanneur vers le client en passant par le socket redirigé :&lt;br /&gt;
 ssh -p 12345 utilisateur-client@localhost&lt;br /&gt;
&lt;br /&gt;
Il est aussi possible d'y transférer des fichiers :&lt;br /&gt;
 scp -P 12345 /chemin/fichier/dépanneur utilisateur-client@localhost:/destination/fichier/pour/le/client&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://doc.ubuntu-fr.org/tutoriel/reverse_ssh#connexion_directe&lt;br /&gt;
&lt;br /&gt;
=Agent SSH=&lt;br /&gt;
Le serveur ''OpenSSH'' embarque un agent capable d'enregistrer le mot de passe de vos clés ''SSH''. Vous pouvez donc initier des connexion sans avoir à renseigner cette information à chaque fois.&lt;br /&gt;
&lt;br /&gt;
Initialiser l'agent pour le [[Shell bash|shell]] courant&lt;br /&gt;
 eval &amp;quot;$(ssh-agent -s)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Enregistrer le mot de passe de votre clé&lt;br /&gt;
 ssh-add /root/.ssh/id_ed25519&lt;br /&gt;
&lt;br /&gt;
{{Info|Utilisée sans argument, la commande &amp;lt;code&amp;gt;ssh-add&amp;lt;/code&amp;gt; va chercher les clés dans le répertoire personnel de votre utilisateur local courant.}}&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://rabexc.org/posts/using-ssh-agent&lt;br /&gt;
* https://mytrashcode.com/open-connection-authentication-agent&lt;br /&gt;
&lt;br /&gt;
=Fichier sshd_config=&lt;br /&gt;
Voici quelques paramètres qu'il peut être utile d'appliquer sur un serveur ''SSH'' (&amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;) :&lt;br /&gt;
&lt;br /&gt;
==Généralités==&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 &lt;br /&gt;
 AllowUsers toto sauvegardes&lt;br /&gt;
 ClientAliveInterval 1800&lt;br /&gt;
 &lt;br /&gt;
 UseDNS no&lt;br /&gt;
&lt;br /&gt;
Description des paramètres :&lt;br /&gt;
* '''PermitRootLogin''' ''{no|yes|prohibit-password}'' : définit si l'utilisateur ''root'' peut se connecter. La directive '''prohibit-password''' permet de n'autoriser que l'utilisation de [[#Authentification par clef SSH|clés SSH]] avec ce dernier&lt;br /&gt;
* '''PasswordAuthentication''' ''{no|yes}'' : définit si la connexion par mot de passe est autorisé pour tous les utilisateurs (''root'' à part) ou si seulement les clés SSH sont permises&lt;br /&gt;
* '''AllowUsers''' : liste blanche des utilisateurs autorisés à ce connecter&lt;br /&gt;
* '''ClientAliveInterval''' : si le paramètre est définit, ''OpenSSH'' compte le temps (en secondes) depuis le dernier paquet reçu du client et envoi une demande de réponse à celui-ci. Couplé au paramètre '''ClientAliveCountMax''' (valeur par défaut à ''3''), le serveur fermera automatiquement la session en cas de non réponse prolongée de ce dernier (nombre de fois compté depuis la dernière réponse). Ceci n'est utile que si la connexion entre les deux paires est interrompu (plus de réseau)&lt;br /&gt;
* '''UseDNS''' ''{no|yes}'' : définit si ''OpenSSH'' doit résoudre les noms de domaine. Ce paramètre, non content d'être inutile, ralenti CONSIDÉRABLEMENT l'établissement de la connexion dans le cas ou le serveur ''DNS'' est injoignable (fréquent dans des ''LAB'' de tests)&lt;br /&gt;
&lt;br /&gt;
==Chiffrement==&lt;br /&gt;
N'utiliser que des [https://cipherlist.eu/ chiffrements sérieux] :&lt;br /&gt;
 KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256&lt;br /&gt;
 Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr&lt;br /&gt;
 MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com&lt;br /&gt;
&lt;br /&gt;
Je vous conseil également d'utiliser que des clés ''RSA'' et ''ed25519'' en commentant les lignes &amp;lt;code&amp;gt;HostKey /etc/ssh/ssh_host_dsa_key&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;HostKey /etc/ssh/ssh_host_ecdsa_key&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Vérifiez également que la version de ''SSH'' utilisée est la 2 via le paramètre &amp;lt;code&amp;gt;Protocol 2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
N'oubliez pas de recharger le service :&lt;br /&gt;
 systemctl reload ssh&lt;br /&gt;
&lt;br /&gt;
=Fichier ssh_config=&lt;br /&gt;
Le client ''SSH'' peut aussi être configuré par utilisateur du système. Il sera alors possible de définir des paramètres personnalisés en fonction de celui se connectant à une machine. Le fichier est à créer dans le répertoire personnel de chaque utilisateur le nécessitant (&amp;lt;code&amp;gt;~/.ssh/config&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Pour utiliser une clé spécifique pour la connexion à une machine :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Host nomMachine&lt;br /&gt;
	Hostname	fc00:0:0:1::2&lt;br /&gt;
	User		root&lt;br /&gt;
	Port		22&lt;br /&gt;
	IdentityFile	~/.ssh/id_ed25519-sauv&lt;br /&gt;
	IdentitiesOnly	yes&lt;br /&gt;
	IgnoreUnknown	UseKeychain,AddKeysToAgent&lt;br /&gt;
	AddKeysToAgent	yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Description des paramètres :&lt;br /&gt;
* '''Host nomMachine''' : Ouvre une section concernant un hôte en particulier. La valeur ''nomMachine'' vient créer un nom d'hôte utilisable par ''OpenSSH'' au même titre que si l'on avait rentré une ligne dans le fichier ''hosts''&lt;br /&gt;
* '''Hostname''' : adresse de la machine distante&lt;br /&gt;
* '''User''' : utilisateur de la machine distante&lt;br /&gt;
* '''Port''' : port ''SSH'' de la machine distante&lt;br /&gt;
* '''IdentityFile''' : clé ''SSH'' à utiliser (par défaut, seul les noms de clés par défaut sont recherchés)&lt;br /&gt;
* '''IdentitiesOnly''' : n'utilise que la clé spécifiée dans le paramètre précédent. Si omis, le client ''SSH'' va tester une connexion distante avec toute les clés qu'il trouvera (occasionnant autant d'échec de connexion sur la machine distante)&lt;br /&gt;
* '''IgnoreUnknown''' : permet d'ignorer les paramètres inexistants. Les deux valeurs sont des paramètres faisant la même chose mais sur deux systèmes différents. La première est pour MacOSX et la deuxième pour Linux. Cela permet de faire des copier/coller de configuration sans réfléchir&lt;br /&gt;
* '''AddKeysToAgent''' : si la clé ''SSH'' utilisée contient une phrase de passe, elle ne sera demandée que la première fois et stockée dans l'agent ''SSH''&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://www.man7.org/linux/man-pages/man5/ssh_config.5.html&lt;br /&gt;
* https://computingforgeeks.com/managing-ssh-connections-on-linux-unix-using-ssh-config-file/&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Gns3&amp;diff=1534</id>
		<title>Gns3</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Gns3&amp;diff=1534"/>
		<updated>2024-08-23T21:00:58Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Correction d'une faute dans le nom de la catégorie &amp;quot;Méthode pyhton3 PIP&amp;quot; + actualisation de cette méthode d'installation + réorganisation de l'ordre des méthodes d'installation + remplacement des balises &amp;quot;sources&amp;quot; obsolètes + corrections typographiques + déplacement d'une partie de l'introduction de la section &amp;quot;Installation&amp;quot; dans la sous-section &amp;quot;Méthode APT&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:réseaux_linux]]&lt;br /&gt;
[https://github.com/GNS3/gns3-gui GNS3] est un logiciel de simulation réseau. il peut simuler des matériels de l'équipementier ''Cisco'' en exploitant de vrais ''IOS'' ; exploiter ''qemu'' au travers du cadriciel ''libvirt'' pour émuler des équipements ; utiliser ''Docker'' ; intégrer des ''IOS'' tournant directement sous ''Linux'' afin d'ajouter des commutateurs de niveau 3 et plus encore. Nous nous trouvons donc avec des équipements virtuels qui réagissent comme des équipement physiques et qui, après avoir été reliés au monde réel par l'intermédiaire d'un pont sur la carte réseau de l'hôte, peuvent communiquer avec leurs pairs physiques de la même manière que de vrai équipements.&lt;br /&gt;
&lt;br /&gt;
{{info|Testé avec la version 2.0 sortie le 02/05/2017}}&lt;br /&gt;
&lt;br /&gt;
=Téléchargement=&lt;br /&gt;
Partie obsolète. Passez par [https://github.com/GNS3/gns3-gui GitHub].&lt;br /&gt;
''GNS3'' fait partie de ces logiciels casses couilles qui nécessitent un compte pour être téléchargé. Comme je ne supporte pas cette pratique (d'autant plus que ça se dit &amp;quot;logiciel libre&amp;quot; - pas très libre comme façon de faire), j'ai donc recensé les liens ''SourceForge'' du projet (c'est surtout utile si vous voulez le compiler vous-même ou si vous utilisez Mac OS X ou Windows). Pour les distributions Linux, vous trouverez la plupart du temps un binaire dans les dépôts.&lt;br /&gt;
&lt;br /&gt;
* '''Linux :''' https://sourceforge.net/projects/gns-3/files/Nightly%20Builds/2018-02-28/2.2/GNS3-2.2.0dev1.source.zip/download&lt;br /&gt;
* '''Mac :''' https://sourceforge.net/projects/gns-3/files/Releases/v2.1.3/GNS3-2.1.3.dmg/download&lt;br /&gt;
* '''Windows :''' https://sourceforge.net/projects/gns-3/files/Releases/v2.1.3/GNS3-2.1.3-all-in-one.exe/download&lt;br /&gt;
Dépôt du projet :&lt;br /&gt;
* https://sourceforge.net/projects/gns-3/files&lt;br /&gt;
* https://sourceforge.net/projects/gns-3/files/Nightly%20Builds/2018-02-28&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
{{info|Mise à jour du 23/08/2024 : depuis ''Debian 12'', '''seule''' la [[#Méthode_python3_PIP|méthode Python3 PIP]] est supporté via le paramètre d'installation &amp;lt;code&amp;gt;--break-system-packages&amp;lt;/code&amp;gt;. La section dédiée a été actualisée en conséquence. Veuillez noter également que l'installation ne fonctionne plus sur ''Debian Sid'' à cette même date. La procédure va donc logiquement probablement changer pour la version 13... Un ticket sur la confection d'un paquet portable est ouvert sur le dépôt [https://github.com/GNS3/gns3-gui/issues/2911 GitHub] du projet sans grande avancée à ce stade. Cela pourrait régler le problème épineux de l'installation et des mises à jours de cet outil à terme.}}&lt;br /&gt;
&lt;br /&gt;
Le paquet ''telnet'' sera également utile pour la connexion aux équipements virtuels&lt;br /&gt;
 apt install telnet&lt;br /&gt;
&lt;br /&gt;
==Méthode python3 PIP==&lt;br /&gt;
GNS3 est installable depuis le gestionnaire de paquet de ''Python3''. Cette méthode est la seule fonctionnelle sous ''Debian 12'' en 2024 :&lt;br /&gt;
 apt install python3-pip&lt;br /&gt;
 apt install python3-pyqt5.qtsvg python3-pyqt5.qtwebsockets&lt;br /&gt;
&lt;br /&gt;
 pip3 install --break-system-packages -U gns3-gui gns3-server PyQt5-sip PyQt5 aiohttp&lt;br /&gt;
&lt;br /&gt;
 wget https://doc.ycharbi.fr/fichiers/réseaux/gns3/ubridge -P /usr/bin/&lt;br /&gt;
 chmod 777 /usr/bin/ubridge&lt;br /&gt;
&lt;br /&gt;
''Note : le binaire de ubridge est celui des dépôts Debian Sid au 17/02/2019.''&lt;br /&gt;
&lt;br /&gt;
{{info|Depuis la version 2.2.5 sortie le 9 janvier 2020, la suite est automatique. Vous pouvez vous arrêter là pour la méthode ''python3 PIP''.}}&lt;br /&gt;
&lt;br /&gt;
Télécharger l'icône de l'application :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://doc.ycharbi.fr/fichiers/réseaux/gns3/images/gns3.png -P /usr/share/icons/hicolor/48x48/apps/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et créer le lanceur :&lt;br /&gt;
 vim /usr/share/applications/gns3.desktop&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Version=1.0&lt;br /&gt;
Type=Application&lt;br /&gt;
Terminal=false&lt;br /&gt;
Exec=gns3 %f&lt;br /&gt;
Name=GNS3&lt;br /&gt;
Comment=GNS3 Graphical Network Simulator&lt;br /&gt;
Icon=/usr/share/icons/hicolor/48x48/apps/gns3.png&lt;br /&gt;
Categories=Education;Network;&lt;br /&gt;
MimeType=application/x-gns3;application/x-gns3a;application/x-gns3project;&lt;br /&gt;
Keywords=simulator;network;netsim;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour :&lt;br /&gt;
 pip3 install --break-system-packages -U sip gns3-gui gns3-server PyQt5-sip PyQt5 aiohttp&lt;br /&gt;
&lt;br /&gt;
{{info|Si une des dépendances pose problème (c'était le cas pour ''pyqt5'' en version 5.14.1 vers fin 2019 - début 2020), il est possible d'en installer une version spécifique en la précisant ainsi : &amp;lt;code&amp;gt;pyqt5{{=}}{{=}}5.14.0&amp;lt;/code&amp;gt;. Le paquet a depuis changé de casse dans son nom comme vous pouvez le constater dans la ligne ce-dessus... Cet écosystème est insupportable. Il faut faire une veille constante, ce qui rend chaque mises à jours risquées et le maintient d'une documentation fonctionnelle impossible.}}&lt;br /&gt;
&lt;br /&gt;
==Méthode APT==&lt;br /&gt;
Méthode obsolète. Utilisez la [[#Méthode_python3_PIP|méthode Python3 PIP]].&lt;br /&gt;
&lt;br /&gt;
La version de ''GNS3'' disponible dans les dépôts ''Debian'' est affligeante, il s'agit d'une très ancienne version (elle ne permet même pas de supprimer les câbles que l'on connectes aux équipements...), nous allons donc ajouter le dépôt du projet pour être à jour.&lt;br /&gt;
&lt;br /&gt;
Depuis une installation via ''debootstrap'', le paquet &amp;lt;code&amp;gt;dirmngr&amp;lt;/code&amp;gt; est absent et est nécessaire à l'importation des clés ''GPG''. Il faut l'installer&lt;br /&gt;
 apt install dirmngr&lt;br /&gt;
&lt;br /&gt;
{{info|Sous Debian Stretch, la dépendance ''libvirt-bin'' ne peut être satisfaite car il s'agit d'un paquet de transition qui s'est vu découpé en deux paquets nommés ''libvirt-daemon-system'' et ''libvirt-clients'' (voir [https://lists.debian.org/debian-user/2016/11/msg00518.html ici]). Le problème c'est que sans un paquet qui s'appel ''libvirt-bin'', GNS3 est impossible à installer (et c'est pas faute d'avoir essayé, merci le gestionnaire de paquet ''apt'' qui sait se comporter comme une grosse merde quand il le faut). J'ai donc mis au point deux solution pour palier au problème. L'une exploite ''apt'' et une bidouille avec son ''sources.list'', l'autre utilise directement ''dpkg'' pour contourner le problème. Je conseil vivement d'utiliser la solution ''apt''.}}&lt;br /&gt;
&lt;br /&gt;
Comme nous l'avons vu, le paquet ''libvirt-bin'' n'est pas disponible dans les dépôts ''Stretch'' suite à un changement programmé de stratégies de ses mainteneurs. Cependant il est présent dans ceux de Debian Jessie puisque il en été au stade de transition à ce moment là. ''Jessie'' n'étant pas très différent de ''Stretch'', il n'y a pas de risques de stabilité en confondant ce paquet avec les autres. Nous allons donc combiner les dépôts de ''Jessie'' avec ceux de ''Stretch'' pour avoir ce qu'il nous faut. Pas de panique, ''apt'' n'étant pas si mal fait, il prendra toujours les paquets avec un numéros de version plus récent. Ce qui garanti que Seul les paquets absents de ''Stretch'' seront piochés dans ''Jessie''.&lt;br /&gt;
&lt;br /&gt;
Ajouter les dépôts de ''GNS3'' et ''Debian Jessie'' dans ''Stretch''&lt;br /&gt;
 echo -e '#GNS3\ndeb http://ppa.launchpad.net/gns3/ppa/ubuntu xenial main\n#Debian jessie (pour avoir le paquet libvirt-bin)\ndeb http://ftp.fr.debian.org/debian jessie main' &amp;gt;&amp;gt; /etc/apt/sources.list&lt;br /&gt;
&lt;br /&gt;
{{attention|Avec ''Debian sid/buster'', il faut remplacer la branche '''xenial''' du dépôt '''http://ppa.launchpad.net/gns3/ppa/ubuntu''' par '''bionic'''.}}&lt;br /&gt;
&lt;br /&gt;
Ajout de la clé ''GPG'' des dépôts ''GNS3''&lt;br /&gt;
 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F88F6D313016330404F710FC9A2FD067A2E3EF7B&lt;br /&gt;
&lt;br /&gt;
Mise à jour de la base ''apt''&lt;br /&gt;
 apt update&lt;br /&gt;
&lt;br /&gt;
Installation de ''GNS3''&lt;br /&gt;
 apt install gns3-gui&lt;br /&gt;
&lt;br /&gt;
Attribution des droits à l'outil ''ubridge''&lt;br /&gt;
 chmod 777 /usr/bin/ubridge&lt;br /&gt;
 setcap cap_net_admin,cap_net_raw=ep /usr/bin/ubridge&lt;br /&gt;
&lt;br /&gt;
==Méthode DPKG==&lt;br /&gt;
Cette méthode a été testé avec ''GNS3 1.5.3''. Elle est fonctionnelle mais en plus de sa lourdeur, elle ne permet pas une monté en version simple. Elle reste toutefois plus abordable que la compilation depuis les sources et a été documenté car je me suis bien fait chier pour la pondre quand j'en avais besoin.&lt;br /&gt;
&lt;br /&gt;
Installation des dépendances de ''gns3-gui'' (j'ai enlevé ''gns3-server'' qui réclame ''libvirt-bin'' qui n'existe pas)&lt;br /&gt;
 apt install python3 python3-pyqt5 python3-pyqt5.qtsvg wireshark vinagre libc6 libexpat1 zlib1g&lt;br /&gt;
&lt;br /&gt;
Installation des dépendances de ''gns3-server'' (j'ai enlevé ''libvirt-bin'' qui n'existe pas)&lt;br /&gt;
 apt install python3 vpcs qemu-system-x86 qemu-system-arm qemu-kvm cpulimit x11vnc xvfb libc6 libexpat1 zlib1g&lt;br /&gt;
&lt;br /&gt;
Téléchargement des dépendances non disponibles dans les dépôts ''Debian''&lt;br /&gt;
 wget http://ppa.launchpad.net/gns3/ppa/ubuntu/pool/main/d/dynamips/dynamips_0.2.16-1~xenial1_amd64.deb http://ppa.launchpad.net/gns3/ppa/ubuntu/pool/main/u/ubridge/ubridge_0.9.11-1~yakkety_amd64.deb&lt;br /&gt;
&lt;br /&gt;
Installation manuelle des dépendances non disponibles dans les dépôts Debian (dépôt ''GNS3'') pour ''gns3-server''&lt;br /&gt;
 dpkg -i dynamips_0.2.16-1~xenial1_amd64.deb ubridge_0.9.11-1~xenial_amd64.deb&lt;br /&gt;
&lt;br /&gt;
Installation de ''gns3-server'' sans ''libvirt-bin''&lt;br /&gt;
 dpkg -i --ignore-depends=libvirt-bin gns3-server_1.5.4~xenial1_amd64.deb&lt;br /&gt;
&lt;br /&gt;
Installation de ''gns3-gui''&lt;br /&gt;
 dpkg -i gns3-gui_1.5.3~xenial5_amd64.deb&lt;br /&gt;
&lt;br /&gt;
À ce stade nous avons ''GNS3'' d'installé. Ne criez pas victoire trop vite car ''libvirt-bin'', bien que nous ayant bien fiat chier reste un élément indispensable pour émuler les équipements. Il va donc falloir l'installer si on veut bénéficier de l’intérêt de ce logiciel. Pour se faire, soit vous optez pour l'installation des dépendances de ''libvirt-bin'' ainsi que lui même à la main, soit vous le récupérez depuis les dépôts ''Jessie'' comme avec la méthode ''apt''.&lt;br /&gt;
&lt;br /&gt;
{{astuce|Les dépendances des ''.deb'' se trouvent avec la commande &amp;lt;code&amp;gt;dpkg-deb --info nom.deb&amp;lt;/code&amp;gt;. Lorsque ''apt'' ne veut plus rien savoir et qu'il casse les couille on nettoie tout avec la commande &amp;lt;code&amp;gt;apt --fix-broken install&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
Attribution des droits à l'outil ''ubridge''&lt;br /&gt;
 chmod 777 /usr/bin/ubridge&lt;br /&gt;
 setcap cap_net_admin,cap_net_raw=ep /usr/bin/ubridge&lt;br /&gt;
&lt;br /&gt;
==Ajout d'un IOS Cisco==&lt;br /&gt;
Les ''IOS Cisco'' sont disponibles dans [https://{{SERVERNAME}}/fichiers/réseaux/cisco/ios/ nos fichiers]. Il sont à ajouter dans les modèles de routeur (vous trouverez, ce n'est pas très compliqué).&lt;br /&gt;
&lt;br /&gt;
=Lien avec le monde physique=&lt;br /&gt;
Faire son réseau virtuel est intéressant mais pouvoir exploiter ses atouts avec de vrais équipements, c'est encore mieux. Ainsi ont peut considérer sont PC hôte comme une baie avec plein d'équipement que l'on relie au réseau externe. Les possibilités sont infinies...&lt;br /&gt;
&lt;br /&gt;
Pour se faire, il faut créer une interface de lien local ''tap'' et lui assigner une adresse ''IP''. On ajoutera ensuite un &amp;quot;cloud&amp;quot; dans ''GNS3'' (équipement avec l'icône de nuage) et on le configurera pour ajouter cette interface dans l'onglet ''NIO TAP''. Il faut rentrer le nom de l'interface dans le champ prévu à cet effet : ''tap0''.&lt;br /&gt;
&lt;br /&gt;
{{info|Avec ''GNS3 2.0'', l'étape avec l'onglet n'est plus nécessaire car le nuage ajoute automatiquement les interfaces qu'il trouve sur l'hôte.}}&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
===Nouvelle méthode===&lt;br /&gt;
De nos jours, tout peut se faire via la commande &amp;lt;code&amp;gt;ip&amp;lt;/code&amp;gt; du paquet &amp;lt;code&amp;gt;iproute2&amp;lt;/code&amp;gt; comme expliqué [https://www.baturin.org/docs/iproute2/ ici].&lt;br /&gt;
 ip tuntap add dev tap0 mode tap user toto&lt;br /&gt;
 ip address add 10.200.200.1/30 dev tap0&lt;br /&gt;
 ip link set tap0 up&lt;br /&gt;
&lt;br /&gt;
===Ancienne méthode===&lt;br /&gt;
Installation des dépendances&lt;br /&gt;
 apt install uml-utilities&lt;br /&gt;
&lt;br /&gt;
Création de l'interface ''tap0'' et attribution d'une adresse ''IP''&lt;br /&gt;
 tunctl -t tap0&lt;br /&gt;
 ip a a 10.200.200.1/30 dev tap0&lt;br /&gt;
 # ou via ifconfig du paquet net-tools&lt;br /&gt;
 # ifconfig tap0 10.200.200.1 netmask 255.255.255.252&lt;br /&gt;
&lt;br /&gt;
==Problèmes==&lt;br /&gt;
Cette étape aussi simple qu'il puisse y paraître peut générer des erreurs bloquantes. Un message disant quand le chemin de ''ubridge'' n'est pas valide ou qu'il n'est pas installé peut survenir. C'est un problème de permission (Tapez &amp;lt;code&amp;gt;ub+&amp;lt;tab&amp;gt;&amp;lt;/code&amp;gt; dans un terminal connecté avec l'utilisateur qui doit exécuter ''GNS3'', si ''Bash'' n'auto-complète pas en ''ubridge'', c'est que &amp;lt;code&amp;gt;/usr/bin/ubridge&amp;lt;/code&amp;gt; n'a pas les bons droits. Sinon c'est que c'est un problème inconnu (ce qui ne serait pas surprenant vu comment c'est une galère à installer).&lt;br /&gt;
&lt;br /&gt;
Pour régler ça. Faire ceci :&lt;br /&gt;
 chown yohan:ubridge /usr/bin/ubridge&lt;br /&gt;
 setcap cap_net_admin,cap_net_raw=ep /usr/bin/ubridge&lt;br /&gt;
&lt;br /&gt;
Ce problème peut également survenir après une mise à jour de ''GNS3''.&lt;br /&gt;
&lt;br /&gt;
=Utilisation des Ios On Unix (IOU)=&lt;br /&gt;
''IOS on UNIX'' est un ''IOS'' qui tourne comme un programme sur une distribution ''Linux'' (ça aurai donc dû s'appeler ''IOL'', on est d'accord...). L’intérêt de cette solution est quelle permet de s'affranchir de la principale lacune de ''GNS3'' : l'impossibilité d'utiliser des commutateurs. Les ''IOU'' permettent également d'utiliser un grand nombre de fonctions réservées au haut de gamme des chez ''Cisco''. Sous ''Windows'', ''GNS3'' utilise [[qemu]] pour émuler une distribution ''Linux'' afin de faire tourner ''IOU'', ce qui en diminue très grandement l'intérêt (en même temps qu'elle idée d'utiliser ''Windows''...).&lt;br /&gt;
&lt;br /&gt;
Autre chose : Je n'ai pas réussi à déterminer si l'utilisation des ''IOU'' représentait une violation de licence car comme à son habitude, ''Cisco'' pratique l’obscurantisme sur les détails et personne ne semble se soucier de ce sujet...&lt;br /&gt;
&lt;br /&gt;
Les ''IOU'' sont des programmes 32 bits (sans commentaires...), on est donc obligé d'ajouter une dépendance ''i386'' dans notre chère distribution ''amd64''.&lt;br /&gt;
 dpkg --add-architecture i386&lt;br /&gt;
&lt;br /&gt;
 apt update&lt;br /&gt;
&lt;br /&gt;
''Attention si vous utilisez ma documentation sur [[apt-mirror]] et que des erreurs 404 s'affichent dû au fait que vous n'avez pas l'ensemble des dépôts ''i386'' en local (même si c'est des dépôts qui n'ont rien avoir avec la choucroute), je vous recommande de changer de serveur ''DNS'' dans &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; le temps de l'installation sinon vous allez tourner en rond avec des erreurs de dépendance APT bien casse couille (c'est du vécu) sans comprendre la raison de toute cette merde.''&lt;br /&gt;
 apt install libssl1.1:i386&lt;br /&gt;
&lt;br /&gt;
Il faut désormais créer un lien symbolique pour que ce balo d{{'}}''IOU'' la trouve (bah oui, c'est trop compliqué de pointer sur la bonne librairie hein, on va laisser l'utilisateur faire le travail à la place des dev de ''Cisco'' tien)&lt;br /&gt;
 ln -s /usr/lib/i386-linux-gnu/libcrypto.so.1.1 /usr/lib/libcrypto.so.4&lt;br /&gt;
&lt;br /&gt;
Pour que ''IOU'' fonctionne, il faut une licence, que l'on va devoir générer. Mais avant toute chose il faut faire pointer notre interface de lien local sur notre nom d'hôte ainsi qu'un nom de domaine de chez ''Cisco'' (probablement un mécanisme de vérification de licence). Dans mon exemple, mon nom d'hôte est ''debian'', adaptez à votre cas.&lt;br /&gt;
 echo &amp;quot;debian&amp;quot; &amp;gt; /etc/hostname&lt;br /&gt;
 hostname debian&lt;br /&gt;
 echo -e &amp;quot;127.0.0.1 debian\n127.0.0.1 xml.cisco.com&amp;quot; &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
&lt;br /&gt;
{{attention|La suite de cette procédure doit être exécuté en utilisateur standard.}}&lt;br /&gt;
&lt;br /&gt;
Téléchargez le script de génération de licence&lt;br /&gt;
 wget https://doc.ycharbi.fr/fichiers/r%c3%a9seaux/cisco/iou/CiscoKeyGen.py&lt;br /&gt;
&lt;br /&gt;
Générez la licence (veillez à bien utiliser python 2 et non 3)&lt;br /&gt;
 python2.7 CiscoKeyGen.py&lt;br /&gt;
&lt;br /&gt;
Copiez la section suivante dans &amp;lt;code&amp;gt;~/.iourc&amp;lt;/code&amp;gt; (celle du script hein, pas la mienne, sinon ça va pas marcher gros bêta)&lt;br /&gt;
 [license]                                                                               &lt;br /&gt;
 debian = b0acc48944f31bd4;&lt;br /&gt;
&lt;br /&gt;
Créez le répertoire d'accueil des ''IOU''&lt;br /&gt;
 mkdir -p ~/GNS3/images/IOU/&lt;br /&gt;
&lt;br /&gt;
Téléchargez des ''IOU'' (avec la commande suivante ou [https://{{SERVERNAME}}/fichiers/r%c3%a9seaux/cisco/iou/ ici])&lt;br /&gt;
 wget https://doc.ycharbi.fr/fichiers/r%c3%a9seaux/cisco/iou/i86bi-linux-l2-adventerprisek9-15.1a.bin https://doc.ycharbi.fr/fichiers/r%c3%a9seaux/cisco/iou/i86bi-linux-l3-adventerprisek9-15.2.4M1.bin -P ~/GNS3/images/IOU/&lt;br /&gt;
&lt;br /&gt;
Les ''IOU'' étant des programmes, il faut leur donner les droits d'exécution&lt;br /&gt;
 chmod +x ~/GNS3/images/IOU/*.bin&lt;br /&gt;
&lt;br /&gt;
La suite ce passe sous ''GNS3'' :&lt;br /&gt;
# Ajouter la licence dans GNS3 &amp;lt;code&amp;gt;Edit &amp;gt; Préférences &amp;gt; IOS on UNIX &amp;gt; Edit | Aller chercher ~/.iourc &amp;gt; Apply&amp;lt;/code&amp;gt;&lt;br /&gt;
# Ensuite, ajouter un modèle IOU dans GNS3 &amp;lt;code&amp;gt;Edit &amp;gt; Préférences &amp;gt; IOS on UNIX &amp;gt; IOU Device &amp;gt; New&amp;lt;/code&amp;gt;&lt;br /&gt;
# Profitez d'un truck qui déchire pour vos archis !&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* '''Principale :''' Principale : https://nlabweb.wordpress.com/2016/04/06/running-cisco-switches-on-gns3/#more-147&lt;br /&gt;
* '''Problème de libcrypto.so.4 :''' https://www.youtube.com/watch?v=chcHuF3nEoQ&lt;br /&gt;
* '''CiscoKeyGen :''' https://gist.github.com/paalfe/8edd82f780c650ae2b4a/archive/bd7b6b8a81c338359e6de4ff0ed0def9f7dc9146.zip&lt;br /&gt;
* '''Images IOU :''' https://drive.google.com/file/d/0B8tSmsEbVQs-bjVXY3VqMFJrc1E/view&lt;br /&gt;
&lt;br /&gt;
==À creuser==&lt;br /&gt;
Se passer de ''GNS3'' pour les ''IOU'' : https://myhowtosandprojects.blogspot.fr/2013/08/installing-and-running-iou-checking_10.html&lt;br /&gt;
&lt;br /&gt;
=Utilisation de Docker=&lt;br /&gt;
[[Docker]] est une solution de conteneurisation. Il permettra de créer des serveurs et des postes clients virtuelles ainsi que faire des analyses réseaux au sein de l'infra virtuelle. Docker n'est malheureusement pas dans les dépôts Debian. Il faut donc ajouter le dépôt officiel à la main.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
Pour l'installation de ''Docker'', ce référer à la page suivante : [[Docker#Installation|Installation de Docker]].&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
Ajout de l'utilisateur se servant de ''GNS3'' au groupe &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; (sinon l'application ne pourra pas se connecter au démon ''docker'' pour interagir avec les conteneurs)&lt;br /&gt;
 usermod -aG docker &amp;lt;VOTRE_UTILISATEUR_DE_GNS3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je n'ai pas trouver comment appliquer ces changements autrement qu'en redémarrant, navré&lt;br /&gt;
 reboot&lt;br /&gt;
&lt;br /&gt;
Téléchargement d'un conteneur ''Kalilinux'' (en ''root'')&lt;br /&gt;
 docker pull gns3/kalilinux&lt;br /&gt;
&lt;br /&gt;
{{astuce|Il y a un bon nombre de conteneurs téléchargeables dans le [https://hub.docker.com/r/gns3/ dépôt Docker du projet GNS3]. Je vous conseils d'aller y faire un tour.}}&lt;br /&gt;
&lt;br /&gt;
Il faut maintenant ajouter le conteneur à ''GNS3'' en tant que modèle. Pour se faire il faut aller dans les paramètres, dans la section dédié à ''Docker'' et faire du clickodrôme jusqu'à l'ajout de notre conteneur (le 3ème lien des sources montre la procédure officielle si vraiment vous êtes en galère).&lt;br /&gt;
&lt;br /&gt;
==Problèmes==&lt;br /&gt;
Tout comme ''ubridge'', ''Docker'' peut ne pas fonctionner pour cause de permission. Si la commande &amp;lt;code&amp;gt;docker ps&amp;lt;/code&amp;gt; renvoi une erreur de permission en tant que utilisateur utilisant ''GNS3'', c'est qu'il n'appartient pas au groupe &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
J'ai également eu l'erreur &amp;lt;code&amp;gt;Docker has returned an error: 304 b&amp;lt;/code&amp;gt; avec ''GNS3 1.5.3''. Je n'ai pas eu le temps de résoudre cette erreur qui a été corrigé avec la mise à jour 2.0 de ''GNS3'' et je n'ai pas de piste de résolution (ça semble être le problème de merde bien chiant à régler avec aucune aide sur Internet). Dieu vous garde si vous la rencontrez...&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
* https://store.docker.com/editions/community/docker-ce-server-debian?tab=description&lt;br /&gt;
* http://stackoverflow.com/questions/21871479/docker-cant-connect-to-docker-daemon&lt;br /&gt;
* https://docs.gns3.com/1KGkv1Vm5EgeDusk1qS1svacpuQ1ZUQSVK3XqJ01WKGc/index.html&lt;br /&gt;
* https://hub.docker.com/r/gns3/kalilinux/&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* http://docs.gns3.com/1QXVIihk7dsOL7Xr7Bmz4zRzTsJ02wklfImGuHwTlaA4/&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Mitmproxy&amp;diff=1533</id>
		<title>Mitmproxy</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Mitmproxy&amp;diff=1533"/>
		<updated>2024-08-15T15:42:16Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Corrections de fautes de français + légère mise en forme + ajout de la section &amp;quot;Sources&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Services_mandataire]]&lt;br /&gt;
&lt;br /&gt;
[https://mitmproxy.org/ Mitmproxy] est un mandataire (''proxy'') destiné au débogage, tests, notamment de pénétrations ainsi qu'aux évaluations des mesures de protections d'un système d'information.&lt;br /&gt;
Il est extrêmement utile pour comprendre le fonctionnement d'un programme officiant au travers de sessions ''HTTPS'' puisqu'il permet de réunir les éléments nécessaires à l'inspection des trames chiffrées par ''TLS''.&lt;br /&gt;
&lt;br /&gt;
Il peut, en outre, servir à espionner la navigation ''HTTPS'' des utilisateurs d'un réseau à accès limité (obligeant l'accès au ''WAN'' par l'intermédiaire d'un mandataire). À l'issue de la lecture de ce document, vous devriez être sensibilisé à ne jamais réaliser d'opérations personnelles sur ce genre de réseau (connexion à un ''Webmail'' ou à tout portail nécessitant un identifiant personnel par exemple).&lt;br /&gt;
&lt;br /&gt;
Cette documentation explique brièvement comment se servir de l'outil pour enregistrer les clés de sessions ''TLS'' et présente un cas pratique avec le déchiffrement d'un &amp;lt;code&amp;gt;docker pull&amp;lt;/code&amp;gt;. Les trames capturées via [[Tcpdump]] pourront alors être examinées par un outil graphique comme [[Wireshark]].&lt;br /&gt;
&lt;br /&gt;
=Mise en œuvre=&lt;br /&gt;
==Installation==&lt;br /&gt;
Installation de l'outil&lt;br /&gt;
 apt install --no-install-recommends mitmproxy&lt;br /&gt;
&lt;br /&gt;
Le fait de lancer &amp;lt;code&amp;gt;mitmproxy&amp;lt;/code&amp;gt; créé automatiquement le répertoire &amp;lt;code&amp;gt;~/.mitmproxy&amp;lt;/code&amp;gt; contenant les éléments secrets utilisés dans une transaction ''TLS''. Il est alors possible d'importer le certificat serveur dans la base local du client à espionner ou générer son propre certificat via [[openssl|OpenSSL]].&lt;br /&gt;
&lt;br /&gt;
Afin d'agrémenter la démonstration, la seconde solution sera utilisée. Outre l'aspect didactique, générer votre propre certificat est indispensable lorsque l'interception concerne la communication d'une application exigeante en terme de vérification (ce pourquoi [[Docker]] est utilisé en guise d'exemple). Il est en effet nécessaire dans ce cas d'ajouter des noms alternatifs dans la section &amp;lt;code&amp;gt;subjectAltName&amp;lt;/code&amp;gt; du [https://fr.wikipedia.org/wiki/X.509 certificat X.509] afin de spécifier les adresses signées par celui-ci.&lt;br /&gt;
&lt;br /&gt;
==Configuration des clés==&lt;br /&gt;
Création du répertoire d'accueil des éléments secrets&lt;br /&gt;
 mkdir -p ~/.mitmproxy/certs&lt;br /&gt;
&lt;br /&gt;
Génération desdits éléments&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
# Génération de la clé privée de l'autorité de certification (AC)&lt;br /&gt;
openssl genrsa -out ~/.mitmproxy/certs/ca.key 2048&lt;br /&gt;
# Génération du couple de clés du serveur mandataire&lt;br /&gt;
openssl req -new -x509 -days 365 -key ~/.mitmproxy/certs/ca.key -subj &amp;quot;/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=Acme Root CA&amp;quot; -out ~/.mitmproxy/certs/ca.crt&lt;br /&gt;
# Création d'un fichier de demande de certificat auprès de l'AC&lt;br /&gt;
openssl req -newkey rsa:2048 -nodes -keyout ~/.mitmproxy/certs/serveur.key -subj &amp;quot;/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=*&amp;quot; -out ~/.mitmproxy/certs/serveur.csr&lt;br /&gt;
# Génération d'un certificat signé par l'AC et intégrant la liste des domaines à certifier&lt;br /&gt;
openssl x509 -req -extfile &amp;lt;(printf &amp;quot;subjectAltName=DNS:*.ycharbi.fr,DNS:*.docker.io,DNS:*.cloudflare.docker.com,IP:127.0.0.1&amp;quot;) -days 365 -in ~/.mitmproxy/certs/serveur.csr -CA ~/.mitmproxy/certs/ca.crt -CAkey ~/.mitmproxy/certs/ca.key -CAcreateserial -out ~/.mitmproxy/certs/serveur.crt&lt;br /&gt;
&lt;br /&gt;
# Chaînage du certificat avec la clé associée pour mitmproxy&lt;br /&gt;
cat ~/.mitmproxy/certs/serveur.crt ~/.mitmproxy/certs/serveur.key &amp;gt; ~/.mitmproxy/certs/cert.pem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le point d'intérêt principal de ces opérations et qui devra être personnalisé en fonction du cas à traiter est la sous-commande &amp;lt;code&amp;gt;printf &amp;quot;subjectAltName=DNS:*.ycharbi.fr,DNS:*.docker.io,DNS:*.cloudflare.docker.com,IP:127.0.0.1&amp;quot;&amp;lt;/code&amp;gt; présente à la ligne numéro 8. Utilisez les domaines que vous voulez voir validé par ''TLS'' lors de la poignée de main entre une application cliente et votre mandataire.&lt;br /&gt;
&lt;br /&gt;
==Tests de fonctionnement==&lt;br /&gt;
Afin de tester notre préparation, nous pouvons lancer &amp;lt;code&amp;gt;mitmproxy&amp;lt;/code&amp;gt; de la façon suivante :&lt;br /&gt;
 SSLKEYLOGFILE=&amp;quot;/tmp/clés_tls_mitm.txt&amp;quot; mitmproxy --certs *=~/.mitmproxy/certs/cert.pem&lt;br /&gt;
&lt;br /&gt;
où :&lt;br /&gt;
* '''SSLKEYLOGFILE= ''' : emplacement du fichier contenant les clés négociées lors des différentes sessions ''TLS''&lt;br /&gt;
* '''--certs *= ''' : emplacement du certificat chaîné serveur pour signer le domaine spécifié dans la commande (ici &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; pour tout les domaines). Il peut y avoir plusieurs fois ce paramètre pour mettre autant de certificats que de domaines au besoin&lt;br /&gt;
&lt;br /&gt;
Les clients ''HTTP'' communs peuvent êtres utilisés pour tester le fonctionnement de la solution&lt;br /&gt;
 curl --proxy 127.0.0.1:8080 --cacert ~/.mitmproxy/certs/cert.pem https://doc.ycharbi.fr/index.php/Mitmproxy&lt;br /&gt;
 wget -e https_proxy=127.0.0.1:8080 --ca-certificate ~/.mitmproxy/certs/cert.pem https://doc.ycharbi.fr/index.php/Mitmproxy&lt;br /&gt;
&lt;br /&gt;
L'exploitation du fichier de clés est expliqué dans le cas pratique de la section suivante.&lt;br /&gt;
&lt;br /&gt;
=Cas pratique=&lt;br /&gt;
Comme énoncé en introduction, nous allons utiliser notre outil pour analyser les requêtes effectuées par un &amp;lt;code&amp;gt;docker pull&amp;lt;/code&amp;gt;. Cet outil étant particulièrement chiant avec ''HTTPS'' (comme la majorité des applications écrites en ''Golang''), la mise en œuvre de notre capture représente un bon exercice.&lt;br /&gt;
&lt;br /&gt;
Pour que cela fonctionne, il faut :&lt;br /&gt;
* un certificat avec les bons domaines renseignés dans le champ &amp;lt;code&amp;gt;subjectAltName&amp;lt;/code&amp;gt; (fait dans l'étape préparatoire)&lt;br /&gt;
* ajouter ce certificat dans la configuration du registre d'image ''Docker'' dont l'adresse sera remplacée par celle de notre mandataire (la commande de tirage de l'image reste identique)&lt;br /&gt;
* configurer ''Docker'' pour utiliser notre mandataire&lt;br /&gt;
* ajouter ce même certificat dans la base interne du système client&lt;br /&gt;
* rafraîchir la configuration de ''Systemd'' et relancer le démon ''Docker''&lt;br /&gt;
&lt;br /&gt;
==Installation des paquets==&lt;br /&gt;
Installation de ''Docker'' et de ''Tcpdump''&lt;br /&gt;
 apt install --no-install-recommends docker.io tcpdump&lt;br /&gt;
&lt;br /&gt;
Le premier servira d'application ''TLS'' cliente et le second capturera le trafic chiffré. Celui-ci sera par la suite déchiffré par ''Wireshark'' à l'aide des clés enregistrées par ''Mitmproxy'' pendant la communication.&lt;br /&gt;
&lt;br /&gt;
==Configuration de l'environnement==&lt;br /&gt;
Ajout du certificat du mandataire comme celui d'un registre d'images&lt;br /&gt;
 mkdir -p /etc/docker/certs.d/127.0.0.1:8080&lt;br /&gt;
 cp ~/.mitmproxy/certs/serveur.crt /etc/docker/certs.d/127.0.0.1:8080/ca.crt&lt;br /&gt;
&lt;br /&gt;
Configuration du mandataire pour les requêtes au dépôt distant&lt;br /&gt;
 mkdir -p /etc/systemd/system/docker.service.d&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/systemd/system/docker.service.d/http-proxy.conf&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;HTTPS_PROXY=https://127.0.0.1:8080&amp;quot;&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ajout du certificat dans la base interne du système&lt;br /&gt;
 cp ~/.mitmproxy/certs/serveur.crt /usr/local/share/ca-certificates/&lt;br /&gt;
 update-ca-certificates&lt;br /&gt;
&lt;br /&gt;
Rechargement de la configuration de ''Systemd'' et du démon ''Docker''&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 systemctl restart docker.service&lt;br /&gt;
&lt;br /&gt;
{{astuce|Il est possible d'afficher les variables d'environnements passées à l'exécutable de ''Docker'' par le service ''Systemd'' via la commande &amp;lt;code&amp;gt;systemctl show --property{{=}}Environment docker&amp;lt;/code&amp;gt; afin de valider la bonne prise en compte de notre paramètre. Un &amp;lt;code&amp;gt;docker search alpine&amp;lt;/code&amp;gt; vous indiquera rapidement si votre installation est correcte. En cas de fonctionnement, le mandataire affichera la session et la commande renverra son résultat habituel. En cas d'erreur, une indication sur l'origine du problème rencontré par le client sera renvoyée dans la console.}}&lt;br /&gt;
&lt;br /&gt;
==Tests de fonctionnement==&lt;br /&gt;
Nous aurons besoin de trois consoles pour réaliser les opérations qui vont suivre. Un multiplexeur de terminal comme [https://github.com/tmux/tmux/wiki Tmux] peut s'avérer bien utile dans de pareils circonstances. La commande &amp;lt;code&amp;gt;tmux new -A -s toto&amp;lt;/code&amp;gt; peut être utilisée pour initier un tel environnement (totalement facultatif).&lt;br /&gt;
&lt;br /&gt;
===Première console===&lt;br /&gt;
Exécuter le mandataire&lt;br /&gt;
 SSLKEYLOGFILE=&amp;quot;/tmp/clés_tls_mitm.txt&amp;quot; mitmproxy --certs *=~/.mitmproxy/certs/cert.pem&lt;br /&gt;
&lt;br /&gt;
===Deuxième console===&lt;br /&gt;
Exécuter l'enregistreur de trames&lt;br /&gt;
 tcpdump -ni any -w /tmp/tls.pcap port not 22&lt;br /&gt;
&lt;br /&gt;
===Troisième console===&lt;br /&gt;
Tirer une image du registre distant&lt;br /&gt;
 docker pull alpine&lt;br /&gt;
&lt;br /&gt;
Si tout est bon, votre image a été récupérée par &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt; a enregistré l'échange chiffré et &amp;lt;code&amp;gt;mitmproxy&amp;lt;/code&amp;gt; a journalisé les sessions en plus d'avoir enregistré les clés ''TLS'' de celles-ci. Il ne reste plus qu'à quitter les programmes des deux premières consoles pour en envoyer les fichiers de capture et de clés à une machine graphique possédant &amp;lt;code&amp;gt;wireshark&amp;lt;/code&amp;gt; pour déchiffrement et analyse.&lt;br /&gt;
 scp /tmp/tls.pcap /tmp/clés_tls_mitm.txt ycharbi@\[2001:db8::1\]:/tmp/&lt;br /&gt;
&lt;br /&gt;
===Sur la machine graphique===&lt;br /&gt;
Ouvrir le fichier de capture &amp;lt;code&amp;gt;/tmp/tls.pcap&amp;lt;/code&amp;gt; avec ''Wireshark'' et ajouter le fichier de clés &amp;lt;code&amp;gt;/tmp/clés_tls_mitm.txt&amp;lt;/code&amp;gt; dans les paramètres du protocole ''TLS'' : &amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; inline&amp;gt;&amp;lt;ctrl&amp;gt;+&amp;lt;maj&amp;gt;+&amp;lt;p&amp;gt; &amp;gt; Protocols &amp;gt; TLS &amp;gt; (Pre)-Master-Sercret log filename &amp;gt; Parcourir... &amp;gt; /tmp/clés_tls_mitm.txt &amp;gt; OK&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Les paquets ''TLS'' se déchiffrent instantanément, laissant apparaître les paquets ''HTTP'' qu'ils masquaient. Vous pouvez ainsi observer les ''URL'' que le client ''Docker'' requêtes pour récupérer ses images.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* https://docs.mitmproxy.org/stable/&lt;br /&gt;
** https://docs.mitmproxy.org/stable/howto-wireshark-tls/&lt;br /&gt;
** https://docs.mitmproxy.org/stable/concepts-options/&lt;br /&gt;
* https://medium.com/@ifeanyiigili/how-to-setup-a-private-docker-registry-with-a-self-sign-certificate-43a7407a1613&lt;br /&gt;
* https://betterprogramming.pub/deploy-a-docker-registry-using-tls-and-htpasswd-56dd57a1215a&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Mitmproxy&amp;diff=1532</id>
		<title>Mitmproxy</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Mitmproxy&amp;diff=1532"/>
		<updated>2024-08-15T15:20:21Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Page créée avec « Category:Services_mandataire  [https://mitmproxy.org/ Mitmproxy] est un mandataire (''proxy'') destiné au débogage, tests, notamment de pénétrations ainsi qu'aux évaluation des mesures de protections d'un système d'information. Il est extrêmement utile pour comprendre le fonctionnement d'un programme officiant au travers de sessions ''HTTPS'' puisqu'il permet de réunir les éléments nécessaires à l'inspection des trames chiffrées par ''TLS''.  Il... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Services_mandataire]]&lt;br /&gt;
&lt;br /&gt;
[https://mitmproxy.org/ Mitmproxy] est un mandataire (''proxy'') destiné au débogage, tests, notamment de pénétrations ainsi qu'aux évaluation des mesures de protections d'un système d'information.&lt;br /&gt;
Il est extrêmement utile pour comprendre le fonctionnement d'un programme officiant au travers de sessions ''HTTPS'' puisqu'il permet de réunir les éléments nécessaires à l'inspection des trames chiffrées par ''TLS''.&lt;br /&gt;
&lt;br /&gt;
Il peut, en outre, servir à espionner la navigation ''HTTPS'' des utilisateurs d'un réseau limité (obligeant l'accès au ''WAN'' par l'intermédiaire d'un mandataire). À l'issue de la lecture de ce document, vous devriez être sensibilisé à ne jamais réaliser d'opérations personnelles sur ce genre de réseau (connexion à un ''Webmail'' ou à tout portail nécessitant un identifiant personnel par exemple).&lt;br /&gt;
&lt;br /&gt;
Cette documentation explique brièvement comment se servir de l'outil pour enregistrer les clés de sessions ''TLS'' et présente un cas pratique avec le déchiffrement d'un &amp;lt;code&amp;gt;docker pull&amp;lt;/code&amp;gt;. Les trames capturées via [[Tcpdump]] pourront alors être examinées par un outil graphique comme [[Wireshark]].&lt;br /&gt;
&lt;br /&gt;
=Mise en œuvre=&lt;br /&gt;
==Installation==&lt;br /&gt;
Installation de l'outil&lt;br /&gt;
 apt install --no-install-recommends mitmproxy&lt;br /&gt;
&lt;br /&gt;
Le fait de lancer &amp;lt;code&amp;gt;mitmproxy&amp;lt;/code&amp;gt; créé automatiquement le répertoire &amp;lt;code&amp;gt;~/.mitmproxy&amp;lt;/code&amp;gt; contenant les éléments secrets utilisés dans une transaction ''TLS''. Il est alors possible d'importer le certificat serveur dans la base local du client à espionner ou générer son propre certificat via [[openssl|OpenSSL]]. Afin d'agrémenter la démonstration, la seconde solution sera utilisée. Outre l'aspect didactique, générer votre propre certificat est indispensable lorsque l'interception de la communication d'une application exigeante en terme de vérification est utilisée (ce pourquoi [[Docker]] est utilisé en guise d'exemple). Il est en effet nécessaire dans ce cas d'ajouter des noms alternatifs dans la section &amp;lt;code&amp;gt;subjectAltName&amp;lt;/code&amp;gt; du [https://fr.wikipedia.org/wiki/X.509 certificat X.509] afin de spécifier les adresses signées par celui-ci.&lt;br /&gt;
&lt;br /&gt;
==Configuration des clés==&lt;br /&gt;
Création du répertoire d'accueil des éléments secrets&lt;br /&gt;
 mkdir -p ~/.mitmproxy/certs&lt;br /&gt;
&lt;br /&gt;
Génération desdits éléments&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
# Génération de la clé privée de l'autorité de certification (AC)&lt;br /&gt;
openssl genrsa -out ~/.mitmproxy/certs/ca.key 2048&lt;br /&gt;
# Génération du couple de clés du serveur mandataire&lt;br /&gt;
openssl req -new -x509 -days 365 -key ~/.mitmproxy/certs/ca.key -subj &amp;quot;/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=Acme Root CA&amp;quot; -out ~/.mitmproxy/certs/ca.crt&lt;br /&gt;
# Création d'un fichier de demande de certificat auprès de l'AC&lt;br /&gt;
openssl req -newkey rsa:2048 -nodes -keyout ~/.mitmproxy/certs/serveur.key -subj &amp;quot;/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=*&amp;quot; -out ~/.mitmproxy/certs/serveur.csr&lt;br /&gt;
# Génération d'un certificat signé par l'AC et intégrant la liste des domaines à certifier&lt;br /&gt;
openssl x509 -req -extfile &amp;lt;(printf &amp;quot;subjectAltName=DNS:*.ycharbi.fr,DNS:*.docker.io,DNS:*.cloudflare.docker.com,IP:127.0.0.1&amp;quot;) -days 365 -in ~/.mitmproxy/certs/serveur.csr -CA ~/.mitmproxy/certs/ca.crt -CAkey ~/.mitmproxy/certs/ca.key -CAcreateserial -out ~/.mitmproxy/certs/serveur.crt&lt;br /&gt;
&lt;br /&gt;
# Chaînage du certificat avec la clé associée pour mitmproxy&lt;br /&gt;
cat ~/.mitmproxy/certs/serveur.crt ~/.mitmproxy/certs/serveur.key &amp;gt; ~/.mitmproxy/certs/cert.pem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le point d'intérêt principal de ces opérations et qui devra être personnalisé en fonction du cas à traiter est la sous commande &amp;lt;code&amp;gt;printf &amp;quot;subjectAltName=DNS:*.ycharbi.fr,DNS:*.docker.io,DNS:*.cloudflare.docker.com,IP:127.0.0.1&amp;quot;&amp;lt;/code&amp;gt; présente à la ligne numéro 8. Utilisez les domaines que vous voulez voir validé par ''TLS'' lors de la poignée de main entre une application cliente et votre mandataire.&lt;br /&gt;
&lt;br /&gt;
==Tests de fonctionnement==&lt;br /&gt;
Afin de tester notre préparation, nous pouvons lancer &amp;lt;code&amp;gt;mitmproxy&amp;lt;/code&amp;gt; de la façon suivante :&lt;br /&gt;
 SSLKEYLOGFILE=&amp;quot;/tmp/clés_tls_mitm.txt&amp;quot; mitmproxy --certs *=~/.mitmproxy/certs/cert.pem&lt;br /&gt;
&lt;br /&gt;
où :&lt;br /&gt;
* '''SSLKEYLOGFILE= ''' : emplacement du fichier contenant les clés négociées lors des différentes sessions ''TLS''&lt;br /&gt;
* '''--certs *= ''' : emplacement du certificat chaîné serveur pour signer le domaine spécifié dans la commande (ici &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; pour tout les domaines). Il peut y avoir plusieurs fois ce paramètre pour mettre autant de certificat que de domaines au besoin&lt;br /&gt;
&lt;br /&gt;
Les clients ''HTTP'' communs peuvent êtres utilisés pour tester le fonctionnement de la solution&lt;br /&gt;
 curl --proxy 127.0.0.1:8080 --cacert ~/.mitmproxy/certs/cert.pem https://doc.ycharbi.fr/index.php/Mitmproxy&lt;br /&gt;
 wget -e https_proxy=127.0.0.1:8080 --ca-certificate ~/.mitmproxy/certs/cert.pem https://doc.ycharbi.fr/index.php/Mitmproxy&lt;br /&gt;
&lt;br /&gt;
L'exploitation du fichier de clés est expliqué dans le cas pratique de la section suivante.&lt;br /&gt;
&lt;br /&gt;
=Cas pratique=&lt;br /&gt;
Comme énoncé en introduction, nous allons utiliser notre outil pour analyser les requêtes effectuées par un &amp;lt;code&amp;gt;docker pull&amp;lt;/code&amp;gt;. Cet outil étant particulièrement chiant avec ''HTTPS'' (comme la majorité des applications écrites en ''Golang''), la mise en œuvre de notre capture représente un bon exercice.&lt;br /&gt;
&lt;br /&gt;
Pour que cela fonctionne, il faut :&lt;br /&gt;
* un certificat avec les bons domaines renseignés dans le champ &amp;lt;code&amp;gt;subjectAltName&amp;lt;/code&amp;gt; (fait dans l'étape préparatoire)&lt;br /&gt;
* ajouter ce certificat dans la configuration du registre d'image Docker dont l'adresse sera remplacée par celle de notre mandataire (la commande de tirage de l'image reste identique)&lt;br /&gt;
* configurer ''Docker'' pour utiliser notre mandataire&lt;br /&gt;
* ajouter ce même certificat dans la base interne du système client&lt;br /&gt;
* mettre à jour la configuration de ''Systemd'' et relancer le démon ''Docker''&lt;br /&gt;
&lt;br /&gt;
==Installation des paquets==&lt;br /&gt;
Installation de ''Docker'' et de ''Tcpdump''&lt;br /&gt;
 apt install --no-install-recommends docker.io tcpdump&lt;br /&gt;
&lt;br /&gt;
Le premier servira d'application ''TLS'' cliente, le second, capturera le trafic chiffré. Celui-ci sera par la suite déchiffré par ''Wireshark'' à l'aide des clés enregistrées par ''Mitmproxy'' pendant la communication.&lt;br /&gt;
&lt;br /&gt;
==Configuration de l'environnement==&lt;br /&gt;
Ajout du certificat du mandataire comme celui d'un registre d'images&lt;br /&gt;
 mkdir -p /etc/docker/certs.d/127.0.0.1:8080&lt;br /&gt;
 cp ~/.mitmproxy/certs/serveur.crt /etc/docker/certs.d/127.0.0.1:8080/ca.crt&lt;br /&gt;
&lt;br /&gt;
Configuration du mandataire pour les requêtes au dépôt distant&lt;br /&gt;
 mkdir -p /etc/systemd/system/docker.service.d&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/systemd/system/docker.service.d/http-proxy.conf&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;HTTPS_PROXY=https://127.0.0.1:8080&amp;quot;&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ajout du certificat dans la base interne du système&lt;br /&gt;
 cp ~/.mitmproxy/certs/serveur.crt /usr/local/share/ca-certificates/&lt;br /&gt;
 update-ca-certificates&lt;br /&gt;
&lt;br /&gt;
Rechargement de la configuration de ''Systemd'' et du démon ''Docker''&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 systemctl restart docker.service&lt;br /&gt;
&lt;br /&gt;
{{astuce|Il est possible d'afficher les variables d'environnements passées à l'exécutable de ''Docker'' par le service ''Systemd'' via la commande &amp;lt;code&amp;gt;systemctl show --property{{=}}Environment docker&amp;lt;/code&amp;gt; afin de valider la bonne prise en compte de notre paramètre. Un &amp;lt;code&amp;gt;docker search alpine&amp;lt;/code&amp;gt; vous indiquera rapidement si votre installation est correcte. En cas de fonctionnement, le mandataire affichera la session et la commande renverra son résultat habituel. En cas d'erreur, une indication sur l'origine du problème rencontré par le client sera renvoyée dans la console.}}&lt;br /&gt;
&lt;br /&gt;
==Tests de fonctionnement==&lt;br /&gt;
Nous aurons besoin de trois consoles pour réaliser les opérations qui vont suivre. Un multiplexeur de terminal comme [https://github.com/tmux/tmux/wiki Tmux] peut s'avérer bien utile dans de pareils circonstances. La commande &amp;lt;code&amp;gt;tmux new -A -s toto&amp;lt;/code&amp;gt; peut être utilisée pour initier un tel environnement (totalement facultatif).&lt;br /&gt;
&lt;br /&gt;
===Première console===&lt;br /&gt;
Exécuter le mandataire&lt;br /&gt;
 SSLKEYLOGFILE=&amp;quot;/tmp/clés_tls_mitm.txt&amp;quot; mitmproxy --certs *=~/.mitmproxy/certs/cert.pem&lt;br /&gt;
&lt;br /&gt;
===Deuxième console===&lt;br /&gt;
Exécuté l'enregistreur de trames&lt;br /&gt;
 tcpdump -ni any -w /tmp/tls.pcap port not 22&lt;br /&gt;
&lt;br /&gt;
===Troisième console===&lt;br /&gt;
Tirer une image du registre distant&lt;br /&gt;
 docker pull alpine&lt;br /&gt;
&lt;br /&gt;
Si tout est bon, votre image a été récupérée par &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt; a enregistré l'échange chiffré et &amp;lt;code&amp;gt;mitmproxy&amp;lt;/code&amp;gt; a journalisé les sessions en plus d'avoir enregistré les clés de sessions ''TLS''. Il ne reste plus qu'à quitter les programmes des deux premières consoles pour en envoyer les fichiers de capture et de clés à une machine graphique possédant &amp;lt;code&amp;gt;wireshark&amp;lt;/code&amp;gt; pour déchiffrement et analyse.&lt;br /&gt;
 scp /tmp/tls.pcap /tmp/clés_tls_mitm.txt ycharbi@\[2001:db8::1\]:/tmp/&lt;br /&gt;
&lt;br /&gt;
===Sur la machine graphique===&lt;br /&gt;
Ouvrir le fichier de capture &amp;lt;code&amp;gt;/tmp/tls.pcap&amp;lt;/code&amp;gt; avec ''Wireshark'' et ajouter le fichier de clés &amp;lt;code&amp;gt;/tmp/clés_tls_mitm.txt&amp;lt;/code&amp;gt; dans les paramètres du protocole ''TLS'' : &amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; inline&amp;gt;&amp;lt;ctrl&amp;gt;+&amp;lt;maj&amp;gt;+&amp;lt;p&amp;gt; &amp;gt; Protocols &amp;gt; TLS &amp;gt; (Pre)-Master-Sercret log filename &amp;gt; Parcourir... &amp;gt; /tmp/clés_tls_mitm.txt &amp;gt; OK&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Les paquets ''TLS'' se déchiffrent instantanément, laissant apparaître les paquets ''HTTP'' qu'ils masquaient. Vous pouvez ainsi observer les ''URL'' que le client ''Docker'' requêtes pour récupérer ses images.&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Samba&amp;diff=1531</id>
		<title>Samba</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Samba&amp;diff=1531"/>
		<updated>2024-08-14T13:28:05Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Correction du paramètre de suppression d'un utilisateur + ajout des paramètres de désactivation et d'activation d'un utilisateur + changement de la commande de création d'un utilisateur pour réaliser d'une traite les opérations de la section &amp;quot;Interdiction d’accès&amp;quot; + suppression de la section &amp;quot;Interdiction d’accès&amp;quot; devenue inutile&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Service partage]]&lt;br /&gt;
&lt;br /&gt;
Samba est une implémentation libre des protocoles SMB/CIFS de Microsoft. Il est utilisé pour mettre à disposition des ressources sur un réseau local et il comprend l'usage d'une [https://fr.wikipedia.org/wiki/Samba_(informatique)#Fonctionnalit%C3%A9s dizaine de services ainsi que d'une douzaine de protocoles]. Il permet entre autre les usages suivants:&lt;br /&gt;
* Partage de fichiers&lt;br /&gt;
* Partage d'imprimantes&lt;br /&gt;
* Service Active Directory comprenant une version modifiée de:&lt;br /&gt;
** Kerberos&lt;br /&gt;
** LDAP&lt;br /&gt;
* NetBIOS sur TCP/IP (NBT)&lt;br /&gt;
* Protocole d'appel distant DCE/RPC, MSRPC&lt;br /&gt;
* Serveur WINS aussi appelé NetBIOS Naming Service (NBNS)&lt;br /&gt;
* Les protocoles d'un domaine NT:&lt;br /&gt;
** L'ouverture d'une session NT&lt;br /&gt;
** Une base de données Security Account Manager (SAM)&lt;br /&gt;
** Un service Local Security Authority (LSA)&lt;br /&gt;
** Un service d'impression (Spoolss)&lt;br /&gt;
** NTLM&lt;br /&gt;
&lt;br /&gt;
Le gros plus de cette solution étant sont extrême interopérabilité tant de plateformes que de régions linguistiques puisque géré par les systèmes Linux, BSD, Mac OS X et Windows avec un support des encodages UTF-8.&lt;br /&gt;
&lt;br /&gt;
Ce projet est rendu possible par un accord d'[https://www.samba.org/samba/PFIF/ information technique] signé par Microsoft le 20 décembre 2007 faisant suite à un procès perdu contre l'Union européenne.&lt;br /&gt;
&lt;br /&gt;
{{info|Cette documentation se base sur une Linux Debian 9.}}&lt;br /&gt;
&lt;br /&gt;
'''Ports utilisés:'''&lt;br /&gt;
* 137 udp&lt;br /&gt;
* 138 udp&lt;br /&gt;
* 138 tcp&lt;br /&gt;
* 139 tcp&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
 apt install samba &lt;br /&gt;
&lt;br /&gt;
=Configuration=&lt;br /&gt;
Nous allons partir d'un fichier vierge. Il faut donc renommer l'ancien pour ne pas qu'il soit utilisé&lt;br /&gt;
 mv /etc/samba/smb.conf /etc/samba/smb.conf.old&lt;br /&gt;
&lt;br /&gt;
'''Création d'un nouveau fichier'''&lt;br /&gt;
 vim /etc/samba/smb.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
server string = SAMBA-YCHARBI&lt;br /&gt;
workgroup = LAB&lt;br /&gt;
netbios name = SAMBA-YCHARBI&lt;br /&gt;
public = yes&lt;br /&gt;
encrypt passwords = true&lt;br /&gt;
guest ok = yes&lt;br /&gt;
map to guest = Bad User&lt;br /&gt;
dos charset = CP850&lt;br /&gt;
unix charset = UTF8&lt;br /&gt;
unix extensions = no&lt;br /&gt;
time server = yes&lt;br /&gt;
log file = /var/log/samba/log.%m&lt;br /&gt;
log level = 2&lt;br /&gt;
#Valeur en KB&lt;br /&gt;
max log size = 500&lt;br /&gt;
#force user = nobody&lt;br /&gt;
#force group = nogroup&lt;br /&gt;
server min protocol = SMB3&lt;br /&gt;
min protocol = SMB3&lt;br /&gt;
&lt;br /&gt;
name resolve order = lmhosts wins bcast host&lt;br /&gt;
&lt;br /&gt;
[Musiques]&lt;br /&gt;
path = /home/toto/Musiques&lt;br /&gt;
public = yes&lt;br /&gt;
read only = yes&lt;br /&gt;
writeable = no&lt;br /&gt;
browseable = yes&lt;br /&gt;
valid users = toto, titi, nobody&lt;br /&gt;
comment = Mes musiques&lt;br /&gt;
&lt;br /&gt;
[Documentation]&lt;br /&gt;
path = /home/toto/Documentation&lt;br /&gt;
public = no&lt;br /&gt;
read only = yes&lt;br /&gt;
writeable = no&lt;br /&gt;
browseable = yes&lt;br /&gt;
valid users = toto&lt;br /&gt;
#force user = toto&lt;br /&gt;
#force group = toto&lt;br /&gt;
comment = Ma documentation&lt;br /&gt;
&lt;br /&gt;
[Programmation]&lt;br /&gt;
path = /home/toto/Programmation&lt;br /&gt;
public = no&lt;br /&gt;
read only = yes&lt;br /&gt;
writeable = no&lt;br /&gt;
browseable = yes&lt;br /&gt;
valid users = toto&lt;br /&gt;
comment = Mes programmes&lt;br /&gt;
&lt;br /&gt;
[Vidéos]&lt;br /&gt;
path = /home/toto/Vidéos&lt;br /&gt;
public = yes&lt;br /&gt;
read only = yes&lt;br /&gt;
writeable = no&lt;br /&gt;
browseable = yes&lt;br /&gt;
valid users = toto, titi, nobody&lt;br /&gt;
comment = Mes vidéos&lt;br /&gt;
&lt;br /&gt;
[Logiciels]&lt;br /&gt;
path = /home/toto/Logiciels&lt;br /&gt;
public = yes&lt;br /&gt;
read only = no&lt;br /&gt;
writeable = yes&lt;br /&gt;
browseable = yes&lt;br /&gt;
valid users = toto, titi, nobody&lt;br /&gt;
comment = Mes logiciels&lt;br /&gt;
&lt;br /&gt;
[Partage]&lt;br /&gt;
path = /home/toto/Partage&lt;br /&gt;
public = yes&lt;br /&gt;
read only = no&lt;br /&gt;
writeable = yes&lt;br /&gt;
browseable = yes&lt;br /&gt;
valid users = toto, titi, nobody&lt;br /&gt;
comment = Partage commun&lt;br /&gt;
#create mask = 0777&lt;br /&gt;
#force user = nobody&lt;br /&gt;
#force group = nogroup&lt;br /&gt;
&lt;br /&gt;
[Windows]&lt;br /&gt;
path = /home/toto/Windows&lt;br /&gt;
public = yes&lt;br /&gt;
read only = yes&lt;br /&gt;
writeable = no&lt;br /&gt;
browseable = yes&lt;br /&gt;
valid users = toto, nobody&lt;br /&gt;
comment = Installation de Windows&lt;br /&gt;
&lt;br /&gt;
[Titi]&lt;br /&gt;
path = /home/titi&lt;br /&gt;
public = no&lt;br /&gt;
read only = no&lt;br /&gt;
writeable = yes&lt;br /&gt;
browseable = yes&lt;br /&gt;
valid users = titi&lt;br /&gt;
comment = Fichiers de Titi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme nous pouvons le constater, un partage est défini par une section commençant par son nom entre crochets. Les accents sont supportés (pour le montage dans fstab, il faut utiliser [[fstab#Accents_dans_le_fstab|la syntaxe décrite dans le document dédié]]) et il est possible de définir des paramètres personnalisés à chacun d'eux.&lt;br /&gt;
&lt;br /&gt;
{{Attention|Il faut bien penser à créer les répertoires des partages pour que le démon puisse s'exécuter correctement.}}&lt;br /&gt;
&lt;br /&gt;
'''Redémarrer le démon'''&lt;br /&gt;
 systemctl restart smbd.service&lt;br /&gt;
&lt;br /&gt;
=Création d'un utilisateur=&lt;br /&gt;
Pour qu'un utilisateur puisse accéder aux partages, il faut qu'il existe au préalable en tant qu'utilisateur POSIX '''et''' SAMBA. Nous désactiverons la possibilité de connexion POSIX et définirons un mot de passe dédié aux seuls utilisateurs SAMBA (afin qu'une connexion sur le shell du serveur soit impossible par ce biais). Enfin, il faudra gérer les droits d'accès aux fichiers du serveur.&lt;br /&gt;
&lt;br /&gt;
==Utilisateur POSIX==&lt;br /&gt;
Rappel, les fichiers gérants les utilisateurs utilisent un formatage sous forme de [https://fr.wikipedia.org/wiki/Champ_Gecos champ GECOS]. Je ne vais pas revenir sur la compréhension de ce formatage proche du CSV.&lt;br /&gt;
&lt;br /&gt;
===Création POSIX===&lt;br /&gt;
'''Création de l'utilisateur &amp;quot;toto&amp;quot;'''&lt;br /&gt;
 useradd -m -d /home/toto -s /bin/false -c &amp;quot;Utilisateur Samba toto&amp;quot; toto&lt;br /&gt;
&lt;br /&gt;
Cette commande créée l'utilisateur &amp;lt;code&amp;gt;toto&amp;lt;/code&amp;gt;, son répertoire personnel, lui attribue un ''shell'' non utilisable pour une connexion interactive et précise une description pour l'administrateur.&lt;br /&gt;
&lt;br /&gt;
==Utilisateur SAMBA==&lt;br /&gt;
'''Création de l'utilisateur'''&lt;br /&gt;
 smbpasswd -a toto&lt;br /&gt;
&lt;br /&gt;
'''Suppression d'un utilisateur'''&lt;br /&gt;
 smbpasswd -x toto&lt;br /&gt;
&lt;br /&gt;
'''Désactivation d'un utilisateur'''&lt;br /&gt;
 smbpasswd -d toto&lt;br /&gt;
&lt;br /&gt;
'''Activation d'un utilisateur'''&lt;br /&gt;
 smbpasswd -e toto&lt;br /&gt;
&lt;br /&gt;
'''Aide sur la commande'''&lt;br /&gt;
 smbpasswd -h&lt;br /&gt;
&lt;br /&gt;
''Note: on peut aussi ce référer au [https://www.samba.org/samba/docs/current/man-html/smbpasswd.8.html manuel de la commande].''&lt;br /&gt;
&lt;br /&gt;
'''Lister les utilisateurs'''&lt;br /&gt;
 pdbedit -L -v&lt;br /&gt;
&lt;br /&gt;
''Note: le '''-L''' permet de lister et le '''-v''' affiche des détails. Source [https://superuser.com/questions/271034/list-samba-users ici].''&lt;br /&gt;
&lt;br /&gt;
=Droits POSIX=&lt;br /&gt;
Le truck le plus chiant avec Samba est la gestion des [[Gestion_des_droits_linux|droits d’accès aux fichiers]]. En effet, sous les système basé sur les concepts UNIX, un utilisateur est propriétaire des fichiers qu'il crée et le UMASK du système de fichiers définit les autres droits à appliquer à celui-ci. Le problème que cela pose dans le cadre d'un partage commun entre plusieurs utilisateurs est que tout ce qui est créé par quelqu'un est en lecture seule pour les autres (vachement pratique...). Une solution que j'aime bien pour palier au problème est l'utilisation des [[Gestion_des_droits_linux#Droits_.C3.A9tendus|ACL Linux]].&lt;br /&gt;
&lt;br /&gt;
'''Installation du paquet'''&lt;br /&gt;
 apt install acl&lt;br /&gt;
&lt;br /&gt;
'''Gestion des droits d'un répertoire'''&lt;br /&gt;
&lt;br /&gt;
Par exemple, pour permettre l'accès en lecture/écriture aux utilisateurs ''toto'' et ''titi'' sur les fichiers qu'ils créent entre eux. j'utilise ceci sur le répertoire &amp;quot;Partage&amp;quot;:&lt;br /&gt;
 setfacl -Rm d:u:toto:rwx,d:u:titi:rwx,d:u:nobody:rwx,d:g:toto:rwx,d:g:titi:rwx,d:g:nogroup:rwx,d:o:rwx /home/toto/Partage/&lt;br /&gt;
&lt;br /&gt;
=Montage des volume=&lt;br /&gt;
==Ligne de commande==&lt;br /&gt;
===Sous Debian===&lt;br /&gt;
====mount====&lt;br /&gt;
'''Installation du paquet'''&lt;br /&gt;
 apt install cifs-utils&lt;br /&gt;
&lt;br /&gt;
''Note: ce paquet se nommait anciennement &amp;quot;smbfs&amp;quot; et le système de fichier à préciser avec &amp;quot;mount&amp;quot; portait le même nom.''&lt;br /&gt;
&lt;br /&gt;
'''Montage du partage'''&lt;br /&gt;
 mount -t cifs -o username=&amp;quot;anonymous&amp;quot;,password=&amp;quot;anonymous&amp;quot; //192.168.170.178/Logiciel /mnt/&lt;br /&gt;
&lt;br /&gt;
Ici, la connexion s'effectue en anonyme (un alias de '''-o username''' et '''password''' est '''-o guest'''), il suffit bien entendu de remplacer ceci par les bons identifiants de connexion lorsque nécessaire.&lt;br /&gt;
&lt;br /&gt;
Le volume se monte avec les droit de l'utilisateur ayant attaché ce volume (si renseigné dans le ''fstab'', ce sera ''root''). Pour octroyé les droits du volume à un utilisateur particulier, il faut préciser son UID et son GID dans la commande. Ici, notre utilisateur POSIX ''toto'' possède l'UID 1000 et appartient au GID 1000 (on le voit dans les fichiers &amp;lt;source lang=&amp;quot;bash&amp;quot; inline&amp;gt;/etc/passwd&amp;lt;/source&amp;gt; et &amp;lt;source lang=&amp;quot;bash&amp;quot; inline&amp;gt;/etc/shadow&amp;lt;/source&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On peut par exemple monter le volume ''Partage'' en tant qu'utilisateur ''toto'' avec les droits de ''titi'':&lt;br /&gt;
&lt;br /&gt;
 mount -t cifs -o username=&amp;quot;toto&amp;quot;,password=&amp;quot;SonMotDePasse&amp;quot;,uid=1001,gid=1001 //192.168.170.178/Partage&lt;br /&gt;
&lt;br /&gt;
====fstab====&lt;br /&gt;
Le [[Fstab#Samba|fichier de montage automatique au démarrage]] n'est pas en reste puisque les partages Samba peuvent également en faire partie. Une syntaxe particulière doit être utilisée pour les noms de partages comportant des accents.&lt;br /&gt;
&lt;br /&gt;
===Sous Windows===&lt;br /&gt;
[[Windows net use|Voir ici]].&lt;br /&gt;
&lt;br /&gt;
==Interface graphique==&lt;br /&gt;
Avec une interface graphique à base de [[Gnome 3|GNOME]], le paquet gérant de manière générale les système de fichiers (et plus particulièrement SMB dans notre cas) dans ''Nautilus'' se nomme &amp;lt;source lang=&amp;quot;bash&amp;quot; inline&amp;gt;gvfs-backends&amp;lt;/source&amp;gt;. Il suffit donc de l'installer pour pouvoir les monter.&lt;br /&gt;
 apt install gvfs-backends&lt;br /&gt;
&lt;br /&gt;
Pour monter un répertoire Samba via ''Nautilus'' (alias &amp;quot;fichiers&amp;quot;), ''Caja'' ou autre fork, il faut taper dans la barre d'URL (généralement accessible via un &amp;lt;source lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;ctrl&amp;gt;+&amp;lt;l&amp;gt;&amp;lt;/source&amp;gt;, un chemin comme celui-ci: &amp;lt;source lang=&amp;quot;bash&amp;quot; inline&amp;gt;smb://192.168.170.178/Partage&amp;lt;/source&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Les identifiants de connexion seront demandés à l'issue.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* http://www.linux-france.org/prj/edu/archinet/systeme/ch25s08.html&lt;br /&gt;
* https://www.samba.org/samba/docs/&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Unified_kernel_image&amp;diff=1530</id>
		<title>Unified kernel image</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Unified_kernel_image&amp;diff=1530"/>
		<updated>2024-08-11T17:01:57Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Image Noyau Unifiée */ Suppression du support de la génération d'un UKI par le script post installation du noyau. Ceci engendrait un UKI contenant deux fois le noyau au lieu d'une fois celui-ci et une fois l'initrd. Après réflexion, aucun cas de figure ne justifie le maintient de la génération d'un UKI dans le cas de figure imaginé à l'origine&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Noyau_linux]]&lt;br /&gt;
&lt;br /&gt;
Une Image Noyau Unifiée (INU) ou ''Unified Kernel Image'' (''UKI'') est la combinaison d'un programme de démarrage ''UEFI'', d'une image noyau ''Linux'', d'un ''initrd'' ainsi que d'autres ressources optionnelles dans un seul fichier ''UEFI [https://fr.wikipedia.org/wiki/Portable_Executable PE]''. Il peut alors être invoqué directement par :&lt;br /&gt;
* le micrologiciel ''UEFI'' : utile notamment dans certains environnements d'informatique en nuage ou confidentiels&lt;br /&gt;
* un chargeur de démarrage : généralement utile pour permettre plusieurs versions de noyau avec une sélection interactive ou automatique de la version dans laquelle démarrer ([[Systemd-boot]] ou [[Grub]] permettent cela)&lt;br /&gt;
&lt;br /&gt;
L'amorçage de cette image unifiée est permise par le ''stub'', programme logé dans celle-ci et pouvant être interprété par l{{'}}''UEFI''. Il constitue donc la partie exécutable initiale de l'image combinée et charge par la suite d'autres ressources à partir du reste de l{{'}}''INU'', en particulier le noyau et l{{'}}''initrd''.&lt;br /&gt;
&lt;br /&gt;
La [https://uapi-group.org/specifications/specs/unified_kernel_image/ spécification officielle] définit le format et les composants (obligatoires et optionnels) des ''UKI'' qui sont fournis en tant que sections ''PE/COFF'' de l'exécutable.&lt;br /&gt;
&lt;br /&gt;
L'intérêt principal de cette approche est qu'elle permet de mieux sécuriser le démarrage d'un système en exposant un unique binaire (''UEFI PE'') en clair sur le disque d'amorçage (''EFI System Partition'' - ''ESP'') au lieu d'une multitude de fichiers pouvant être modifiés par le premier pirate venu. Cet exécutable pourra alors être signé par ''Secure Boot'' et permettre, entre-autre, le déchiffrement de la racine en s'assurant de l’absence de sa propre altération (enregistreur de frappes par exemple).&lt;br /&gt;
&lt;br /&gt;
=Image Noyau Unifiée=&lt;br /&gt;
==Installation des outils==&lt;br /&gt;
La génération d'une ''INU'' nécessite quelques outils. Le projet ''Systemd'' met à disposition un programme ''Python'' nommé &amp;lt;code&amp;gt;Ukify&amp;lt;/code&amp;gt; à partir de la version 253 de l{{'}}''init''. Il est logé à l'emplacement &amp;lt;code&amp;gt;/usr/lib/systemd/ukify&amp;lt;/code&amp;gt; mais nécessite la bibliothèque &amp;lt;code&amp;gt;python3-pefile&amp;lt;/code&amp;gt; et ses dépendances pour fonctionner. L'approche exposé dans ce document visant la frugalité (''Ukify'' apporte surtout une configuration épurée mais l'aspect fonctionnel est identique), le strict nécessaire sera installé.&lt;br /&gt;
 apt install --no-install-recommends systemd-boot-efi binutils gawk sbsigntool&lt;br /&gt;
&lt;br /&gt;
Détails des paquets installés :&lt;br /&gt;
* '''systemd-boot-efi''' : fournit le ''stub &amp;lt;code&amp;gt;/usr/lib/systemd/boot/efi/linuxx64.efi.stub&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''binutils''' : fournit le programme de construction du binaire ''PE'' &amp;lt;code&amp;gt;objdump&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''gawk''' : fournit la version ''GNU'' de l'interpréteur de langage ''AWK'' afin de ne pas avoir l'erreur de fonction non définie &amp;lt;code&amp;gt;function strtonum never defined&amp;lt;/code&amp;gt; du &amp;lt;code&amp;gt;awk&amp;lt;/code&amp;gt; de base&lt;br /&gt;
* '''sbsigntool''' : permet de signer l{{'}}''UKI'' en vu d'une validation ''Secure Boot'' (optionnel)&lt;br /&gt;
&lt;br /&gt;
==Script de génération==&lt;br /&gt;
La génération d'une ''UKI'' nécessitant la concaténation d'une multitude d'éléments, il n'est pas envisageable de renseigner l'ensemble des paramètres manuellement. Je vous propose un script permettant la création d'une image ainsi que sa rotation sur trois versions différentes (l'une écrase la précédente à chaque nouvelle exécution). &lt;br /&gt;
 vim /mnt/usr/local/sbin/gen-uki&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Récupération de la version du noyau en cours d'utilisation&lt;br /&gt;
version_noyau=&amp;quot;${1}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Chemin vers l'initrd de travail&lt;br /&gt;
chemin_initrd=&amp;quot;${2}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Chemin vers le noyau de travail&lt;br /&gt;
chemin_noyau=&amp;quot;/boot/vmlinuz-${version_noyau}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Définition des variables du script&lt;br /&gt;
chemin_lsb=&amp;quot;/usr/lib/os-release&amp;quot;&lt;br /&gt;
chemin_stub=&amp;quot;/usr/lib/systemd/boot/efi/linuxx64.efi.stub&amp;quot;&lt;br /&gt;
chemin_cmdline=&amp;quot;/etc/kernel/cmdline&amp;quot;&lt;br /&gt;
chemin_splash=&amp;quot;/dev/null&amp;quot;&lt;br /&gt;
nom_uki1=&amp;quot;1-debian.efi&amp;quot;&lt;br /&gt;
nom_uki2=&amp;quot;2-debian.efi&amp;quot;&lt;br /&gt;
nom_uki3=&amp;quot;3-debian.efi&amp;quot;&lt;br /&gt;
chemin_base=&amp;quot;/boot/efi/EFI/Linux/&amp;quot;&lt;br /&gt;
chemin_dst_uki=&amp;quot;${chemin_base}/${nom_uki1}&amp;quot;&lt;br /&gt;
chemin_sb_clef=&amp;quot;/usr/local/lib/secureboot/mok/MOK.priv&amp;quot;&lt;br /&gt;
chemin_sb_cert=&amp;quot;/usr/local/lib/secureboot/mok/MOK.pem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Création de l'arborescence des UKI&lt;br /&gt;
mkdir -p &amp;quot;${chemin_base}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Préparation de l'UKI&lt;br /&gt;
align=&amp;quot;$(objdump -p ${chemin_stub} | awk '{ if ($1 == &amp;quot;SectionAlignment&amp;quot;){print $2} }')&amp;quot;&lt;br /&gt;
align=$((16#$align))&lt;br /&gt;
osrel_offs=&amp;quot;$(objdump -h &amp;quot;${chemin_stub}&amp;quot; | awk 'NF==7 {size=strtonum(&amp;quot;0x&amp;quot;$3); offset=strtonum(&amp;quot;0x&amp;quot;$4)} END {print size + offset}')&amp;quot;&lt;br /&gt;
osrel_offs=$((osrel_offs + &amp;quot;$align&amp;quot; - osrel_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
cmdline_offs=$((osrel_offs + $(stat -Lc%s &amp;quot;${chemin_lsb}&amp;quot;)))&lt;br /&gt;
cmdline_offs=$((cmdline_offs + &amp;quot;$align&amp;quot; - cmdline_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
splash_offs=$((cmdline_offs + $(stat -Lc%s &amp;quot;${chemin_cmdline}&amp;quot;)))&lt;br /&gt;
splash_offs=$((splash_offs + &amp;quot;$align&amp;quot; - splash_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
initrd_offs=$((splash_offs + $(stat -Lc%s &amp;quot;${chemin_splash}&amp;quot;)))&lt;br /&gt;
initrd_offs=$((initrd_offs + &amp;quot;$align&amp;quot; - initrd_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
linux_offs=$((initrd_offs + $(stat -Lc%s &amp;quot;${chemin_initrd}&amp;quot;)))&lt;br /&gt;
linux_offs=$((linux_offs + &amp;quot;$align&amp;quot; - linux_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
# Roulement, si elle existe et n'est pas vide, de l'UKI 2 en 3&lt;br /&gt;
if [[ -s &amp;quot;${chemin_base}${nom_uki2}&amp;quot; ]]; then&lt;br /&gt;
	echo &amp;quot;Copie de l'UKI 2 en 3...&amp;quot;&lt;br /&gt;
	cp -v &amp;quot;${chemin_base}${nom_uki2}&amp;quot; &amp;quot;${chemin_base}${nom_uki3}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Roulement, si elle existe et n'est pas vide, de l'UKI 1 en 2&lt;br /&gt;
if [[ -s &amp;quot;${chemin_dst_uki}&amp;quot; ]]; then&lt;br /&gt;
	echo &amp;quot;Copie de l'UKI 1 en 2...&amp;quot;&lt;br /&gt;
	cp -v &amp;quot;${chemin_dst_uki}&amp;quot; &amp;quot;${chemin_base}${nom_uki2}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Génération de l'image noyau combinée (UKI) numéro 1...&amp;quot;&lt;br /&gt;
objcopy \&lt;br /&gt;
    --add-section .osrel=&amp;quot;${chemin_lsb}&amp;quot; --change-section-vma .osrel=$(printf 0x%x $osrel_offs) \&lt;br /&gt;
    --add-section .cmdline=&amp;quot;${chemin_cmdline}&amp;quot; --change-section-vma .cmdline=$(printf 0x%x $cmdline_offs) \&lt;br /&gt;
    --add-section .splash=&amp;quot;${chemin_splash}&amp;quot; --change-section-vma .splash=$(printf 0x%x $splash_offs) \&lt;br /&gt;
    --add-section .initrd=&amp;quot;${chemin_initrd}&amp;quot; --change-section-vma .initrd=$(printf 0x%x $initrd_offs) \&lt;br /&gt;
    --add-section .linux=&amp;quot;${chemin_noyau}&amp;quot; --change-section-vma .linux=$(printf 0x%x $linux_offs) \&lt;br /&gt;
    &amp;quot;${chemin_stub}&amp;quot; &amp;quot;${chemin_dst_uki}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Signature de l'UKI pour la vérification Secure Boot seulement si la clé et son certificat son présents&lt;br /&gt;
if [[ -r &amp;quot;${chemin_sb_clef}&amp;quot; &amp;amp;&amp;amp; -r &amp;quot;${chemin_sb_cert}&amp;quot; ]]; then&lt;br /&gt;
	sbsign --key &amp;quot;${chemin_sb_clef}&amp;quot; --cert &amp;quot;${chemin_sb_cert}&amp;quot; --output &amp;quot;${chemin_dst_uki}&amp;quot; &amp;quot;${chemin_dst_uki}&amp;quot;&lt;br /&gt;
	sbverify --cert &amp;quot;${chemin_sb_cert}&amp;quot; &amp;quot;${chemin_dst_uki}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les [[Paramètres linux|paramètres]] du noyau (de la variable &amp;lt;code&amp;gt;$chemin_cmdline&amp;lt;/code&amp;gt;) doivent contenir les informations sur votre système de fichier racine afin que ''Linux'' puisse l'amorcer. Vous pouvez vous appuyer sur l'exemple ci-dessous qui comprend une partition chiffrée contenant un sous-volume ''BTRFS''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;root=UUID=${uuid_racine} cryptdevice=UUID=${uuid_luks} ro rootflags=subvol=@rootfs console=tty0 console=ttyS0,115200n8&amp;quot; &amp;gt; /mnt/etc/kernel/cmdline&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pensez bien entendu à remplacer les variables par vos propres valeurs...&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également vous appuyer sur le &amp;lt;code&amp;gt;/proc/cmdline&amp;lt;/code&amp;gt; pour visualiser les paramètres utilisés par votre propre système afin de vous en inspirer. La liste des paramètres possible est visualisable dans la [https://www.kernel.org/doc/html/v6.5/admin-guide/kernel-parameters.html documentation] du noyau.&lt;br /&gt;
&lt;br /&gt;
 chmod u+x /usr/local/sbin/gen-uki&lt;br /&gt;
&lt;br /&gt;
==Automatisation==&lt;br /&gt;
Le script ainsi créé peut être lancé manuellement mais il est préférable qu'il soit appelé à chaque mise à jour de noyau ou d{{'}}''initrd'' afin de garantir un démarrage sur la dernière version disponible. Cette dépendance se créée en l'exposant dans le répertoire de post-construction de l{{'}}''initrd'' (&amp;lt;code&amp;gt;/etc/initramfs/post-update.d/&amp;lt;/code&amp;gt;). Il n'est pas souhaitable (voir balise &amp;quot;info&amp;quot; ci-après) de spécifier d'actions dans &amp;lt;code&amp;gt;/etc/kernel/postinst.d/&amp;lt;/code&amp;gt; puisque une installation ou une mise à jour du noyau exécute systématiquement une reconstruction de  l{{'}}''initrd''.&lt;br /&gt;
&lt;br /&gt;
{{info|Nous ne voulons pas générer un ''UKI'' depuis la phase post-installation du noyau pour deux raisons :&lt;br /&gt;
* le paramètre &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt; envoyé au script est égale au chemin absolut du nouveau noyau et non de l{{'}}''initrd''. Cela a pour effet de générer un ''UKI'' contenant deux fois le noyau et aucune fois l{{'}}''initrd'' (corrompu de fait)&lt;br /&gt;
* dans la mesure où &amp;lt;code&amp;gt;dpkg&amp;lt;/code&amp;gt; exécute à la fois les scripts des répertoires &amp;lt;code&amp;gt;/etc/initramfs/post-update.d/&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;/etc/kernel/postinst.d/&amp;lt;/code&amp;gt;, deux roulements d{{'}}''UKI'' (dont un corrompu) s'effectuerait, ce qui n'a aucun sens et n'est clairement pas souhaitable car deux images sur trois sont alors issues de la même mise à jour}}&lt;br /&gt;
&lt;br /&gt;
 mkdir -p /etc/initramfs/post-update.d&lt;br /&gt;
 ln -s /usr/local/sbin/gen-uki /etc/initramfs/post-update.d/zz-gen-uki&lt;br /&gt;
 chmod u+x /etc/initramfs/post-update.d/zz-gen-uki&lt;br /&gt;
&lt;br /&gt;
{{info|Le répertoire &amp;lt;code&amp;gt;/etc/initramfs/post-update.d&amp;lt;/code&amp;gt; n'est pas créé par défaut dans ''GNU/Linux Debian'' mais est bien parcouru lors de la génération d'une nouvelle archive d{{'}}''init''.}}&lt;br /&gt;
&lt;br /&gt;
==Création des entrées de démarrage==&lt;br /&gt;
Dans l'optique d'optimiser au mieux le démarrage de notre machine, nous n'utiliserons aucun chargeur d'amorçage. Nous créerons alors des entrées de démarrage dans notre  ''UEFI'' pointant directement sur nos ''UKI'' (son menu nous permettra de sélectionner la version à lancer). Pour se faire, il est possible de passer par l'interface de celui-ci (lorsque l'option est disponible) ou via l'outil [[Efibootmgr]] (universel). Voici un exemple pour les trois générées par le script (il est possible de créer les entrées avant les images) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
disque_systeme=/dev/nvme0n1&lt;br /&gt;
&lt;br /&gt;
efibootmgr -c -d &amp;quot;${disque_systeme}&amp;quot; -p 1 -l '\EFI\Linux\1-debian.efi' -L &amp;quot;Debian UKI 1&amp;quot;&lt;br /&gt;
efibootmgr -c -d &amp;quot;${disque_systeme}&amp;quot; -p 1 -l '\EFI\Linux\2-debian.efi' -L &amp;quot;Debian UKI 2&amp;quot;&lt;br /&gt;
efibootmgr -c -d &amp;quot;${disque_systeme}&amp;quot; -p 1 -l '\EFI\Linux\3-debian.efi' -L &amp;quot;Debian UKI 3&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi, dans le cas malencontreux où une mise à jour de noyau ou une reconstruction d{{'}}''initrd'' occasionne une impossibilité à démarrer, les versions précédentes de votre image vous permettront de vous en sortir.&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://uapi-group.org/specifications/specs/unified_kernel_image/&lt;br /&gt;
* https://0pointer.de/blog/brave-new-trusted-boot-world.html&lt;br /&gt;
* https://wiki.debian.org/EFIStub#Setting_up_a_Unified_Kernel_Image&lt;br /&gt;
&lt;br /&gt;
=Secure Boot=&lt;br /&gt;
&lt;br /&gt;
{{info|Cette section est facultative.}}&lt;br /&gt;
&lt;br /&gt;
''Secure Boot'' ([https://uefi.org/sites/default/files/resources/UEFI_Spec_2_3_1.pdf chapitre 27] des spécification ''UEFI'') est une fonctionnalité apparue avec la version 2.3.1 de l{{'}}''UEFI'' permettant de borner l'amorçage aux seuls systèmes dont la signature cryptographique est reconnue par sa base interne. Son intérêt principal est d'empêcher l'exécution de code ayant été ajouté à l{{'}}''UEFI PE'' à l'insu de l'administrateur de la machine mais il peut également servir, entre-autre, à empêcher tout autre système (amorçage ''USB'' par exemple) de démarrer.&lt;br /&gt;
&lt;br /&gt;
Afin que cette fonction ai un sens, il est préférable de n'autoriser que vos propres clés. Ceci n'est malheureusement pas possible sur la plupart des ''PC'' du marcher. En effet, les ''UEFI'' des machines grand publique embarquent celles de ''Microsoft'' pour le démarrage de ''Windows'' (obligatoire pour bénéficier de la certification idoine) et elles ne proposent pas (dans toutes celles que j'ai vu) de fonction pour gérer la base interne de clés (elles ne proposent bien souvent même pas d'administrer les entrées de démarrage...). Il est peut-être possible de contourner cette limitation avec l'outil &amp;lt;code&amp;gt;mokutil&amp;lt;/code&amp;gt; mais je n'ai pas creusé cette piste... La problématique des clés ''Microsoft'' est bien entendu que leur présence rend caduc l'exclusivité de la validité de vos signatures. Qui peut utiliser leur clé ? L'administration de ce paramètre semble donc réservée aux ordinateurs professionnels (les ''DELL XPS'' le permettent) et aux plateformes serveurs.&lt;br /&gt;
&lt;br /&gt;
Il convient en outre de s'assurer qu'aucun accès physique non autorisé à la machine n'a lieu car les gros malins qui ont rédigés les spécifications de l{{'}}''UEFI'' n'ont pas crus bon d'imposer le stockage de sa configuration en mémoire morte... L'utilisation d'une mémoire vive maintenue par une pile comme sur l'antique ''BIOS'' ayant retenu leur préférence, le débranchement de cette dernière engendrera une réinitialisation complète des paramètres et de la base de clés ''Secure Boot'' (permettant ainsi l'introduction de toute forme de charges utiles au démarrage). Ceci aura donc pour effet de ruiner la mince barrière de sécurité que nous venons de mettre en place...&lt;br /&gt;
&lt;br /&gt;
Enfin, un mot de passe d'accès aux paramètres de l{{'}}''UEFI'' reste tout de même une pratique à suivre afin de vous assurer qu'aucune injection de clé non autorisée n'ai lieu. Dans le cas d'une réinitialisation par débranchement de la pile, vous saurez au moins qu'une action physique a été opérée sur la machine et pourrez entreprendre les mesures qui s'imposent (à commencer par ne surtout pas taper votre phrase de passe [[Cryptsetup|LUKS]] !). Vous pourrez par la suite vérifier la signature de votre ''UKI'' via un autre système pour s'assurer de son intégrité (pensez également à vérifier la présence d'enregistreurs de frappes [https://www.youtube.com/watch?v=AMzv6ymmUcw matériels]).&lt;br /&gt;
&lt;br /&gt;
==Glossaire==&lt;br /&gt;
La base de clés de ''Secure Boot'' comporte cinq [https://www.malekal.com/quest-ce-que-secure-boot-protection-pc-uefi-comment-ca-marche/ sections] :&lt;br /&gt;
* '''MOK''' (''Machine Owner Key'') : base de données contenant les clés de l'utilisateur - inutile pour cette procédure&lt;br /&gt;
* '''PK''' (''Plateform Key'') : base de données contenant les clés de la machine - utile pour cette procédure&lt;br /&gt;
* '''DB''' (''Data Base'') : base de données des clés autorisées (liste blanche) - utile pour cette procédure&lt;br /&gt;
* '''KEK''' (''Key Exchange Keys'') : aucune idée - inutile pour cette procédure&lt;br /&gt;
* '''DBX''' : (''Data Base'' &amp;lt;introuvable dans les specs mais probablement ''Exclusion''&amp;gt;)  : base de données des clés interdites (liste noire) - inutile pour cette procédure&lt;br /&gt;
&lt;br /&gt;
==Génération de clés==&lt;br /&gt;
Création du répertoire de travail&lt;br /&gt;
 mkdir -p /usr/local/lib/secureboot/mok&lt;br /&gt;
&lt;br /&gt;
Génération d'une clé privée ''RSA'' 4096 bits (le maximum possible avec ''Shim'' - que nous n'utilisons pas - est, aux dernières nouvelles ([https://wiki.debian.org/SecureBoot#Generating_a_new_key 21/06/2022]) 2048 bits) et d'un certificat public associé&lt;br /&gt;
 openssl req -nodes -new -x509 -newkey rsa:4096 -keyout /usr/local/lib/secureboot/mok/MOK.priv -outform DER -out /usr/local/lib/secureboot/mok/MOK.der -days 36500 -subj &amp;quot;/CN=Mon Nom/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Conversion du certificat en ''PEM'' afin d'être utilisable par &amp;lt;code&amp;gt;sbsign&amp;lt;/code&amp;gt;&lt;br /&gt;
 openssl x509 -inform der -in /usr/local/lib/secureboot/mok/MOK.der -out /usr/local/lib/secureboot/mok/MOK.pem&lt;br /&gt;
&lt;br /&gt;
Empêcher la lecture de ces fichiers par un autre utilisateur que root&lt;br /&gt;
 chmod 400 /usr/local/lib/secureboot/mok/{MOK.priv,MOK.der,MOK.pem}&lt;br /&gt;
&lt;br /&gt;
Les étapes qui suivent sont réalisées automatiquement par le script créé plus haut et sont notées à titre indicatif.&lt;br /&gt;
&lt;br /&gt;
Le certificat au format ''PEM'' est utilisé par les commandes du paquet &amp;lt;code&amp;gt;sbsigntool&amp;lt;/code&amp;gt; alors que la ''DER'' est utilisée par les ''UEFI'' (pourquoi utiliser le même format hein ?). il doit être renseignée deux fois dans les menus de gestion des clés de votre carte mère :&lt;br /&gt;
* une fois dans ''Plateform Key'' (''PK'')&lt;br /&gt;
* l'autre dans ''DB'' (''Authorized Signatures'')&lt;br /&gt;
&lt;br /&gt;
Le certificat ''DER'' doit être accessible à l{{'}}''UEFI'' pour injection. Vous pouvez le mettre dans toute partition ''FAT'' comme votre ''ESP'' &amp;lt;code&amp;gt;/boot/efi/EFI/&amp;lt;/code&amp;gt; ou sur une clé ''USB'' afin de l'y sélectionner depuis le menu dédié (peut être supprimé à l'issue).&lt;br /&gt;
&lt;br /&gt;
==Signature de l'image==&lt;br /&gt;
Dans la commande qui suit, la signature de l'image va réécrir par dessus l'originale (sa somme de contrôle va changer). Ce comportement est volontaire mais peut être changé en modifiant la valeur de &amp;lt;code&amp;gt;--output&amp;lt;/code&amp;gt;&lt;br /&gt;
 sbsign --key /usr/local/lib/secureboot/mok/MOK.priv --cert /usr/local/lib/secureboot/mok/MOK.pem --output /boot/efi/EFI/Linux/1-debian.efi /boot/efi/EFI/Linux/1-debian.efi&lt;br /&gt;
&lt;br /&gt;
Vérification de la signature&lt;br /&gt;
 sbverify --cert /usr/local/lib/secureboot/mok/MOK.pem /boot/efi/EFI/Linux/1-debian.efi&lt;br /&gt;
&lt;br /&gt;
Une fois ''Secure Boot'' activé et votre système démarré, vous pouvez vérifier l'effectivité de cette fonctionnalité via la commande suivante du paquet &amp;lt;code&amp;gt;mokutil&amp;lt;/code&amp;gt;&lt;br /&gt;
 mokutil --sb-state&lt;br /&gt;
&lt;br /&gt;
{{astuce|La signature d'un module noyau complilé par vous même peut se faire via la commande suivante (exemple pour le pilote &amp;lt;code&amp;gt;ixgbe&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;/usr/lib/linux-kbuild-6.1/scripts/sign-file sha512 /usr/local/lib/secureboot/mok/MOK.{priv,der} /lib/modules/6.1.0-17-amd64/updates/drivers/net/ethernet/intel/ixgbe/ixgbe.ko /tmp/ixgbe.ko&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://uefi.org/specifications&lt;br /&gt;
* https://wiki.debian.org/SecureBoot#Generating_a_new_key&lt;br /&gt;
* https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-secure-boot-key-creation-and-management-guidance?view=windows-11&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Firefox&amp;diff=1529</id>
		<title>Firefox</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Firefox&amp;diff=1529"/>
		<updated>2024-08-01T20:23:35Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout de la section &amp;quot;Désactiver précédent et suivant au trackpad&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:navigateurs web]]&lt;br /&gt;
&lt;br /&gt;
=Activer la gestion du tactile=&lt;br /&gt;
Comme beaucoup de fonctions dans Firefox, la gestion des écrans tactile n'est pas activée par défaut dans nombre d’environnements (c'est le cas de Debian). Pour l'activer, il faut définir une variable d'environnement et activer l'option dans la section dédiée de Firefox.&lt;br /&gt;
&lt;br /&gt;
==Définir la variable d'environnement==&lt;br /&gt;
 echo 'MOZ_USE_XINPUT2=1' &amp;gt;&amp;gt; /etc/environment&lt;br /&gt;
&lt;br /&gt;
La modification prend effet au redémarrage. Il est possible de lancer Firefox avec la définition de cette variable manuellement via le terminal en attendant: &amp;lt;code&amp;gt;MOZ_USE_XINPUT2=1 firefox&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Activation de l'option dans Firefox==&lt;br /&gt;
&lt;br /&gt;
Il faut se rendre dans &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt; et mettre le paramètre '''dom.w3c_touch_events.enabled''' à '''1'''. La modification est active instantanément. Vous pouvez profiter du défilement, de la sélection et du zoom au doigt.&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://support.mozilla.org/es/questions/1091627&lt;br /&gt;
&lt;br /&gt;
=Utiliser Wayland=&lt;br /&gt;
Il est possible d'utiliser ''Firefox'' avec [[Wayland]] en définissant la [https://www.reddit.com/r/firefox/comments/c8itj2/enabling_wayland_on_linux/ variable d'environnement] &amp;lt;code&amp;gt;MOZ_ENABLE_WAYLAND=1&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;/etc/environment&amp;lt;/code&amp;gt;. Un redémarrage du programme est nécessaire et il faut s'assurer que la variable est bien définie lors de son lancement (le plus simple est de redémarrer le système).&lt;br /&gt;
&lt;br /&gt;
=Désactiver le détachement d'un onglet=&lt;br /&gt;
Une fonctionne ultra casse couilles avec Firefox c'est bien le [https://www.askvg.com/firefox-tip-disable-tabs-drag-n-drop-feature-to-move-to-new-window/ glisser/déposer d'un onglet] qui en fait une nouvelle fenêtre. Juste insupportable. Pour désactiver cette merde, il faut passer la valeur &amp;lt;code&amp;gt;browser.tabs.allowTabDetach&amp;lt;/code&amp;gt; à '''false'''.&lt;br /&gt;
&lt;br /&gt;
=Restaurer la fenêtre de téléchargement=&lt;br /&gt;
Avec Firefox 98 (et comme avec chaque nouvelle version), une fonctionnalité indispensable a été supprimée : la possibilité d'ouvrir un fichier sans l'enregistrer quelque part sur le disque (il va simplement dans le &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;). Pour restaurer ce comportement, il faut passer la valeur &amp;lt;code&amp;gt;browser.download.improvements_to_download_panel&amp;lt;/code&amp;gt; à &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; dans le &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Forcer l'usage du presse papier=&lt;br /&gt;
Certains sites ''WEB'' se croient malins en interdisant l'utilisation du copier/coller dans les formulaires (réinitialisation de mots de passe par exemple). Cette pratique, en plus d'être une atteinte à notre liberté d'utiliser nos outils informatiques comme nous l'entendons, nous empêche de gérer nos [[Génération de mots de passe|mots de passe]] à notre guise (la meilleur clé est celle que vous ne connaissez pas et donc que vous ne pouvez pas taper dans un champ de formulaire...). Comme souvent, sous couvert de sécurité, le résultat est l'exact opposé. Aux développeurs ''WEB'' : laissez-nous gérer nos outils informatiques comme nous l'entendons, nous sommes bien plus à même de savoir ce qui est bon pour nous que vous !&lt;br /&gt;
&lt;br /&gt;
Pour dire à ''Firefox'' de ne pas respecter le ''Javascript'' qui lui dit d'adopter un comportement aussi débile, il faut passer la [https://www.howtogeek.com/251807/how-to-enable-pasting-text-on-sites-that-block-it/ valeur] &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt;dom.event.clipboardevents.enabled&amp;lt;/code&amp;gt; à '''false'''.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez alors de nouveau de vous prendre pour un [https://fr.wikipedia.org/wiki/Pasteur_(christianisme) pasteur] en usant de ''copy/paste'' !&lt;br /&gt;
&lt;br /&gt;
{{attention|La désactivation de cette fonction empêche le [https://github.com/element-hq/element-web/issues/25695 collage de textes] dans le champ de discutions de [[Matrix_synapse#Client_WEB_Element|element-web]] (un &amp;lt;code&amp;gt;ctrl+v&amp;lt;/code&amp;gt; n'a donc plus aucun effet).}}&lt;br /&gt;
&lt;br /&gt;
=Désactiver le rafraîchissement automatique=&lt;br /&gt;
Certains sites non respectueux de leurs utilisateurs (les sites de presse en tête), utilisent du ''Javascript'' pour rafraîchir automatiquement les pages de leur site (probablement pour générer du revenu avec la publicité).&lt;br /&gt;
Cette pratique, outre le fait de consommer de la bande passante et du ''CPU'' (donc de l'électricité), engendre un comportement non désiré et inattendu de l'utilisateur (seul maître légitime de son ordinateur).&lt;br /&gt;
&lt;br /&gt;
Pour faire cesser ça, il faut initier la clé &amp;lt;code&amp;gt;accessibility.blockautorefresh&amp;lt;/code&amp;gt; à ''true'' dans &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Désactiver la géolocalisation=&lt;br /&gt;
Certains sites envoient une requête au navigateur afin de demander d'activer la géolocalisation. Cela se matérialise dans ''Firefox'' par un popup au niveau de la barre d'adresse qui masque une partie du site (pénible). Calqué sur le modèle de celui demandant d'enregistrer un mot de passe, celui-ci n'est pas désactivable dans les paramètres (cela doit être trop difficile à coder pour ''Mozilla''...). Cela se fait donc via les habituels paramètres avancés de &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt;, en [https://whatismyipaddress.com/enabling-and-disabling-geolocation-on-your-browser#h-firefox passant] &amp;lt;code&amp;gt;geo.enabled&amp;lt;/code&amp;gt; à &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Désactiver précédent et suivant au trackpad=&lt;br /&gt;
Autre réelle mauvaise idée de ce navigateur, la fonctionnalité précédent et suivant via des gestes latéraux avec un trackpad. Mise à part réaliser des actions involontaires pouvant êtres, au mieux, ultra désagréables en rechargeant les pages et au pire, dangereusement catastrophique en fonction des cas (quitter une page avant la fin d'une opération est rarement sans conséquence dans le traitement...), il m'apparaît de l'ordre du bon sens de désactiver cette aberration qui n'aurait jamais dû voir le jour.&lt;br /&gt;
&lt;br /&gt;
Via &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt;, [https://superuser.com/questions/1270620/how-do-i-disable-option-swipe-navigating-history-forward-and-back-in-firefox#answer-1850606 vider les champs] &amp;lt;code&amp;gt;browser.gesture.swipe.left&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;browser.gesture.swipe.right&amp;lt;/code&amp;gt; (le bouton de réinitialisation permet de restaurer les valeurs par défaut si vous avez l'idée saugrenue de vouloir revenir en arrière).&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Sysfs&amp;diff=1528</id>
		<title>Sysfs</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Sysfs&amp;diff=1528"/>
		<updated>2024-07-07T18:09:13Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout de la section &amp;quot;Interroger les sondes de température&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Pseudo systèmes de fichiers]]&lt;br /&gt;
&lt;br /&gt;
=Savoir si on a démarré en UEFI=&lt;br /&gt;
Un système ayant démarré en ''UEFI'' permet une interaction avec celui-ci via un ensemble de variables accessibles dans &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;/sys&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On vérifiera donc le type de micro-logiciel nous ayant permis de démarrer via la commande suivante :&lt;br /&gt;
 ls /sys/firmware/efi/efivars/&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le retour de cette commande n'est pas bon si nous sommes en ''BIOS''.&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://unix.stackexchange.com/questions/148356/how-to-know-if-im-booting-using-uefi&lt;br /&gt;
&lt;br /&gt;
=Ajuster la luminosité de l'écran=&lt;br /&gt;
Afficher la luminosité actuelle&lt;br /&gt;
 cat /sys/class/backlight/intel_backlight/brightness&lt;br /&gt;
&lt;br /&gt;
La modifier&lt;br /&gt;
 echo 500 &amp;gt; /sys/class/backlight/intel_backlight/brightness&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://unix.stackexchange.com/questions/192853/how-to-set-the-monitor-brightness-gracefully-at-boot-time&lt;br /&gt;
&lt;br /&gt;
=Interroger les sondes de température=&lt;br /&gt;
Il est possible d'afficher la température mesurée par les sondes de votre machine sans installer d'[https://phoenixnap.com/kb/linux-cpu-temp#ftoc-heading-5 outils tiers]. Ces informations sont contenues dans les fichiers de la section &amp;lt;code&amp;gt;thermal&amp;lt;/code&amp;gt; de &amp;lt;code&amp;gt;sysfs&amp;lt;/code&amp;gt;.&lt;br /&gt;
 cat /sys/class/thermal/thermal_zone*/temp | column -s $'\t' -t | sed 's/\(.\)..$/.\1°C/'&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Letsencrypt&amp;diff=1527</id>
		<title>Letsencrypt</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Letsencrypt&amp;diff=1527"/>
		<updated>2024-07-07T17:53:47Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Automatisation de la tâche */ Correction du service appelé par le minuteur afin qu'il dépende de lui&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:X.509]]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Let%27s_Encrypt Letsencrypt] est une [https://fr.wikipedia.org/wiki/Autorit%C3%A9_de_certification autorité de certification] lancée le 3 décembre 2015 (Bêta Version Publique). Elle permet de générer des certificats [[:Category:X.509|X.509]] gratuitement et sans limite de nombre.&lt;br /&gt;
&lt;br /&gt;
C'est un service fourni par l{{'}}''Internet Security Research Group'' (''ISRG''). Les mécènes principaux sont l{{'}}''Electronic Frontier Foundation'' (''EFF''), la Fondation ''Mozilla'', ''Akamai'', ''Cisco Systems'' , ''PlanetHoster'' et ''OVH''. D'autres partenaires, tels que l'autorité de certification ''IdenTrust'', l'Université du Michigan (''U-M''), la ''Stanford Law School'', la Fondation ''Linux'', l'entreprise ''Free10'', ainsi que ''Stephen Kent'' de ''Raytheon / BBN Technologies'' et ''Alex Polvi'' de ''CoreOS'' sont également impliqués dans le projet. Bref c'est un truc sérieux et cela représente tout de même 51,21% des certificats ''TLS'' en avril 2018 d'après ''NetTrack''.&lt;br /&gt;
&lt;br /&gt;
L{{'}}autorité de certification se base sur le protocole ''Automatic Certificate Management Environment'' (''ACME'' ou &amp;quot;environnement de gestion automatique de certificat&amp;quot;) permettant l{{'}}automatisation des échanges entre les autorités de certification et les administrateurs de serveurs, rendant ainsi possible le déploiement automatisé d’une infrastructure à clé publique à très bas coût. Plusieurs implémentations de ce protocole existent.&lt;br /&gt;
&lt;br /&gt;
=ACME.sh=&lt;br /&gt;
[https://github.com/acmesh-official/acme.sh ACME.sh] est une implémentation libre (''GPL v3.0'') du protocole idoine écrite en [[Script bash|langage Shell]]. Elle a le gros avantage d'être très légère en déploiement et en usage. Cet outil fonctionne avec un seul script (ses dépendances se trouvent dans le répertoire livré avec) et s'utilise en une seule commande sans rien installer.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Téléchargement de l'outil&lt;br /&gt;
 export VERSION_ACME=&amp;quot;3.0.4&amp;quot;&lt;br /&gt;
 wget https://github.com/acmesh-official/acme.sh/archive/refs/tags/&amp;quot;${VERSION_ACME}&amp;quot;.tar.gz -qO - | tar -xvz -C /tmp/ &amp;amp;&amp;amp; cp -av /tmp/acme.sh-&amp;quot;${VERSION_ACME}&amp;quot; /opt/&lt;br /&gt;
 ln -vs /opt/acme.sh-&amp;quot;${VERSION_ACME}&amp;quot; /opt/acme.sh&lt;br /&gt;
&lt;br /&gt;
Afin de ne pas nécessiter d'intervention manuelle, il est possible de créer une clé ''API'' auprès de nombreux [https://github.com/acmesh-official/acme.sh/wiki/dnsapi registres DNS]. Celle-ci permet au logiciel d'ajouter automatiquement un champ ''TXT'' servant à authentifier la légitimité de la requête.&lt;br /&gt;
&lt;br /&gt;
Génération d'un certificat simple&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
GANDI_LIVEDNS_KEY=&amp;quot;INSEREZ_VOTRE_CLEF_API&amp;quot; /opt/acme.sh/acme.sh --issue --server letsencrypt --keylength ec-384 -d test.ycharbi.fr --dns dns_gandi_livedns --force&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{info|Un répertoire &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;~/.acme.sh/&amp;lt;/syntaxhighlight&amp;gt; est automatiquement créé et contiendra l'ensemble des certificats et clés gérés. Pensez à y faire un ménage régulier car les certificats générés ne sont valides que 3 mois. La régénération d'un certificat pour un même ''FQDN'' remplace le précédent.}}&lt;br /&gt;
&lt;br /&gt;
Vous pouvez afficher le contenu de vos certificats (notamment la validité) via la commande&lt;br /&gt;
 openssl x509 -noout -text -in ~/.acme.sh/test.ycharbi.fr_ecc/fullchain.cer&lt;br /&gt;
&lt;br /&gt;
==Automatisation==&lt;br /&gt;
Dans la mesure où les certificats ont une validité de 3 mois et au vu de l’importance de les maintenir à jour, il est recommandé d'automatiser leur renouvellement. Voici un script permettant de générer un certificat valide pour tous les sous-domaines (joker) de ''ycharbi.fr''. Le résultat est mis, tant en forme qu'à disposition de [[Haproxy|HAProxy]] avant un rechargement de son service.&lt;br /&gt;
&lt;br /&gt;
{{attention|La méthode pour renseigner la clé ''API'' peut varier d'un registre à un autre. référez-vous à la [https://github.com/acmesh-official/acme.sh/wiki/dnsapi documentation] pour adapter le script à votre fournisseur. L'exemple ci-dessous est valide pour les ''DNS'' de [https://gandi.net Gandi].}}&lt;br /&gt;
&lt;br /&gt;
===Script de génération===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /usr/local/sbin/genX509.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
CLEF_API_DNS=&amp;quot;INSEREZ_VOTRE_CLEF_API&amp;quot;&lt;br /&gt;
DOMAINE=&amp;quot;ycharbi.fr&amp;quot;&lt;br /&gt;
CHEMIN_DST=&amp;quot;/root/letsencrypt/&amp;quot;&lt;br /&gt;
HAPROXY_TLS_DST=&amp;quot;/etc/haproxy/tls/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir -p /&amp;quot;${CHEMIN_DST}&amp;quot;/&amp;quot;${DOMAINE}&amp;quot;/&lt;br /&gt;
&lt;br /&gt;
GANDI_LIVEDNS_KEY=&amp;quot;${CLEF_API_DNS}&amp;quot; /opt/acme.sh/acme.sh --issue --server letsencrypt --keylength ec-384 -d &amp;quot;*.${DOMAINE}&amp;quot; --dns dns_gandi_livedns --cert-file /root/letsencrypt/&amp;quot;${DOMAINE}&amp;quot;/&amp;quot;${DOMAINE}&amp;quot;.crt --key-file /&amp;quot;${CHEMIN_DST}&amp;quot;/&amp;quot;${DOMAINE}&amp;quot;/&amp;quot;${DOMAINE}&amp;quot;.key --fullchain-file /&amp;quot;${CHEMIN_DST}&amp;quot;/&amp;quot;${DOMAINE}&amp;quot;/&amp;quot;${DOMAINE}&amp;quot;-full.crt --force --reloadcmd &amp;quot;cat /&amp;quot;${CHEMIN_DST}&amp;quot;/&amp;quot;${DOMAINE}&amp;quot;/&amp;quot;${DOMAINE}&amp;quot;-full.crt /&amp;quot;${CHEMIN_DST}&amp;quot;/&amp;quot;${DOMAINE}&amp;quot;/&amp;quot;${DOMAINE}&amp;quot;.key &amp;gt; /&amp;quot;${HAPROXY_TLS_DST}&amp;quot;/&amp;quot;${DOMAINE}&amp;quot;.pem &amp;amp;&amp;amp; systemctl reload haproxy.service&amp;quot;&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 chmod +x /usr/local/sbin/genX509.sh&lt;br /&gt;
&lt;br /&gt;
{{info|En précisant la destination des fichiers à générer, ceux-ci se trouveront à la fois dans le répertoire voulu ainsi que dans le &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;~/.acme.sh/&amp;lt;/syntaxhighlight&amp;gt; de d'habitude.}}&lt;br /&gt;
&lt;br /&gt;
===Automatisation de la tâche===&lt;br /&gt;
Afin d'exécuter le script automatiquement, divers outils peuvent êtres utilisés comme [[Cron]] ou les [[Minuteur - systemd|minuteurs Systemd]]. Je recommande cette dernière solution pour des raisons de fiabilité et de facilité de supervision.&lt;br /&gt;
&lt;br /&gt;
  mkdir -p /usr/local/etc/systemd/system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /usr/local/etc/systemd/system/genX509.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Génération du certificat joker pour les sous-domaines d'ycharbi.fr&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=genX509.sh&lt;br /&gt;
RemainAfterExit=no&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /usr/local/etc/systemd/system/genX509.timer&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Exécution mensuelle de la génération du certificat joker pour les sous-domaines d'ycharbi.fr&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=monthly&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ln -s /usr/local/etc/systemd/system/genX509.service /etc/systemd/system/&lt;br /&gt;
 ln -s /usr/local/etc/systemd/system/genX509.timer /etc/systemd/system/&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
 systemctl enable genX509.timer&lt;br /&gt;
 systemctl start genX509.timer&lt;br /&gt;
&lt;br /&gt;
Les informations sur la prochaine exécution sont visualisables avec la commande&lt;br /&gt;
 systemctl status genX509.timer&lt;br /&gt;
&lt;br /&gt;
=Certbot=&lt;br /&gt;
Cette section traite de l'outil historique bien trop lourd à mon goût. Je ne l'utilise plus car il impose trop de contraintes et peut être remplacé sans difficultés par plus simple. Ne sera abordé que la génération de certificats sans la partie automatisation.&lt;br /&gt;
&lt;br /&gt;
==Génération de certificats==&lt;br /&gt;
Il existe différents modes de génération de certificats. Voici ceux que j'utilise avec l'outil ''certbot''.&lt;br /&gt;
&lt;br /&gt;
===Mode autonome===&lt;br /&gt;
Ce mode permet de récupérer un certificat signé directement sur une machine proposant un service WEB (les commande seront à effectuées sur la machine répondant au domaine).&lt;br /&gt;
&lt;br /&gt;
{{attention|Cette méthode installe tout un tas de bordel sur la machine dont un serveur [[Apache]]. Pour ma part, je lance une machine dédiée (un [[Squashfs]] dans mon cas), qui se chargera de la génération des certificats que je récupèrent et transferts sur la machine de destination (opération lourde destinée principalement à des tests).}}&lt;br /&gt;
&lt;br /&gt;
====Installation====&lt;br /&gt;
 apt install python-certbot-apache&lt;br /&gt;
&lt;br /&gt;
====Génération====&lt;br /&gt;
Il faut que le domaine à signé dirige les requêtes vers l'adresse IP de la machine ''certbot'' sinon l'erreur 503 renvoyé par celui-ci et interrompra la procédure.&lt;br /&gt;
&lt;br /&gt;
{{astuce|Il est possible d'automatiser le remplissage du nom de domaine lié au certificat à générer si le paramètre &amp;quot;ServerName domaine.ycharbi.fr&amp;quot;  est ajouté dans un vHost. La procédure de création d'un vHost HTTPS par ''certbot'' sera donc automatique (sinon il demande de taper le numéro correspondant au vHost affiché dans la liste qu'il a généré en regardant dans le répertoire ''sites-availables'').}}&lt;br /&gt;
&lt;br /&gt;
'''Génération de certificat pour tube.ycharbi.fr'''&lt;br /&gt;
 certbot --authenticator standalone --installer apache -d tube.ycharbi.fr --pre-hook &amp;quot;service apache2 stop&amp;quot; --post-hook &amp;quot;service apache2 start&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{info|Il va demander une adresse e-mail qui servira à prévenir de l'expiration imminente du certificat.}}&lt;br /&gt;
&lt;br /&gt;
Le résultat est stocké dans ces emplacements:&lt;br /&gt;
* '''Clé publique/certificat:''' /etc/letsencrypt/live/tube.ycharbi.fr/fullchain.pem&lt;br /&gt;
* '''Clé privé:''' /etc/letsencrypt/live/tube.ycharbi.fr/privkey.pem&lt;br /&gt;
&lt;br /&gt;
Il est bien sûr possible d'en faire un certificat chaîné pour certaines applications comme [[Haproxy]] par exemple:&lt;br /&gt;
 cat /etc/letsencrypt/live/tube.ycharbi.fr/fullchain.pem /etc/letsencrypt/live/tube.ycharbi.fr/privkey.pem &amp;gt; /etc/ssl/tube.ycharbi.fr.pem&lt;br /&gt;
&lt;br /&gt;
====Source de la section====&lt;br /&gt;
* https://community.letsencrypt.org/t/solution-client-with-the-currently-selected-authenticator-does-not-support-any-combination-of-challenges-that-will-satisfy-the-ca/49983&lt;br /&gt;
&lt;br /&gt;
===Mode manuel===&lt;br /&gt;
Cette méthode permet de générer des certificat joker (''wildcard''). Selon moi, elle est beaucoup plus propre et n'installe pas tout un tas de paquets sur la machine. Elle peut être utilisée depuis une machine qui n'héberge aucun services (je l'utilise personnellement depuis mon proxy inverse). &lt;br /&gt;
&lt;br /&gt;
====Installation====&lt;br /&gt;
 apt install certbot&lt;br /&gt;
&lt;br /&gt;
====Génération====&lt;br /&gt;
 certbot certonly --rsa-key-size 4096 --server https://acme-v02.api.letsencrypt.org/directory --manual -d '*.ycharbi.fr'&lt;br /&gt;
&lt;br /&gt;
Il va poser une chiée de question et donner le nom et la valeur d'un champ TXT DNS à entrer dans la zone du domaine à signé (il s'agit d'une clé d'authentification pour le protocole ACMEv2). Une fois ce champ renseigné et appliqué dans la zone DNS, faire &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;entrer&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; au prompte pour récupérer le certificat ainsi que sa clef privée (disponibles dans &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;/etc/letsencrypt/archive/ycharbi.fr&amp;lt;/syntaxhighlight&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
====Sources de la section====&lt;br /&gt;
* https://blog.blaisot.org/letsencrypt-wildcard-part1.html&lt;br /&gt;
* https://wiki.dureuil.info/doku.php/linux:cert-ssl-letsencrypt-wildcard-api-gandi-livedns&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Firefox&amp;diff=1526</id>
		<title>Firefox</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Firefox&amp;diff=1526"/>
		<updated>2024-07-07T08:01:58Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout de la section &amp;quot;Désactiver la géolocalisation&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:navigateurs web]]&lt;br /&gt;
&lt;br /&gt;
=Activer la gestion du tactile=&lt;br /&gt;
Comme beaucoup de fonctions dans Firefox, la gestion des écrans tactile n'est pas activée par défaut dans nombre d’environnements (c'est le cas de Debian). Pour l'activer, il faut définir une variable d'environnement et activer l'option dans la section dédiée de Firefox.&lt;br /&gt;
&lt;br /&gt;
==Définir la variable d'environnement==&lt;br /&gt;
 echo 'MOZ_USE_XINPUT2=1' &amp;gt;&amp;gt; /etc/environment&lt;br /&gt;
&lt;br /&gt;
La modification prend effet au redémarrage. Il est possible de lancer Firefox avec la définition de cette variable manuellement via le terminal en attendant: &amp;lt;code&amp;gt;MOZ_USE_XINPUT2=1 firefox&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Activation de l'option dans Firefox==&lt;br /&gt;
&lt;br /&gt;
Il faut se rendre dans &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt; et mettre le paramètre '''dom.w3c_touch_events.enabled''' à '''1'''. La modification est active instantanément. Vous pouvez profiter du défilement, de la sélection et du zoom au doigt.&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://support.mozilla.org/es/questions/1091627&lt;br /&gt;
&lt;br /&gt;
=Utiliser Wayland=&lt;br /&gt;
Il est possible d'utiliser ''Firefox'' avec [[Wayland]] en définissant la [https://www.reddit.com/r/firefox/comments/c8itj2/enabling_wayland_on_linux/ variable d'environnement] &amp;lt;code&amp;gt;MOZ_ENABLE_WAYLAND=1&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;/etc/environment&amp;lt;/code&amp;gt;. Un redémarrage du programme est nécessaire et il faut s'assurer que la variable est bien définie lors de son lancement (le plus simple est de redémarrer le système).&lt;br /&gt;
&lt;br /&gt;
=Désactiver le détachement d'un onglet=&lt;br /&gt;
Une fonctionne ultra casse couilles avec Firefox c'est bien le [https://www.askvg.com/firefox-tip-disable-tabs-drag-n-drop-feature-to-move-to-new-window/ glisser/déposer d'un onglet] qui en fait une nouvelle fenêtre. Juste insupportable. Pour désactiver cette merde, il faut passer la valeur &amp;lt;code&amp;gt;browser.tabs.allowTabDetach&amp;lt;/code&amp;gt; à '''false'''.&lt;br /&gt;
&lt;br /&gt;
=Restaurer la fenêtre de téléchargement=&lt;br /&gt;
Avec Firefox 98 (et comme avec chaque nouvelle version), une fonctionnalité indispensable a été supprimée : la possibilité d'ouvrir un fichier sans l'enregistrer quelque part sur le disque (il va simplement dans le &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;). Pour restaurer ce comportement, il faut passer la valeur &amp;lt;code&amp;gt;browser.download.improvements_to_download_panel&amp;lt;/code&amp;gt; à &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; dans le &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Forcer l'usage du presse papier=&lt;br /&gt;
Certains sites ''WEB'' se croient malins en interdisant l'utilisation du copier/coller dans les formulaires (réinitialisation de mots de passe par exemple). Cette pratique, en plus d'être une atteinte à notre liberté d'utiliser nos outils informatiques comme nous l'entendons, nous empêche de gérer nos [[Génération de mots de passe|mots de passe]] à notre guise (la meilleur clé est celle que vous ne connaissez pas et donc que vous ne pouvez pas taper dans un champ de formulaire...). Comme souvent, sous couvert de sécurité, le résultat est l'exact opposé. Aux développeurs ''WEB'' : laissez-nous gérer nos outils informatiques comme nous l'entendons, nous sommes bien plus à même de savoir ce qui est bon pour nous que vous !&lt;br /&gt;
&lt;br /&gt;
Pour dire à ''Firefox'' de ne pas respecter le ''Javascript'' qui lui dit d'adopter un comportement aussi débile, il faut passer la [https://www.howtogeek.com/251807/how-to-enable-pasting-text-on-sites-that-block-it/ valeur] &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt;dom.event.clipboardevents.enabled&amp;lt;/code&amp;gt; à '''false'''.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez alors de nouveau de vous prendre pour un [https://fr.wikipedia.org/wiki/Pasteur_(christianisme) pasteur] en usant de ''copy/paste'' !&lt;br /&gt;
&lt;br /&gt;
{{attention|La désactivation de cette fonction empêche le [https://github.com/element-hq/element-web/issues/25695 collage de textes] dans le champ de discutions de [[Matrix_synapse#Client_WEB_Element|element-web]] (un &amp;lt;code&amp;gt;ctrl+v&amp;lt;/code&amp;gt; n'a donc plus aucun effet).}}&lt;br /&gt;
&lt;br /&gt;
=Désactiver le rafraîchissement automatique=&lt;br /&gt;
Certains sites non respectueux de leurs utilisateurs (les sites de presse en tête), utilisent du ''Javascript'' pour rafraîchir automatiquement les pages de leur site (probablement pour générer du revenu avec la publicité).&lt;br /&gt;
Cette pratique, outre le fait de consommer de la bande passante et du ''CPU'' (donc de l'électricité), engendre un comportement non désiré et inattendu de l'utilisateur (seul maître légitime de son ordinateur).&lt;br /&gt;
&lt;br /&gt;
Pour faire cesser ça, il faut initier la clé &amp;lt;code&amp;gt;accessibility.blockautorefresh&amp;lt;/code&amp;gt; à ''true'' dans &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Désactiver la géolocalisation=&lt;br /&gt;
Certains sites envoient une requête au navigateur afin de demander d'activer la géolocalisation. Cela se matérialise dans ''Firefox'' par un popup au niveau de la barre d'adresse qui masque une partie du site (pénible). Calqué sur le modèle de celui demandant d'enregistrer un mot de passe, celui-ci n'est pas désactivable dans les paramètres (cela doit être trop difficile à coder pour ''Mozilla''...). Cela se fait donc via les habituels paramètres avancés de &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt;, en [https://whatismyipaddress.com/enabling-and-disabling-geolocation-on-your-browser#h-firefox passant] &amp;lt;code&amp;gt;geo.enabled&amp;lt;/code&amp;gt; à &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Lacp_-_cisco&amp;diff=1525</id>
		<title>Lacp - cisco</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Lacp_-_cisco&amp;diff=1525"/>
		<updated>2024-05-18T11:25:07Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Configuration */ Ajout d'une précision dans le cas d'une erreurs de protocole&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:cisco]]&lt;br /&gt;
[https://fr.wikipedia.org/wiki/IEEE_802.3ad IEEE 802.3ad] (''Link Aggregation Control Protocol'' ou ''LACP'') est un protocole de niveau 2 du modèle ''OSI'' qui permet de grouper plusieurs ports physiques en une seule voie logique.&lt;br /&gt;
&lt;br /&gt;
Nous allons donc utiliser 2 interfaces sur un commutateur Cisco 2960 pour en faire une logique afin de bénéficier d'une plus grande bande passante (uniquement dans le cas d'accès concurrents et en fonction de la configuration des serveurs) ainsi que de la résilience de panne.&lt;br /&gt;
&lt;br /&gt;
{{attention|Cette technique ne permet pas d'avoir un tuyau égale à la somme des bandes passantes des liens qui le compose. Le ''LACP'' permet de répartir les transferts sur les interfaces qui en font parti. Un seul client ne pourra alors pas bénéficier de plus de la capacité d'un lien mais plusieurs clients pourront chacun utiliser la bande passante d'une interface et donc ne pas se saturer l'un l'autre. ce caractéristique est personnalisable à la marge en fonction de l’algorithme de hachage utilisé par la machine émettant le trafic (voir [https://www.kernel.org/doc/html/latest/networking/bonding.html xmit_hash_policy] sous les ponts ''Linux'' et en particulier ''layer3+4'').}}&lt;br /&gt;
&lt;br /&gt;
=Configuration=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
conf t&lt;br /&gt;
# Création de l'interface d'agrégat&lt;br /&gt;
interface port-channel 1&lt;br /&gt;
# Sur certains commutateurs de niveau 3, il faut préciser que l'on va faire du niveau 2&lt;br /&gt;
switchport&lt;br /&gt;
# Il est possible de préciser que l'interface est en trunk mais cela est facultatif. Seul la configuration des interfaces membres importe&lt;br /&gt;
&lt;br /&gt;
# Configuration des interfaces membres de l'agrégat&lt;br /&gt;
interface range fa 0/1 - 2&lt;br /&gt;
description --- LACP vers Commut2 ---&lt;br /&gt;
switchport mode trunk&lt;br /&gt;
channel-protocol lacp&lt;br /&gt;
channel-group 1 mode active&lt;br /&gt;
&lt;br /&gt;
# Dans le cas de certaines erreurs de protocole, l'agrégat peut se bloquer (un comble)&lt;br /&gt;
# Pour le débloquer automatiquement, la commande suivante peut être utilisée&lt;br /&gt;
errdisable recovery cause channel-misconfig&lt;br /&gt;
# L'intervalle de restauration après erreur peut être définit comme suit&lt;br /&gt;
errdisable recovery interval 60&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Source=&lt;br /&gt;
*http://www.cisco.com/c/en/us/td/docs/ios/12_2sb/feature/guide/gigeth.html&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Agr%C3%A9gation_de_liens_-_linux&amp;diff=1524</id>
		<title>Agrégation de liens - linux</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Agr%C3%A9gation_de_liens_-_linux&amp;diff=1524"/>
		<updated>2024-05-18T08:48:15Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout d'une précision sur l'algorithme de hachage du LACP + remplacement de la balise source obsolète&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:iproute2]]&lt;br /&gt;
&lt;br /&gt;
Le noyau ''Linux'' propose de grouper plusieurs interfaces réseau en un agrégat régit par différents modes possibles. L'intérêt est bien souvent de bénéficier d'une haute disponibilité sur un lien mais certains modes peuvent apporter un accroissement de performances lors de cas de figures particuliers.&lt;br /&gt;
&lt;br /&gt;
=Les modes de fonctionnements=&lt;br /&gt;
Les modes proposés, au nombre de 7, sont les suivants:&lt;br /&gt;
* '''Mode 0 (balance-rr)''': Aussi connu sous le nom de ''Round-robin'', ce mode permet de transmettre et recevoir les paquets séquentiellement un à un par chaque interface. Il en résulte un '''''équilibrage de la charge'''''.&lt;br /&gt;
* '''Mode 1 (active-backup)''' : Dans ce mode, une seule interface est active, tandis que toutes les autres sont en état de sauvegarde. Si l'interface active échoue, une de sauvegarde la remplace en tant que seule active dans la liaison. L'adresse de contrôle d'accès au support (''MAC'') de l'interface de liaison n'est visible que sur un seul port, ce qui évite toute confusion pour le commutateur. Ce mode offre une '''''tolérance aux pannes'''''.&lt;br /&gt;
* '''Mode 2 (balance-xor)''' : L'adresse ''MAC'' source utilise une logique exclusive (ou ''XOR'') avec l'adresse ''MAC'' de destination. Ce calcul garantit que la même interface esclave est sélectionnée pour chaque adresse ''MAC'' de destination. Ce mode assure la '''''tolérance aux pannes''''' et l''''''équilibrage de charge'''''.&lt;br /&gt;
* '''Mode 3 (broadcast)''' : Toutes les transmissions sont envoyées à tous les esclaves. Ce mode assure une '''''tolérance aux pannes'''''.&lt;br /&gt;
* '''Mode 4 (802.3ad)''' : Ce mode crée des groupes d'agrégation qui partagent les mêmes paramètres de vitesse et de mode de transmission ([Half-]duplex). Il nécessite un commutateur prenant en charge un lien dynamique ''[https://fr.wikipedia.org/wiki/IEEE_802.3ad IEEE 802.3ad]'' (ou ''LACP''). Le lien qui en résulte permet d'exploiter la bande passante de chaque interface lors d'accès concurrents (cette notion sera abordé un peu [[#plus bas|plus bas]]). Il offre une '''''tolérance aux pannes''''' et un '''''équilibrage de charge'''''.&lt;br /&gt;
* '''Mode 5 (balance-tlb)''' : Ce mode garantit que la répartition du trafic sortant est définie en fonction de la charge sur chaque interface et que l'une d'elle reçoive tout le trafic entrant. Si elle n'en reçoit pas, une autre est alors assignée à ce rôle. Il offre une '''''tolérance aux pannes''''' et un '''''équilibrage de charge'''''.&lt;br /&gt;
* '''Mode 6 (balance-alb)''' : Les paquets reçus sont équilibrés par la négociation du protocole de résolution d'adresse (''ARP''). Il offre une '''''tolérance aux pannes''''' et un '''''équilibrage de charge''''' (ceci n'est pris en charge que dans les environnements ''x86'').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Quel que soit le mode choisi, les commandes utilisées seront les mêmes. Il faudra simplement spécifier ce choix par son numéro ou le mot clé qui y est associé (écrit entre parenthèses dans la liste ci-dessus).&lt;br /&gt;
&lt;br /&gt;
Vous l'avez probablement remarqué mais le rôle de chacun d'entre eux est plutôt redondant. Honnêtement je n'ai jamais vu autre chose que le mode 4 en condition réelles et je me demande bien à quoi servent les autres. Je pense qu'historiquement ils étaient là avant l'invention du ''LACP'' et qu'ils ont permis (par de sacrés bidouilles) de répondre à un besoin maintenant normé. Leur existence actuelle est probablement dû à un désir de conservation de méthodes ingénieuses qui ont fait leurs preuves par le passer.&lt;br /&gt;
&lt;br /&gt;
{{info|Dans le cas du mode 4 (''LACP''), il est également possible de préciser l’algorithme de hachage utilisé par la liaison (voir [https://www.kernel.org/doc/html/latest/networking/bonding.html xmit_hash_policy]. Ceci permet de spécifier le mode de distribution des trames lors d'accès concurrents par des clients vers plusieurs machines servies par LACP (la politique ''layer3+4'' permet d'utiliser 100% de la bande passante des liens composant le ''LACP'' dans certains cas). La valeur &amp;lt;code&amp;gt;layer2&amp;lt;/code&amp;gt; est définit par défaut.}}&lt;br /&gt;
&lt;br /&gt;
=Configuration d'un agrégat=&lt;br /&gt;
Afin de configurer un agrégat de liens sous un ''Linux'' récent, il faut les outils du paquet ''[[:Category:iproute2|iproute2]]'' installés sur votre machine.&lt;br /&gt;
&lt;br /&gt;
==Exemple avec LACP==&lt;br /&gt;
Je vais présenter les commandes nécessaires à l'établissement d'un agrégat se basant le protocole ''IEEE 802.3ad''. Comme expliqué dans la documentation de celui-ci pour [[Lacp - cisco|Cisco IOS]], il est important de préciser que cette norme ne permet pas d'avoir un tuyau égale à la somme des bandes passantes des liens qui le compose. Le ''LACP'' permet de répartir les transferts sur les interfaces qui en font parti. Ainsi, un seul client ne pourra pas bénéficier de plus de la capacité d'un lien mais plusieurs clients pourront chacun utiliser la bande passante d'une interface et donc ne pas se saturer l'un l'autre. Ne vous attendez donc pas à avoir du 5gbps (en couplant 5 interfaces gigabits) lors d'un transfert avec un seul PC (relié en 10gbps). Ce n'est pas ce que permet le ''LACP'' (si c'est ce que vous voulez, tournez-vous plutôt vers le [[Multipath TCP]]).&lt;br /&gt;
&lt;br /&gt;
La série de commandes qui suit utilise la notion de filtrage de ''VLAN'' exploité dans [[Vlan - linux|ce document]]. L'''IEEE 802.3ad'' peut donc tout à fait s'intégrer dans une configuration déjà existante pour peu que vous ayez suffisamment d'interfaces réseau sur votre machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Création d'un pont gérant le 802.1Q&lt;br /&gt;
ip link add br0 type bridge vlan_filtering 1&lt;br /&gt;
ip link set br0 up&lt;br /&gt;
&lt;br /&gt;
# Création de l'interface d'agrégat&lt;br /&gt;
ip link add bond0 type bond&lt;br /&gt;
ip link set bond0 type bond miimon 100 mode 4&lt;br /&gt;
# Pour préciser la fonction de hachage à utiliser :&lt;br /&gt;
# ip link set bond0 type bond miimon 100 mode 4 xmit_hash_policy layer3+4&lt;br /&gt;
&lt;br /&gt;
# Ajout des interfaces physique à celui-ci&lt;br /&gt;
ip link set eth0 down&lt;br /&gt;
ip link set eth0 master bond0&lt;br /&gt;
ip link set eth1 down&lt;br /&gt;
ip link set eth1 master bond0&lt;br /&gt;
ip link set bond0 up&lt;br /&gt;
&lt;br /&gt;
# Ajout de l'agrégat au pont&lt;br /&gt;
ip link set bond0 master br0&lt;br /&gt;
&lt;br /&gt;
# Suppression du VLAN par défaut&lt;br /&gt;
bridge vlan del dev br0 vid 1 self&lt;br /&gt;
bridge vlan del dev bond0 vid 1 master&lt;br /&gt;
&lt;br /&gt;
# Ajout de VLAN au trunk transporté par l'agrégat&lt;br /&gt;
bridge vlan add dev br0 vid 180 tagged self&lt;br /&gt;
bridge vlan add dev br0 vid 181 tagged self&lt;br /&gt;
bridge vlan add dev bond0 vid 180 tagged master&lt;br /&gt;
bridge vlan add dev bond0 vid 181 tagged master&lt;br /&gt;
&lt;br /&gt;
# Création d'interfaces VLAN (SVI)&lt;br /&gt;
ip link add link br0 name vlan180 type vlan id 180&lt;br /&gt;
ip link set vlan180 up&lt;br /&gt;
ip address add 192.168.180.224/24 dev vlan180&lt;br /&gt;
&lt;br /&gt;
ip link add link br0 name vlan181 type vlan id 181&lt;br /&gt;
ip link set vlan181 up&lt;br /&gt;
ip address add 192.168.181.224/24 dev vlan181&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{astuce|Pour les suppressions et les retraits d'interfaces, il faut utiliser les mots clés &amp;lt;code&amp;gt;del&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;nomaster&amp;lt;/code&amp;gt; à la place de &amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{info|Le paramètre &amp;lt;code&amp;gt;miimon 100&amp;lt;/code&amp;gt; passé à la définition du type de l'interface &amp;lt;code&amp;gt;bond0&amp;lt;/code&amp;gt; permet de spécifier la fréquence de surveillance de la liaison ''[http://jmainy.free.fr/guill.web-/Fea3.html MII]'' (''Medium Indepedant Interface'') en millisecondes. Cela détermine la fréquence à laquelle l'état du lien vers chaque esclave est inspecté pour détecter les défaillances de ceux-ci. Une valeur de zéro désactive la surveillance de la liaison ''MII''. Une valeur de 100 est une valeur standard. Source ''[https://www.linuxquestions.org/questions/linux-networking-3/mode%3D1-miimon%3D100-934723/ ici]'' et ''[https://www.tecmint.com/network-nic-bonding-teaming-in-debian-linux/ là]''.}}&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* https://developer.rackspace.com/blog/lacp-bonding-and-linux-configuration/&lt;br /&gt;
* https://access.redhat.com/documentation/fr-fr/red_hat_enterprise_linux/7/html/networking_guide/sec-using_channel_bonding&lt;br /&gt;
* https://developers.redhat.com/blog/2017/09/14/vlan-filter-support-on-bridge/&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Lacp_-_cisco&amp;diff=1523</id>
		<title>Lacp - cisco</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Lacp_-_cisco&amp;diff=1523"/>
		<updated>2024-05-18T08:41:55Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout d'une précision sur l'algorithme de hachage du LACP + remplacement de la balise source obsolète&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:cisco]]&lt;br /&gt;
[https://fr.wikipedia.org/wiki/IEEE_802.3ad IEEE 802.3ad] (''Link Aggregation Control Protocol'' ou ''LACP'') est un protocole de niveau 2 du modèle ''OSI'' qui permet de grouper plusieurs ports physiques en une seule voie logique.&lt;br /&gt;
&lt;br /&gt;
Nous allons donc utiliser 2 interfaces sur un commutateur Cisco 2960 pour en faire une logique afin de bénéficier d'une plus grande bande passante (uniquement dans le cas d'accès concurrents et en fonction de la configuration des serveurs) ainsi que de la résilience de panne.&lt;br /&gt;
&lt;br /&gt;
{{attention|Cette technique ne permet pas d'avoir un tuyau égale à la somme des bandes passantes des liens qui le compose. Le ''LACP'' permet de répartir les transferts sur les interfaces qui en font parti. Un seul client ne pourra alors pas bénéficier de plus de la capacité d'un lien mais plusieurs clients pourront chacun utiliser la bande passante d'une interface et donc ne pas se saturer l'un l'autre. ce caractéristique est personnalisable à la marge en fonction de l’algorithme de hachage utilisé par la machine émettant le trafic (voir [https://www.kernel.org/doc/html/latest/networking/bonding.html xmit_hash_policy] sous les ponts ''Linux'' et en particulier ''layer3+4'').}}&lt;br /&gt;
&lt;br /&gt;
=Configuration=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
conf t&lt;br /&gt;
# Création de l'interface d'agrégat&lt;br /&gt;
interface port-channel 1&lt;br /&gt;
# Sur certains commutateurs de niveau 3, il faut préciser que l'on va faire du niveau 2&lt;br /&gt;
switchport&lt;br /&gt;
# Il est possible de préciser que l'interface est en trunk mais cela est facultatif. Seul la configuration des interfaces membres importe&lt;br /&gt;
&lt;br /&gt;
# Configuration des interfaces membres de l'agrégat&lt;br /&gt;
interface range fa 0/1 - 2&lt;br /&gt;
description --- LACP vers Commut2 ---&lt;br /&gt;
switchport mode trunk&lt;br /&gt;
channel-protocol lacp&lt;br /&gt;
channel-group 1 mode active&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Source=&lt;br /&gt;
*http://www.cisco.com/c/en/us/td/docs/ios/12_2sb/feature/guide/gigeth.html&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Ffmpeg&amp;diff=1522</id>
		<title>Ffmpeg</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Ffmpeg&amp;diff=1522"/>
		<updated>2024-05-15T21:36:45Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout de la section &amp;quot;Rotation d'une vidéo&amp;quot; + remplacement d'une balise &amp;quot;syntaxhighlight inline&amp;quot; par une balise &amp;quot;code&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
[https://fr.wikipedia.org/wiki/FFmpeg FFmpeg] est une collection de logiciels libres destinés au traitement de flux audio ou vidéo (enregistrement, lecture ou conversion d'un format à un autre). Cette bibliothèque est utilisée par de nombreux autres logiciels ou services comme ''VLC'', ''iTunes'' ou ''YouTube''.&lt;br /&gt;
&lt;br /&gt;
Développé sur ''GNU/Linux'', ''FFmpeg'' peut être compilé sur la plupart des systèmes d'exploitation, y compris [[:Category:Windows|Windows]]. Le projet est distribué sous licence libre, [https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_GNU GPL] 2+ ou [https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_limit%C3%A9e_GNU LGPL] 2.1+ en fonction des options de compilation du projet.&lt;br /&gt;
&lt;br /&gt;
=Extraire le son=&lt;br /&gt;
Voici comment [http://www.loopsbeats.com/convert/extract-audio-with-ffmpeg.html extraire le son] d'une vidéo ''mp4'' en ''mp3'' :&lt;br /&gt;
 ffmpeg -i toto.mp4 -vn -ar 44100 -ac 2 -ab 192 -f mp3 toto.mp3&lt;br /&gt;
&lt;br /&gt;
=Extraire la jaquette=&lt;br /&gt;
Les fichiers audios embarquent souvent une image (communément la jaquette de l'album). Voici comment la [https://unix.stackexchange.com/questions/41287/how-to-extract-album-cover-image-from-mp3-file récupérer] :&lt;br /&gt;
 ffmpeg -i fichier.mp3 -an -c:v copy fichier.jpg&lt;br /&gt;
&lt;br /&gt;
=Couper un extrait=&lt;br /&gt;
Il est possible de [https://superuser.com/questions/138331/using-ffmpeg-to-cut-up-video#704118 découper un morceau] de fichier avec ceci :&lt;br /&gt;
 ffmpeg -ss 00:00:53 -i Pas\ de\ manières-5hjNP5dNNs4.m4a -t 00:00:11 -c copy Ta_cherie.m4a&lt;br /&gt;
&lt;br /&gt;
Explications :&lt;br /&gt;
* '''-ss''' : début de la découpe&lt;br /&gt;
* '''-i''' : fichier source&lt;br /&gt;
* '''-t''' : temps à garder à partir de '''-ss'''&lt;br /&gt;
* '''-c''' : action à effectuer&lt;br /&gt;
&lt;br /&gt;
Il est aussi possible de préciser le nombre de trames à conserver à partir d'un temps donnée (plus précis) :&lt;br /&gt;
 ffmpeg -y -ss 00:01:28 -i Toto.mp4 -c:v libx264 -c:a aac -frames:v 100 /tmp/titi.mp4&lt;br /&gt;
&lt;br /&gt;
Paramètres différents :&lt;br /&gt;
* '''-c:v libx264''' : codec vidéo de transcodage (facultatif)&lt;br /&gt;
* '''-c:a aac''' : codec audio de transcodage (facultatif)&lt;br /&gt;
* '''-frames:v 100''' : garder 100 trames (le &amp;quot;v&amp;quot; peut être remplacé par un &amp;quot;a&amp;quot; en cas de fichier uniquement audio)&lt;br /&gt;
&lt;br /&gt;
Dans le cas d'une vidéo comportant [https://stackoverflow.com/questions/60445661/ffmpeg-how-do-i-choose-the-correct-audio-track plusieurs] pistes audios, il est possible de sélectionner la désirée de la manière suivante :&lt;br /&gt;
 ffmpeg -y -ss 00:27:26 -i Toto.mp4 -c:v libx264 -c:a aac -frames:v 530 -map 0:v:0 -map 0:a:2 /tmp/titi.mp4.mp4&lt;br /&gt;
&lt;br /&gt;
Paramètres différents :&lt;br /&gt;
* '''-map 0:v:0''' : première piste vidéo&lt;br /&gt;
* '''-map 0:a:2''' : troisième piste audio&lt;br /&gt;
&lt;br /&gt;
=Convertir un fichier=&lt;br /&gt;
Pour [https://fr.wikihow.com/utiliser-FFmpeg convertir un fichier] dans un autre format :&lt;br /&gt;
 ffmpeg -i Ni_flic_ni_pd.ogg Ni_flic_ni_pd.mp3&lt;br /&gt;
&lt;br /&gt;
''Note: L'outil détecte automatiquement le format du fichier voulu en lisant l'extension de destination.''&lt;br /&gt;
&lt;br /&gt;
Il est possible d'ajouter des paramètres afin de préciser des [https://trac.ffmpeg.org/wiki/Encode/H.264 caractéristiques d'encodage]. [https://emirchouchane.com/h264-ffmpeg/ Par exemple], pour une conversion vidéo en ''h264'' :&lt;br /&gt;
 ffmpeg -i vidéo.m4v -c:v libx264 -crf 23 vidéo.mp4&lt;br /&gt;
&lt;br /&gt;
Explications :&lt;br /&gt;
* '''-c:v libx264''' : sélection du codec (''-c'') vidéo ('':v'') h264 (''libx264'')&lt;br /&gt;
* '''-crf 23''' : facteur de taux constant (''Constant Rate Factor'') à 23. Permet de définir le débit binaire de la vidéo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;https://{{SERVERNAME}}/fichiers/multim%c3%a9dia/conversion/ffmpeg/%c3%89chelle_Constant_Rate_Factor.svg&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autre exemple avec une conversion en [https://trac.ffmpeg.org/wiki/Encode/H.265 h265] :&lt;br /&gt;
 ffmpeg -i vidéo.mp4 -c:v libx265 -crf 26 -preset fast -c:a eac3 -b:a 640k /tmp/vidéo.mp4&lt;br /&gt;
&lt;br /&gt;
* '''-c:v libx265''' : codec vidéo en ''h265''&lt;br /&gt;
* '''-preset fast''' : vitesse d'encodage et profile de compression (énumérés [https://trac.ffmpeg.org/wiki/Encode/H.265#ConstantRateFactorCRF ici])&lt;br /&gt;
* '''-c:a eac3''' : codec audio en ''eac3''&lt;br /&gt;
* '''-b:a 640k''' : débit binaire du flux audio&lt;br /&gt;
&lt;br /&gt;
=Redimensionner une vidéo=&lt;br /&gt;
Outre le codec à utiliser et le ''CRF'' à modifier, il est possible d'alléger une vidéo en réduisant ses dimensions. Les différentes techniques combinées peuvent permettre d'arriver à envoyer péniblement une vidéo par [https://fr.wikipedia.org/wiki/Multimedia_Messaging_Service MMS]...&lt;br /&gt;
 ffmpeg -y -i /tmp/a.mp4 -crf 33 -vf &amp;quot;scale=iw/2:ih/2&amp;quot; /tmp/b.mp4&lt;br /&gt;
&lt;br /&gt;
Explications :&lt;br /&gt;
* '''-y''' : écrase la destination sans demander de confirmation&lt;br /&gt;
* '''-i''' : fichier source&lt;br /&gt;
* '''-crf 33''' : forte compression (destructrice) de la vidéo&lt;br /&gt;
* '''-vf &amp;quot;scale=iw/2:ih/2&amp;quot;''' : réduction par deux des dimensions de la vidéo&lt;br /&gt;
&lt;br /&gt;
=Rotation d'une vidéo=&lt;br /&gt;
Il n'est pas rare de tomber sur une vidéo capturée via un téléphone en mode portrait du fait d'un utilisateur ayant commencé la prise de vue dans cette orientation et s’étant rendu compte, après coup, qu'il fallait tourner la caméra pour avoir un bon rendu... Il est possible de corriger cela via une [https://www.baeldung.com/linux/ffmpeg-rotate-video rotation] avec le paramètre &amp;lt;code&amp;gt;transpose=0&amp;lt;/code&amp;gt; où &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; correspond à l'orientation à appliquer d'après la liste suivante :&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; : sens inverse des aiguilles d'une montre et inversion verticale (par défaut)&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; : sens des aiguilles d'une montre&lt;br /&gt;
* &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; : sens inverse des aiguilles d'une montre&lt;br /&gt;
* &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; : sens des aiguilles d'une montre et inversion verticale&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 ffmpeg -i VID_20240415_150506.mp4 -vf &amp;quot;transpose=2&amp;quot; VID_20240415_150506_r2.mp4&lt;br /&gt;
&lt;br /&gt;
=Fusionner une bande vidéo et une bande son=&lt;br /&gt;
Il est possible de [https://qastack.fr/superuser/277642/how-to-merge-audio-and-video-file-in-ffmpeg regrouper] dans un même fichier multimédia ([https://fr.wikipedia.org/wiki/Format_conteneur conteneur]) une bande vidéo et une bande son. Un cas typique est le téléchargement d'une vidéo sur le site [https://crowdbunker.com crowdbunker.com] via les fichiers &amp;lt;code&amp;gt;.m3u&amp;lt;/code&amp;gt; capturés dans le trafic réseau. La vidéo est découplé du son (deux téléchargements séparés) et c'est le lecteur vidéo ''WEB'' qui se charge de lire les deux en même temps. Pour fusionner les deux après téléchargement en local, la commande suivante peut être utilisée :&lt;br /&gt;
 ffmpeg -i Vidéo_source.mp4 -i Audio_source.mp4 -c:v copy -c:a aac -strict experimental Vidéo_et_audio_destination.mp4&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Chrony&amp;diff=1521</id>
		<title>Chrony</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Chrony&amp;diff=1521"/>
		<updated>2024-04-24T15:46:24Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Voir modifs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Service_temps]]&lt;br /&gt;
&lt;br /&gt;
[https://chrony-project.org Chrony] est, comme sont homologue [[Ntp - linux|éponyme]], une implémentation libre du protocole [https://fr.wikipedia.org/wiki/Network_Time_Protocol NTP] (Network Time Protocol). Il peut synchroniser l'horloge système avec d'autres serveurs ''NTP'', des horloges de référence matériel comme des récepteurs GPS ainsi que manuellement. L'outil embarque un client permettant la synchronisation avec des sources externes ainsi qu'un serveur pouvant accepter les requêtes de temps de clients autorisés.&lt;br /&gt;
&lt;br /&gt;
''Chrony'' supporte, depuis la version 4.0, le protocole [https://datatracker.ietf.org/doc/rfc8915/ NTS] (Network Time Security) permettant d'authentifier les serveurs via une couche de sécurité [https://fr.wikipedia.org/wiki/Transport_Layer_Security TLS] (Transport Layer Security).&lt;br /&gt;
&lt;br /&gt;
{{info|La présente documentation est réalisée sous ''GNU/Linux Debian 12'' et ''chrony 4.3-2''.}}&lt;br /&gt;
&lt;br /&gt;
=Serveur=&lt;br /&gt;
==Installation==&lt;br /&gt;
Installation du service&lt;br /&gt;
 apt install --no-install-recommends chrony&lt;br /&gt;
&lt;br /&gt;
==Configuration de base==&lt;br /&gt;
L'outil se base sur un unique fichier &amp;lt;code&amp;gt;/etc/chrony/chrony.conf&amp;lt;/code&amp;gt; (changeable via un &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt;) pouvant être atomisé dans &amp;lt;code&amp;gt;/etc/chrony/conf.d/&amp;lt;/code&amp;gt;. Les directives des serveurs peuvent quand à elle (et elles seules) être atomisées dans &amp;lt;code&amp;gt;/etc/chrony/sources.d/&amp;lt;/code&amp;gt;. Il n'est cependant généralement intéressant d'utiliser cette atomicité que dans des configurations complexes.&lt;br /&gt;
&lt;br /&gt;
Voici le contenu de ce fichier pour une configuration simple en mode serveur pour deux réseaux clients&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Bienvenue dans le fichier de configuration de chrony. Veuillez voir la page de&lt;br /&gt;
# manuel chrony.conf(5) pour plus d'informations sur les directives utilisables.&lt;br /&gt;
&lt;br /&gt;
# Inclure les fichiers de configurations trouvés dans /etc/chrony/conf.d.&lt;br /&gt;
confdir /etc/chrony/conf.d&lt;br /&gt;
&lt;br /&gt;
# Utiliser les serveurs de temps de Debian.&lt;br /&gt;
# Toutes les IP retournées par le DNS seront utilisées dans la plage (pool).&lt;br /&gt;
pool 2.debian.pool.ntp.org iburst&lt;br /&gt;
&lt;br /&gt;
# Utiliser les serveurs de temps fournis par les baux DHCP.&lt;br /&gt;
# sourcedir /run/chrony-dhcp&lt;br /&gt;
&lt;br /&gt;
# Utiliser les serveurs NTP trouvés dans /etc/chrony/sources.d.&lt;br /&gt;
sourcedir /etc/chrony/sources.d&lt;br /&gt;
&lt;br /&gt;
# Cette directive spécifie la localisation du fichier contenant le couple ID/clé&lt;br /&gt;
# pour l'authentification NTP.&lt;br /&gt;
keyfile /etc/chrony/chrony.keys&lt;br /&gt;
&lt;br /&gt;
# Cette directive spécifie le fichier dans lequel chrony va stocker les&lt;br /&gt;
# informations de ratios.&lt;br /&gt;
driftfile /var/lib/chrony/chrony.drift&lt;br /&gt;
&lt;br /&gt;
# Sauvegarder les les clés et cookies du protocole NTS dans /var/lib/chrony.&lt;br /&gt;
ntsdumpdir /var/lib/chrony&lt;br /&gt;
&lt;br /&gt;
# Dé-commenter la ligne suivant pour activer la journalisation.&lt;br /&gt;
# Chaque mot définit un type de données à journaliser. Se référer au manuel.&lt;br /&gt;
#log tracking measurements statistics&lt;br /&gt;
&lt;br /&gt;
# Localisation des fichiers de journaux&lt;br /&gt;
logdir /var/log/chrony&lt;br /&gt;
&lt;br /&gt;
# Arrêter de considérer la source RTC matériel comme fiable au bout du seuil définit.&lt;br /&gt;
maxupdateskew 100.0&lt;br /&gt;
&lt;br /&gt;
# Cette directive active la synchronisation RTC du noyau (toute les 11 minutes).&lt;br /&gt;
# Notez l'incompatibilité de cette option avec la directive 'rtcfile'.&lt;br /&gt;
rtcsync&lt;br /&gt;
&lt;br /&gt;
# Ajuster d'une traite l'horloge au lieu de modifier la vitesse du temps pour&lt;br /&gt;
# ajuster le décalage lorsque celui-ci est supérieur à 1 seconde mais&lt;br /&gt;
# seulement pour les 3 premières synchronisations.&lt;br /&gt;
makestep 1 3&lt;br /&gt;
&lt;br /&gt;
# Obtenir le décalage TAI-UTC et les secondes intercalaires à partir de la&lt;br /&gt;
# base de données tz du système. Cette directive doit être commentée lors de&lt;br /&gt;
# l'utilisation de sources de temps qui utilisent des secondes intercalaires.&lt;br /&gt;
leapsectz right/UTC&lt;br /&gt;
&lt;br /&gt;
# Désactiver l'usage de chronyc via IP (port par défaut : UDP/323)&lt;br /&gt;
cmdport 0&lt;br /&gt;
&lt;br /&gt;
# Autoriser les clients NTP des réseaux suivants à se synchroniser au serveur&lt;br /&gt;
allow 192.168.1.0/24&lt;br /&gt;
allow 10.0.2.0/23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les directives &amp;lt;code&amp;gt;allow&amp;lt;/code&amp;gt; sont responsables du comportement en mode serveur de ''Chrony''. En l'absence de paramètre, tous les clients sont autorisés à requêter le serveur (''NTP'' publique'').&lt;br /&gt;
&lt;br /&gt;
Redémarrer le service&lt;br /&gt;
 systemctl restart chrony.service&lt;br /&gt;
&lt;br /&gt;
Afficher le statut du service pour voir d’éventuelle erreur&lt;br /&gt;
 systemctl status chrony.service&lt;br /&gt;
&lt;br /&gt;
==Authentification==&lt;br /&gt;
Deux modes d'authentification sont pris en charge :&lt;br /&gt;
* authentification ''NTP'' ([https://www.rfc-editor.org/rfc/rfc5906 RFC 5906])&lt;br /&gt;
* NTS ([https://www.rfc-editor.org/info/rfc8915 RFC 8915])&lt;br /&gt;
&lt;br /&gt;
Dans la mesure où le temps n'est pas une donnée confidentielle (les raisons sont assez évidentes...), aucun mécanismes ne permet le chiffrement de son échange. Les méthodes existantes ne permettent que l'authenticité et l'intégrité des paquets transmis.&lt;br /&gt;
&lt;br /&gt;
===Authentification NTP===&lt;br /&gt;
&lt;br /&gt;
L'authentification ''NTP'' est le mécanisme historique assurant l'intégrité des réponses du serveur. Il se base sur une clé hachée via différents algorithmes (''SHA256'' dans notre exemple mais couramment [http://Ntp%20-%20cisco MD5]) et partagée entre les paires. Chaque clé comporte un identifiant unique et est contenue dans une base (texte plein pour ''Chrony'') des deux côtés de la communication. Le clients et le serveur doivent donc disposer du même couple identifiant/clé pour que les paquets soient jugés valides.&lt;br /&gt;
&lt;br /&gt;
{{attention|Cela ne fonctionne pas. Il doit y avoir quelque chose d'autre à faire car après altération de la clé, ça se synchronise quand même... Cette méthode n'ayant jamais eu aucun intérêt de toute façon je ne vais pas perdre de temps à la faire fonctionner. Utilisez ''NTS'' si vous voulez de la sécurité. C'est mieux en tout point et bien moins compliqué à mettre en œuvre.}}&lt;br /&gt;
&lt;br /&gt;
Génération de la clé côté serveur&lt;br /&gt;
 chronyc keygen 1 SHA256 256 &amp;gt;&amp;gt; /etc/chrony/chrony.keys&lt;br /&gt;
 systemctl restart chrony.service&lt;br /&gt;
&lt;br /&gt;
Il faut copier la ligne générée dans le même fichier sur le client et préciser la clé à utiliser dans la ligne du serveur du fichier de configuration&lt;br /&gt;
 server nts1.exemple.fr iburst key 1&lt;br /&gt;
&lt;br /&gt;
 systemctl restart chrony.service&lt;br /&gt;
&lt;br /&gt;
===NTS===&lt;br /&gt;
''NTS'' est un mécanisme normalisé en septembre 2020 permettant d’utiliser ''TLS'' pour assurer l'authentification cryptographique du mode client-serveur du ''NTP''.&lt;br /&gt;
&lt;br /&gt;
Génération des clés du serveur&lt;br /&gt;
 mkdir /etc/chrony/nts&lt;br /&gt;
 openssl req -x509 -nodes -days 36500 -newkey rsa:4096 -out /etc/chrony/nts/chrony.crt -keyout /etc/chrony/nts/chrony.key -subj &amp;quot;/CN=nts1.exemple.fr/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le service s'exécutant avec des privilèges restreints, il est important que l'utilisateur l'exécutant est la propriété sur les éléments générés&lt;br /&gt;
 chown _chrony:_chrony /etc/chrony/nts/chrony.*&lt;br /&gt;
&lt;br /&gt;
Il convient enfin d'ajouter les directive demandant au serveur de les utiliser dans la configuration du service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;gt;&amp;gt; /etc/chrony/chrony.conf &amp;lt;&amp;lt; _EOF_&lt;br /&gt;
&lt;br /&gt;
# Configuration du NTS&lt;br /&gt;
ntsservercert /etc/chrony/nts/chrony.crt&lt;br /&gt;
ntsserverkey /etc/chrony/nts/chrony.key&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 systemctl restart chrony.service&lt;br /&gt;
 systemctl status chrony.service&lt;br /&gt;
&lt;br /&gt;
=Client=&lt;br /&gt;
La configuration du client est très similaire à celle du serveur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Bienvenue dans le fichier de configuration de chrony. Veuillez voir la page de&lt;br /&gt;
# manuel chrony.conf(5) pour plus d'informations sur les directives utilisables.&lt;br /&gt;
&lt;br /&gt;
# Inclure les fichiers de configurations trouvés dans /etc/chrony/conf.d.&lt;br /&gt;
confdir /etc/chrony/conf.d&lt;br /&gt;
&lt;br /&gt;
# Utiliser le serveur de temps NTS définit dans la section &amp;quot;serveur&amp;quot;.&lt;br /&gt;
# Pour un NTP normal, il faut enlever le paramètre &amp;quot;NTS&amp;quot;.&lt;br /&gt;
# Pour un NTP authentifié, faut utiliser le paramètre &amp;quot;key &amp;lt;id_clé&amp;gt;&amp;quot;&lt;br /&gt;
server nts1.exemple.fr iburst nts&lt;br /&gt;
&lt;br /&gt;
# Utiliser les serveurs de temps fournis par les baux DHCP.&lt;br /&gt;
# sourcedir /run/chrony-dhcp&lt;br /&gt;
&lt;br /&gt;
# Utiliser les serveurs NTP trouvés dans /etc/chrony/sources.d.&lt;br /&gt;
sourcedir /etc/chrony/sources.d&lt;br /&gt;
&lt;br /&gt;
# Cette directive spécifie la localisation du fichier contenant le couple ID/clé&lt;br /&gt;
# pour l'authentification NTP.&lt;br /&gt;
keyfile /etc/chrony/chrony.keys&lt;br /&gt;
&lt;br /&gt;
# Cette directive spécifie le fichier dans lequel chrony va stocker les&lt;br /&gt;
# informations de ratios.&lt;br /&gt;
driftfile /var/lib/chrony/chrony.drift&lt;br /&gt;
&lt;br /&gt;
# Sauvegarder les les clés et cookies du protocole NTS dans /var/lib/chrony.&lt;br /&gt;
ntsdumpdir /var/lib/chrony&lt;br /&gt;
&lt;br /&gt;
# Dé-commenter la ligne suivant pour activer la journalisation.&lt;br /&gt;
#log tracking measurements statistics&lt;br /&gt;
&lt;br /&gt;
# Localisation des fichiers de journaux&lt;br /&gt;
logdir /var/log/chrony&lt;br /&gt;
&lt;br /&gt;
# Arrêter de considérer la source RTC matériel comme fiable au bout du seuil définit.&lt;br /&gt;
maxupdateskew 100.0&lt;br /&gt;
&lt;br /&gt;
# Cette directive active la synchronisation RTC du noyau (toute les 11 minutes).&lt;br /&gt;
# Notez l'incompatibilité de cette option avec la directive 'rtcfile'.&lt;br /&gt;
rtcsync&lt;br /&gt;
&lt;br /&gt;
# Ajuster d'une traite l'horloge au lieu de modifier la vitesse du temps pour&lt;br /&gt;
# ajuster le décalage lorsque celui-ci est supérieur à 1 seconde mais&lt;br /&gt;
# seulement pour les 3 premières synchronisations.&lt;br /&gt;
makestep 1 3&lt;br /&gt;
&lt;br /&gt;
# Obtenir le décalage TAI-UTC et les secondes intercalaires à partir de la&lt;br /&gt;
# base de données tz du système. Cette directive doit être commentée lors de&lt;br /&gt;
# l'utilisation de sources de temps qui utilisent des secondes intercalaires.&lt;br /&gt;
leapsectz right/UTC&lt;br /&gt;
&lt;br /&gt;
# Désactiver l'usage de chronyc via IP (port par défaut : UDP/323)&lt;br /&gt;
cmdport 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour le ''NTS'', dans le cas où votre certificat est auto-généré, il faudra l'ajouter dans la base interne des clients. La méthode sous ''Debian'' est désormais la [https://www.baeldung.com/linux/ca-certificate-management suivante] (sur le client) :&lt;br /&gt;
 cp chrony.crt /usr/local/share/ca-certificates/&lt;br /&gt;
 update-ca-certificates -v&lt;br /&gt;
&lt;br /&gt;
Redémarrer le service&lt;br /&gt;
 systemctl restart chrony.service&lt;br /&gt;
&lt;br /&gt;
Afficher le statut du service pour voir d’éventuelle erreur&lt;br /&gt;
 systemctl status chrony.service&lt;br /&gt;
&lt;br /&gt;
Afficher les sources NTP&lt;br /&gt;
 chronyc sourcestats&lt;br /&gt;
&lt;br /&gt;
Afficher l'état de la session NTS&lt;br /&gt;
 chronyc authdata&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* Pages de manuelles https://chrony-project.org/documentation.html :&lt;br /&gt;
** https://chrony-project.org/doc/4.4/chrony.conf.html&lt;br /&gt;
** https://chrony-project.org/doc/4.4/chronyd.html&lt;br /&gt;
** https://chrony-project.org/doc/4.4/chronyc.html&lt;br /&gt;
* https://ubuntu.com/server/docs/how-to-serve-the-network-time-protocol-with-chrony&lt;br /&gt;
* https://mpolinowski.github.io/docs/DevOps/Linux/2022-09-29--build-an-chrony-nts-client-from-source/2022-09-29/&lt;br /&gt;
* https://access.redhat.com/documentation/fr-fr/red_hat_enterprise_linux/9/html/configuring_basic_system_settings/using-chrony-to-configure-ntp_configuring-basic-system-settings&lt;br /&gt;
* https://www.it-connect.fr/ntp-la-synchronisation-temporelle-avec-chrony/#V_Securisation_de_chrony&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Chrony&amp;diff=1520</id>
		<title>Chrony</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Chrony&amp;diff=1520"/>
		<updated>2024-04-21T22:31:31Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Écriture d'une première ébauche à compléter plus tard car il est tard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Service_temps]]&lt;br /&gt;
&lt;br /&gt;
{{chantier}}&lt;br /&gt;
&lt;br /&gt;
[https://chrony-project.org Chrony] est, comme sont homologue [[Ntp - linux|éponyme]], une implémentation libre du protocole [https://fr.wikipedia.org/wiki/Network_Time_Protocol NTP] (Network Time Protocol). Il peut synchroniser l'horloge système avec d'autres serveurs ''NTP'', des horloges de référence matériel comme des récepteurs GPS ainsi que manuellement. L'outil embarque un client permettant la synchronisation avec des sources externes ainsi qu'un serveur pouvant accepter les requêtes de temps de clients autorisés.&lt;br /&gt;
&lt;br /&gt;
''Chrony'' supporte, depuis la version 4.0, le protocole [https://datatracker.ietf.org/doc/rfc8915/ NTS] (Network Time Security) permettant d'authentifier les serveurs via une couche de sécurité [https://fr.wikipedia.org/wiki/Transport_Layer_Security TLS] (Transport Layer Security).&lt;br /&gt;
&lt;br /&gt;
{{info|La présente documentation est réalisée sous ''GNU/Linux Debian 12'' et ''chrony 4.3-2''.}}&lt;br /&gt;
&lt;br /&gt;
=Serveur=&lt;br /&gt;
==Installation==&lt;br /&gt;
Installation du service&lt;br /&gt;
 apt install --no-install-recommends chrony&lt;br /&gt;
&lt;br /&gt;
==Configuration de base==&lt;br /&gt;
L'outil se base sur un unique fichier &amp;lt;code&amp;gt;/etc/chrony/chrony.conf&amp;lt;/code&amp;gt; (changeable via un &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt;) pouvant être atomisé dans &amp;lt;code&amp;gt;/etc/chrony/conf.d/&amp;lt;/code&amp;gt;. Les directives des serveurs peuvent quand à elle (et elles seules) être atomisées dans &amp;lt;code&amp;gt;/etc/chrony/sources.d/&amp;lt;/code&amp;gt;. Il n'est cependant généralement intéressant d'utiliser cette atomicité que dans des configurations complexes.&lt;br /&gt;
&lt;br /&gt;
Voici le contenu de ce fichier pour une configuration simple en mode serveur pour deux réseaux clients&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Bienvenu dans le fichier de configuration de chrony. Veuillez voir la page de&lt;br /&gt;
# manuel chrony.conf(5) pour plus d'informations sur les directives utilisables.&lt;br /&gt;
&lt;br /&gt;
# Inclure les fichiers de configurations trouvés dans /etc/chrony/conf.d.&lt;br /&gt;
confdir /etc/chrony/conf.d&lt;br /&gt;
&lt;br /&gt;
# Utiliser les serveurs de temps de Debian.&lt;br /&gt;
# Use Debian vendor zone.&lt;br /&gt;
pool 2.debian.pool.ntp.org iburst&lt;br /&gt;
&lt;br /&gt;
# Utiliser les serveurs de temps fournis par les baux DHCP.&lt;br /&gt;
# sourcedir /run/chrony-dhcp&lt;br /&gt;
&lt;br /&gt;
# Utiliser les serveurs NTP trouvés dans /etc/chrony/sources.d.&lt;br /&gt;
sourcedir /etc/chrony/sources.d&lt;br /&gt;
&lt;br /&gt;
# Cette directive spécifie la localisation du fichier contenant le couple ID/clé&lt;br /&gt;
# pour l'authentification NTP.&lt;br /&gt;
keyfile /etc/chrony/chrony.keys&lt;br /&gt;
&lt;br /&gt;
# Cette directive spécifie le fichier dans lequel chrony va stocker les&lt;br /&gt;
# informations de ratios.&lt;br /&gt;
driftfile /var/lib/chrony/chrony.drift&lt;br /&gt;
&lt;br /&gt;
# Sauvegarder les les clés et cookies du protocole NTS dans /var/lib/chrony.&lt;br /&gt;
ntsdumpdir /var/lib/chrony&lt;br /&gt;
&lt;br /&gt;
# Dé-commenter la ligne suivant pour activer la journalisation.&lt;br /&gt;
#log tracking measurements statistics&lt;br /&gt;
&lt;br /&gt;
# Localisation des fichiers de journaux&lt;br /&gt;
logdir /var/log/chrony&lt;br /&gt;
&lt;br /&gt;
# Arrêter de considérer la source RTC matériel comme fiable au bout du seuil définit.&lt;br /&gt;
maxupdateskew 100.0&lt;br /&gt;
&lt;br /&gt;
# Cette directive active la synchronisation RTC du noyau (toute les 11 minutes).&lt;br /&gt;
# Notez l'incompatibilité de cette option avec la directive 'rtcfile'.&lt;br /&gt;
rtcsync&lt;br /&gt;
&lt;br /&gt;
# Ajuster d'une traite l'horloge au lieu de modifier la vitesse du temps pour&lt;br /&gt;
# ajuster le décalage lorsque celui-ci est supérieur à 1 seconde mais&lt;br /&gt;
# seulement pour les 3 premières synchronisations.&lt;br /&gt;
makestep 1 3&lt;br /&gt;
&lt;br /&gt;
# Obtenir le décalage TAI-UTC et les secondes intercalaires à partir de la&lt;br /&gt;
# base de données tz du système. Cette directive doit être commentée lors de&lt;br /&gt;
# l'utilisation de sources de temps qui utilisent des secondes intercalaires.&lt;br /&gt;
leapsectz right/UTC&lt;br /&gt;
&lt;br /&gt;
# Désactiver l'usage de chronyc via IP (port par défaut : UDP/323)&lt;br /&gt;
cmdport 0&lt;br /&gt;
&lt;br /&gt;
# Autoriser les clients NTP des réseaux suivants à se synchroniser au serveur&lt;br /&gt;
allow 192.168.1.0/24&lt;br /&gt;
allow 10.0.2.0/23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les directives &amp;lt;code&amp;gt;allow&amp;lt;/code&amp;gt; sont responsables du comportement en mode serveur de ''Chrony''. En l'absence de paramètre, tous les clients sont autorisés à requêter le serveur (''NTP'' publique'').&lt;br /&gt;
&lt;br /&gt;
==Authentification==&lt;br /&gt;
Deux modes d'authentification sont pris en charge :&lt;br /&gt;
* authentification ''NTP''&lt;br /&gt;
* NTS&lt;br /&gt;
&lt;br /&gt;
===Authentification NTP===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NTS===&lt;br /&gt;
''NTS'' est un mécanisme normalisé en septembre 2020 ([https://www.rfc-editor.org/info/rfc8915 RFC 8915]) permettant d’utiliser ''TLS'' pour assurer l'authentification cryptographique du mode client-serveur du ''NTP''.&lt;br /&gt;
&lt;br /&gt;
Génération des clés du serveur&lt;br /&gt;
 mkdir /etc/chrony/nts&lt;br /&gt;
 openssl req -x509 -nodes -days 5000 -newkey rsa:4096 -out /etc/chrony/nts/chrony.crt -keyout /etc/chrony/nts/chrony.key -subj &amp;quot;/CN=nts1.exemple.fr/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Le service s'exécutant avec des privilèges restreints, il est important que l'utilisateur l'exécutant est la propriété sur les éléments générés&lt;br /&gt;
 chown _chrony:_chrony /etc/chrony/nts/chrony.*&lt;br /&gt;
&lt;br /&gt;
Il convient enfin d'ajouter les directive demandant au serveur de les utiliser dans la configuration du service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;gt; /etc/chrony/chrony.conf &amp;lt;&amp;lt; _EOF_&lt;br /&gt;
&lt;br /&gt;
# Configuration du NTS&lt;br /&gt;
ntsservercert /etc/chrony/nts/chrony.crt&lt;br /&gt;
ntsserverkey /etc/chrony/nts/chrony.key&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Client=&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* Pages de manuelles https://chrony-project.org/documentation.html :&lt;br /&gt;
** https://chrony-project.org/doc/4.4/chrony.conf.html&lt;br /&gt;
** https://chrony-project.org/doc/4.4/chronyd.html&lt;br /&gt;
** https://chrony-project.org/doc/4.4/chronyc.html&lt;br /&gt;
* https://ubuntu.com/server/docs/how-to-serve-the-network-time-protocol-with-chrony&lt;br /&gt;
* https://mpolinowski.github.io/docs/DevOps/Linux/2022-09-29--build-an-chrony-nts-client-from-source/2022-09-29/&lt;br /&gt;
* https://access.redhat.com/documentation/fr-fr/red_hat_enterprise_linux/9/html/configuring_basic_system_settings/using-chrony-to-configure-ntp_configuring-basic-system-settings&lt;br /&gt;
* https://www.it-connect.fr/ntp-la-synchronisation-temporelle-avec-chrony/#V_Securisation_de_chrony&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Cryptsetup&amp;diff=1519</id>
		<title>Cryptsetup</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Cryptsetup&amp;diff=1519"/>
		<updated>2024-04-19T23:54:25Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Bitlocker */ Menues corrections de syntaxe et ajout d'un nom type pour le fichier de récupération&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:chiffrement]]&lt;br /&gt;
[[Category:périphériques bloc]]&lt;br /&gt;
''Cryptsetup'' est l'implémentation du standard ''LUKS'' sur la plupart des distributions ''Linux''. Il permet de chiffrer des périphériques de type bloc. Dans les distributions ''Debian'', il est fournit par le paquet &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Mise en œuvre=&lt;br /&gt;
Voici un exemple de mise en œuvre de ''cryptsetup'' décrivant la création, le montage et le démontage d'un volume chiffré.&lt;br /&gt;
&lt;br /&gt;
{{astuce|Il est possible de réaliser un test de performance des différents algorithmes supportés via la commande &amp;lt;code&amp;gt;cryptsetup benchmark&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
Chiffrement du disque ''sdc'' dans son intégralité (écrase tout dessus). Taper '''YES''' (en majuscule) et entrer le mot de passe de déchiffrement 2 fois&lt;br /&gt;
 cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512 /dev/sdc&lt;br /&gt;
&lt;br /&gt;
Ouvrir le volume (ça fait un volume &amp;quot;montable&amp;quot; dans ''/dev/mapper/sdc_crypt'')&lt;br /&gt;
 cryptsetup luksOpen /dev/sdc sdc_crypt&lt;br /&gt;
&lt;br /&gt;
Créer le système de fichier&lt;br /&gt;
 mkfs.ext4 /dev/mapper/sdc_crypt&lt;br /&gt;
&lt;br /&gt;
Monter le volume&lt;br /&gt;
 mount /dev/mapper/sdc_crypt /mnt&lt;br /&gt;
&lt;br /&gt;
Démonter le volume&lt;br /&gt;
 umount /mnt&lt;br /&gt;
&lt;br /&gt;
Fermer le volume&lt;br /&gt;
 cryptsetup luksClose sdc_crypt&lt;br /&gt;
&lt;br /&gt;
Afficher les détails du volume (type de chiffrement notamment)&lt;br /&gt;
 cryptsetup luksDump /dev/sdc&lt;br /&gt;
&lt;br /&gt;
=Gestion des clef=&lt;br /&gt;
''Cryptsetup'' n'utilise pas réellement le mot de passe que vous avez fourni pour chiffrer le volume. Il génère lui même une clé qu'il va chiffrer avec l'un des moyens que vous lui fournissez (mot de passe ou fichier de clef). Ceci permet de pouvoir non seulement changer de mot de passe sans re-chiffrer tout le volume (seul la clef maitraisse l'est), mais également d'en avoir plusieurs.&lt;br /&gt;
&lt;br /&gt;
==Changement de clef==&lt;br /&gt;
 cryptsetup luksChangeKey /dev/sdc&lt;br /&gt;
&lt;br /&gt;
Si vous avez plusieurs clefs d'enregistrées, vous pouvez sélectionner le crénau contenant celle à changer en ajoutant le paramètre suivant&lt;br /&gt;
 cryptsetup luksChangeKey /dev/sdc -S 2&lt;br /&gt;
&lt;br /&gt;
Les créneaux sont visualisables avec la commande&lt;br /&gt;
 cryptsetup luksDump /dev/sdc&lt;br /&gt;
&lt;br /&gt;
==Ajout d'une clef==&lt;br /&gt;
 cryptsetup luksAddKey /dev/sdc&lt;br /&gt;
&lt;br /&gt;
==Suppression d'une clef==&lt;br /&gt;
 cryptsetup luksRemoveKey /dev/sdc&lt;br /&gt;
&lt;br /&gt;
==Tester une clef==&lt;br /&gt;
Lorsqu'un volume est en cours d'utilisation, il peut arriver que vous soyez dans le doute concernant la clé utilisée pour le dé-chiffrer. Afin de la tester sans fermer le volume (et donc d'être dans l'incapacité de récupérer les données si vous avez perdu la clef), il est possible de copier la partie ''Luks'' dans un fichier et d'effectuer les tests dessus.&lt;br /&gt;
&lt;br /&gt;
 head -c 128M /dev/sda2 &amp;gt; /tmp/sda2.img&lt;br /&gt;
 cryptsetup luksOpen /tmp/sda2.img testClef&lt;br /&gt;
&lt;br /&gt;
Il est également possible d'utiliser un fichier de clef si vous en avez [[#Déchiffrement_automatique|ajouté-un]] dans votre volume&lt;br /&gt;
 cryptsetup luksOpen /tmp/sda2.img testClef --key-file /root/fichier_clef.luks&lt;br /&gt;
&lt;br /&gt;
Si le volume se déverrouille c'est que vous avez renseigné la bonne clef. Vous pouvez le fermer&lt;br /&gt;
 cryptsetup luksClose testClef&lt;br /&gt;
&lt;br /&gt;
{{astuce|Vous pouvez afficher les algorithmes utilisés pour un volume avec la commande &amp;lt;code&amp;gt;file -sL /tmp/sda2.img&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://www.maketecheasier.com/change-luks-encryption-passphrase/&lt;br /&gt;
* https://unix.stackexchange.com/questions/590849/how-can-i-verify-a-luks-master-key&lt;br /&gt;
* https://www.cyberciti.biz/hardware/cryptsetup-add-enable-luks-disk-encryption-keyfile-linux/&lt;br /&gt;
&lt;br /&gt;
=Fichier crypttab=&lt;br /&gt;
Le fichier &amp;lt;code&amp;gt;/etc/crypttab&amp;lt;/code&amp;gt; est aux volumes chiffrés ce qu'est son homologue [[fstab]] aux systèmes de fichiers (il en partage d'ailleurs les mêmes [[fstab#Options de montages|options]]). Il est lu au démarrage par ''Cryptsetup'' afin de déchiffrer les volumes qui y sont renseignés (un par ligne). Si une phrase de passe est demandée, l'utilisateur sera invité à la rentrée, si c'est une clef sous [[#Déchiffrement automatique|forme de fichier]], celui-ci sera exploité depuis l'emplacement précisé dans la ligne.&lt;br /&gt;
&lt;br /&gt;
Une entrée ''crypttab'' comporte 4 champs :&lt;br /&gt;
 &amp;lt;nom_du_volume&amp;gt; &amp;lt;périphérique_bloc&amp;gt; &amp;lt;fichier_de_clef&amp;gt; &amp;lt;options&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explications :&lt;br /&gt;
* '''&amp;lt;nom_du_volume&amp;gt;''' : correspond au nom qui sera donnée au volume une fois déchiffré et qui sera disponible dans &amp;lt;code&amp;gt;/dev/mapper/&amp;lt;nom_du_volume&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''&amp;lt;périphérique_bloc&amp;gt;''' : chemin ou ''UUID'' du périphérique à déchiffrer (même syntaxe que pour ''fstab'')&lt;br /&gt;
* '''&amp;lt;fichier_de_clef&amp;gt;''' : chemin du fichier de clef. Mettre '''none''' si une identification par mot de passe est préférée&lt;br /&gt;
* '''&amp;lt;options&amp;gt;''' : prends le paramètre obligatoire '''luks''' suivit de divers options facultatives identiques au ''fstab''&lt;br /&gt;
&lt;br /&gt;
=Déchiffrement automatique=&lt;br /&gt;
Si vous avez plusieurs volumes chiffrés, il est possible d'utiliser des fichiers de clef présent sur le premier pour déchiffrer les autres. Nous allons partir du principe que mon premier disque de démarrage (chiffré) est ''vda'' et que le second est ''vdb''.&lt;br /&gt;
&lt;br /&gt;
Création du répertoire de travail&lt;br /&gt;
 mkdir /root/luks&lt;br /&gt;
&lt;br /&gt;
Création du fichier de clé&lt;br /&gt;
 dd if=/dev/urandom of=/root/luks/fichier_clef.luks bs=4096 count=1&lt;br /&gt;
&lt;br /&gt;
Attribution des droits&lt;br /&gt;
 chmod 500 luks/&lt;br /&gt;
 chmod 400 luks/fichier_clef&lt;br /&gt;
&lt;br /&gt;
Un volume ''LUKS'' peut gérer plusieurs ''mots de passes/clefs'', nous allons donc ajouter celle que nous avons créé à notre deuxième disque&lt;br /&gt;
 cryptsetup luksAddKey /dev/vdb /root/luks/fichier_clef.luks&lt;br /&gt;
&lt;br /&gt;
Récupération de l{{'}}''UUID'' de ''vdb''&lt;br /&gt;
 export UUID_LUKS=$(blkid -s UUID -o value /dev/vdb)&lt;br /&gt;
&lt;br /&gt;
Ajout d'une entrée dans le fichier de déchiffrement&lt;br /&gt;
 echo &amp;quot;vbd_luks UUID=${UUID_LUKS} /root/luks/fichier_clef.luks luks,discard&amp;quot; &amp;gt;&amp;gt; /etc/crypttab&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;discard&amp;lt;/code&amp;gt; permet d'autoriser les commandes ''TRIM'' pour les ''SSD''. Cela n'a pas de sens si vous utilisez des disques durs. Si votre disque est amovible (et donc potentiellement absent lors du démarrage), il peut être judicieux d'ajouter l'option &amp;lt;code&amp;gt;nofail&amp;lt;/code&amp;gt; qui permettra au système de ne pas se bloquer s'il ne trouve pas le périphérique. La commande &amp;lt;code&amp;gt;cryptdisks_start &amp;lt;nom_du_volume&amp;gt;&amp;lt;/code&amp;gt; devra alors être utilisée pour déchiffrer le volume.&lt;br /&gt;
&lt;br /&gt;
{{info|Le fichier &amp;lt;code&amp;gt;/etc/crypttab&amp;lt;/code&amp;gt; va initier un déchiffrement des volumes qui y sont indiqués au démarrage. Si le volume demande un mot de passe, un prompt sera proposé à l'utilisateur (c'est ce que fait la première ligne du fichier pour votre disque principal). Si la méthode d'accès est un fichier de clef, ''Cryptsetup'' va le soumettre au volume et si il correspond à celui de sa bibliothèque, il le déchiffre.}}&lt;br /&gt;
&lt;br /&gt;
À ce stade, le volume se déchiffrera automatiquement au démarrage. Vous pouvez utiliser la [https://serverfault.com/questions/714605/can-cryptsetup-read-mappings-from-etc-crypttab commande] &amp;lt;code&amp;gt;cryptdisks_start vbd_luks&amp;lt;/code&amp;gt; pour parcourir la ligne du fichier ''crypttab'' et en appliquer les directives (c'est ce que fait ''init'' au démarrage) afin de tester votre configuration immédiatement.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’enchaîner avec un [[fstab|montage automatique]] du système de fichier via le &amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Déchiffrer manuellement le volume ''LUKS''&lt;br /&gt;
 cryptsetup luksOpen /dev/vdb vbd_luks&lt;br /&gt;
&lt;br /&gt;
Formater la partition&lt;br /&gt;
 mkfs.btrfs -n 32K /dev/mapper/vbd_luks&lt;br /&gt;
&lt;br /&gt;
Ajouter une une entrée dans le ''fstab''&lt;br /&gt;
 echo &amp;quot;/dev/mapper/vbd_luks /mnt btrfs rw,relatime,space_cache,subvolid=5,subvol=/ 0 0&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
&lt;br /&gt;
Au redémarrage, le volume sera automatiquement déchiffré et monté dans &amp;lt;code&amp;gt;/mnt/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://www.howtoforge.com/automatically-unlock-luks-encrypted-drives-with-a-keyfile&lt;br /&gt;
&lt;br /&gt;
=Bitlocker=&lt;br /&gt;
''Cryptsetup'' est compatible avec le chiffrement des disques sur les systèmes ''Microsoft Windows'' nommé [https://support.microsoft.com/fr-fr/windows/chiffrement-d-appareils-dans-windows-ad5dcf4b-dbe0-2331-228f-7925c2a3012d Bitlocker].&lt;br /&gt;
&lt;br /&gt;
Lors de la création d'un tel volume sous ''Windows'', aucune clé de chiffrement n'est demandée à l'utilisateur car le système en génère une et la stock dans le ''TPM'' de l'ordinateur (j'imagine qu'une clé est demandée uniquement si ce composant matériel est absent). Un secret de récupération est alors fourni sous forme de fichier texte (&amp;lt;code&amp;gt;Clé de récupération BitLocker XXXXXXXX-....txt&amp;lt;/code&amp;gt;. Il est très important de garder la clé qu'il contient car c'est cette dernière qui permettra de déverrouiller le disque chiffré via un autre système d'exploitation (&amp;lt;code&amp;gt;/dev/nvme0n1p3&amp;lt;/code&amp;gt; et ''Debian 11'' dans l'exemple suivant).&lt;br /&gt;
&lt;br /&gt;
L'intérêt d'une telle manipulation est évident : être capable de récupérer les données du disque système si ''Windows'' refuse de démarrer.&lt;br /&gt;
&lt;br /&gt;
Déchiffrer le disque&lt;br /&gt;
 cryptsetup open --type=bitlk /dev/nvme0n1p3 disque_windows&lt;br /&gt;
&lt;br /&gt;
Monter le disque&lt;br /&gt;
 mount -o ro /dev/mapper/disque_windows /mnt&lt;br /&gt;
&lt;br /&gt;
Les commandes de démontage de re-verrouillage du disque sont identiques à ce qui a déjà été traité.&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://superuser.com/questions/376533/how-to-access-a-bitlocker-encrypted-drive-in-linux&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Cryptsetup&amp;diff=1518</id>
		<title>Cryptsetup</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Cryptsetup&amp;diff=1518"/>
		<updated>2024-04-19T22:45:22Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout de la section &amp;quot;Bitlocker&amp;quot; + remplacement des balise &amp;quot;source&amp;quot; obsolètes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:chiffrement]]&lt;br /&gt;
[[Category:périphériques bloc]]&lt;br /&gt;
''Cryptsetup'' est l'implémentation du standard ''LUKS'' sur la plupart des distributions ''Linux''. Il permet de chiffrer des périphériques de type bloc. Dans les distributions ''Debian'', il est fournit par le paquet &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Mise en œuvre=&lt;br /&gt;
Voici un exemple de mise en œuvre de ''cryptsetup'' décrivant la création, le montage et le démontage d'un volume chiffré.&lt;br /&gt;
&lt;br /&gt;
{{astuce|Il est possible de réaliser un test de performance des différents algorithmes supportés via la commande &amp;lt;code&amp;gt;cryptsetup benchmark&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
Chiffrement du disque ''sdc'' dans son intégralité (écrase tout dessus). Taper '''YES''' (en majuscule) et entrer le mot de passe de déchiffrement 2 fois&lt;br /&gt;
 cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512 /dev/sdc&lt;br /&gt;
&lt;br /&gt;
Ouvrir le volume (ça fait un volume &amp;quot;montable&amp;quot; dans ''/dev/mapper/sdc_crypt'')&lt;br /&gt;
 cryptsetup luksOpen /dev/sdc sdc_crypt&lt;br /&gt;
&lt;br /&gt;
Créer le système de fichier&lt;br /&gt;
 mkfs.ext4 /dev/mapper/sdc_crypt&lt;br /&gt;
&lt;br /&gt;
Monter le volume&lt;br /&gt;
 mount /dev/mapper/sdc_crypt /mnt&lt;br /&gt;
&lt;br /&gt;
Démonter le volume&lt;br /&gt;
 umount /mnt&lt;br /&gt;
&lt;br /&gt;
Fermer le volume&lt;br /&gt;
 cryptsetup luksClose sdc_crypt&lt;br /&gt;
&lt;br /&gt;
Afficher les détails du volume (type de chiffrement notamment)&lt;br /&gt;
 cryptsetup luksDump /dev/sdc&lt;br /&gt;
&lt;br /&gt;
=Gestion des clef=&lt;br /&gt;
''Cryptsetup'' n'utilise pas réellement le mot de passe que vous avez fourni pour chiffrer le volume. Il génère lui même une clé qu'il va chiffrer avec l'un des moyens que vous lui fournissez (mot de passe ou fichier de clef). Ceci permet de pouvoir non seulement changer de mot de passe sans re-chiffrer tout le volume (seul la clef maitraisse l'est), mais également d'en avoir plusieurs.&lt;br /&gt;
&lt;br /&gt;
==Changement de clef==&lt;br /&gt;
 cryptsetup luksChangeKey /dev/sdc&lt;br /&gt;
&lt;br /&gt;
Si vous avez plusieurs clefs d'enregistrées, vous pouvez sélectionner le crénau contenant celle à changer en ajoutant le paramètre suivant&lt;br /&gt;
 cryptsetup luksChangeKey /dev/sdc -S 2&lt;br /&gt;
&lt;br /&gt;
Les créneaux sont visualisables avec la commande&lt;br /&gt;
 cryptsetup luksDump /dev/sdc&lt;br /&gt;
&lt;br /&gt;
==Ajout d'une clef==&lt;br /&gt;
 cryptsetup luksAddKey /dev/sdc&lt;br /&gt;
&lt;br /&gt;
==Suppression d'une clef==&lt;br /&gt;
 cryptsetup luksRemoveKey /dev/sdc&lt;br /&gt;
&lt;br /&gt;
==Tester une clef==&lt;br /&gt;
Lorsqu'un volume est en cours d'utilisation, il peut arriver que vous soyez dans le doute concernant la clé utilisée pour le dé-chiffrer. Afin de la tester sans fermer le volume (et donc d'être dans l'incapacité de récupérer les données si vous avez perdu la clef), il est possible de copier la partie ''Luks'' dans un fichier et d'effectuer les tests dessus.&lt;br /&gt;
&lt;br /&gt;
 head -c 128M /dev/sda2 &amp;gt; /tmp/sda2.img&lt;br /&gt;
 cryptsetup luksOpen /tmp/sda2.img testClef&lt;br /&gt;
&lt;br /&gt;
Il est également possible d'utiliser un fichier de clef si vous en avez [[#Déchiffrement_automatique|ajouté-un]] dans votre volume&lt;br /&gt;
 cryptsetup luksOpen /tmp/sda2.img testClef --key-file /root/fichier_clef.luks&lt;br /&gt;
&lt;br /&gt;
Si le volume se déverrouille c'est que vous avez renseigné la bonne clef. Vous pouvez le fermer&lt;br /&gt;
 cryptsetup luksClose testClef&lt;br /&gt;
&lt;br /&gt;
{{astuce|Vous pouvez afficher les algorithmes utilisés pour un volume avec la commande &amp;lt;code&amp;gt;file -sL /tmp/sda2.img&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://www.maketecheasier.com/change-luks-encryption-passphrase/&lt;br /&gt;
* https://unix.stackexchange.com/questions/590849/how-can-i-verify-a-luks-master-key&lt;br /&gt;
* https://www.cyberciti.biz/hardware/cryptsetup-add-enable-luks-disk-encryption-keyfile-linux/&lt;br /&gt;
&lt;br /&gt;
=Fichier crypttab=&lt;br /&gt;
Le fichier &amp;lt;code&amp;gt;/etc/crypttab&amp;lt;/code&amp;gt; est aux volumes chiffrés ce qu'est son homologue [[fstab]] aux systèmes de fichiers (il en partage d'ailleurs les mêmes [[fstab#Options de montages|options]]). Il est lu au démarrage par ''Cryptsetup'' afin de déchiffrer les volumes qui y sont renseignés (un par ligne). Si une phrase de passe est demandée, l'utilisateur sera invité à la rentrée, si c'est une clef sous [[#Déchiffrement automatique|forme de fichier]], celui-ci sera exploité depuis l'emplacement précisé dans la ligne.&lt;br /&gt;
&lt;br /&gt;
Une entrée ''crypttab'' comporte 4 champs :&lt;br /&gt;
 &amp;lt;nom_du_volume&amp;gt; &amp;lt;périphérique_bloc&amp;gt; &amp;lt;fichier_de_clef&amp;gt; &amp;lt;options&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explications :&lt;br /&gt;
* '''&amp;lt;nom_du_volume&amp;gt;''' : correspond au nom qui sera donnée au volume une fois déchiffré et qui sera disponible dans &amp;lt;code&amp;gt;/dev/mapper/&amp;lt;nom_du_volume&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''&amp;lt;périphérique_bloc&amp;gt;''' : chemin ou ''UUID'' du périphérique à déchiffrer (même syntaxe que pour ''fstab'')&lt;br /&gt;
* '''&amp;lt;fichier_de_clef&amp;gt;''' : chemin du fichier de clef. Mettre '''none''' si une identification par mot de passe est préférée&lt;br /&gt;
* '''&amp;lt;options&amp;gt;''' : prends le paramètre obligatoire '''luks''' suivit de divers options facultatives identiques au ''fstab''&lt;br /&gt;
&lt;br /&gt;
=Déchiffrement automatique=&lt;br /&gt;
Si vous avez plusieurs volumes chiffrés, il est possible d'utiliser des fichiers de clef présent sur le premier pour déchiffrer les autres. Nous allons partir du principe que mon premier disque de démarrage (chiffré) est ''vda'' et que le second est ''vdb''.&lt;br /&gt;
&lt;br /&gt;
Création du répertoire de travail&lt;br /&gt;
 mkdir /root/luks&lt;br /&gt;
&lt;br /&gt;
Création du fichier de clé&lt;br /&gt;
 dd if=/dev/urandom of=/root/luks/fichier_clef.luks bs=4096 count=1&lt;br /&gt;
&lt;br /&gt;
Attribution des droits&lt;br /&gt;
 chmod 500 luks/&lt;br /&gt;
 chmod 400 luks/fichier_clef&lt;br /&gt;
&lt;br /&gt;
Un volume ''LUKS'' peut gérer plusieurs ''mots de passes/clefs'', nous allons donc ajouter celle que nous avons créé à notre deuxième disque&lt;br /&gt;
 cryptsetup luksAddKey /dev/vdb /root/luks/fichier_clef.luks&lt;br /&gt;
&lt;br /&gt;
Récupération de l{{'}}''UUID'' de ''vdb''&lt;br /&gt;
 export UUID_LUKS=$(blkid -s UUID -o value /dev/vdb)&lt;br /&gt;
&lt;br /&gt;
Ajout d'une entrée dans le fichier de déchiffrement&lt;br /&gt;
 echo &amp;quot;vbd_luks UUID=${UUID_LUKS} /root/luks/fichier_clef.luks luks,discard&amp;quot; &amp;gt;&amp;gt; /etc/crypttab&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;discard&amp;lt;/code&amp;gt; permet d'autoriser les commandes ''TRIM'' pour les ''SSD''. Cela n'a pas de sens si vous utilisez des disques durs. Si votre disque est amovible (et donc potentiellement absent lors du démarrage), il peut être judicieux d'ajouter l'option &amp;lt;code&amp;gt;nofail&amp;lt;/code&amp;gt; qui permettra au système de ne pas se bloquer s'il ne trouve pas le périphérique. La commande &amp;lt;code&amp;gt;cryptdisks_start &amp;lt;nom_du_volume&amp;gt;&amp;lt;/code&amp;gt; devra alors être utilisée pour déchiffrer le volume.&lt;br /&gt;
&lt;br /&gt;
{{info|Le fichier &amp;lt;code&amp;gt;/etc/crypttab&amp;lt;/code&amp;gt; va initier un déchiffrement des volumes qui y sont indiqués au démarrage. Si le volume demande un mot de passe, un prompt sera proposé à l'utilisateur (c'est ce que fait la première ligne du fichier pour votre disque principal). Si la méthode d'accès est un fichier de clef, ''Cryptsetup'' va le soumettre au volume et si il correspond à celui de sa bibliothèque, il le déchiffre.}}&lt;br /&gt;
&lt;br /&gt;
À ce stade, le volume se déchiffrera automatiquement au démarrage. Vous pouvez utiliser la [https://serverfault.com/questions/714605/can-cryptsetup-read-mappings-from-etc-crypttab commande] &amp;lt;code&amp;gt;cryptdisks_start vbd_luks&amp;lt;/code&amp;gt; pour parcourir la ligne du fichier ''crypttab'' et en appliquer les directives (c'est ce que fait ''init'' au démarrage) afin de tester votre configuration immédiatement.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’enchaîner avec un [[fstab|montage automatique]] du système de fichier via le &amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Déchiffrer manuellement le volume ''LUKS''&lt;br /&gt;
 cryptsetup luksOpen /dev/vdb vbd_luks&lt;br /&gt;
&lt;br /&gt;
Formater la partition&lt;br /&gt;
 mkfs.btrfs -n 32K /dev/mapper/vbd_luks&lt;br /&gt;
&lt;br /&gt;
Ajouter une une entrée dans le ''fstab''&lt;br /&gt;
 echo &amp;quot;/dev/mapper/vbd_luks /mnt btrfs rw,relatime,space_cache,subvolid=5,subvol=/ 0 0&amp;quot; &amp;gt;&amp;gt; /etc/fstab&lt;br /&gt;
&lt;br /&gt;
Au redémarrage, le volume sera automatiquement déchiffré et monté dans &amp;lt;code&amp;gt;/mnt/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://www.howtoforge.com/automatically-unlock-luks-encrypted-drives-with-a-keyfile&lt;br /&gt;
&lt;br /&gt;
=Bitlocker=&lt;br /&gt;
''Cryptsetup'' est compatible avec le chiffrement de disques des systèmes ''Windows'' nommé [https://support.microsoft.com/fr-fr/windows/chiffrement-d-appareils-dans-windows-ad5dcf4b-dbe0-2331-228f-7925c2a3012d Bitlocker].&lt;br /&gt;
&lt;br /&gt;
Lors de la création d'un tel volume sous ''Windows'', aucune clé de chiffrement n'est demandée à l'utilisateur car le système en génère une et la stock dans le ''TPM'' de l'ordinateur (j'imagine qu'une clé est demandée uniquement si ce composant matériel est absent). Une clé de récupération est alors fournie sous forme de fichier texte. Il est très important de garder la clé qu'il contient car c'est cette dernière qui permettra de déverrouiller le disque chiffré via un autre système d'exploitation (&amp;lt;code&amp;gt;/dev/nvme0n1p3&amp;lt;/code&amp;gt; et ''Debian 11'' dans l'exemple suivant).&lt;br /&gt;
&lt;br /&gt;
L'intérêt d'une telle manipulation est évident : être capable de récupérer les données du disque système si ''Windows'' refuse de démarrer.&lt;br /&gt;
&lt;br /&gt;
Déchiffrer le disque&lt;br /&gt;
 cryptsetup open --type=bitlk /dev/nvme0n1p3 disque_windows&lt;br /&gt;
&lt;br /&gt;
Monter le disque&lt;br /&gt;
 mount -o ro /dev/mapper/disque_windows /mnt&lt;br /&gt;
&lt;br /&gt;
Les commande de démontage de re-verrouillages du disque sont identiques à ce qui a déjà été traité.&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://superuser.com/questions/376533/how-to-access-a-bitlocker-encrypted-drive-in-linux&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Matrix_synapse&amp;diff=1517</id>
		<title>Matrix synapse</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Matrix_synapse&amp;diff=1517"/>
		<updated>2024-03-24T11:17:19Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout de la section &amp;quot;Réinitialisation de mot de passe&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Service_communication]]&lt;br /&gt;
&lt;br /&gt;
{{chantier}}&lt;br /&gt;
&lt;br /&gt;
[https://github.com/matrix-org/synapse/ Synapse] est une implémentation serveur libre (licence ''Apache 2.0'') du protocole [https://fr.wikipedia.org/wiki/Matrix_(protocole) Matrix] écrit en ''Python''. Le projet, initié en 2014, est maintenu par la fondation [https://matrix.org Matrix.org] et passe en version stable (''1.0.0'') en 2019. Il est disponible dans les dépôts ''Bullseye-Backports'' et ''Testing'' de ''Debian''.&lt;br /&gt;
&lt;br /&gt;
Il permet la communication électronique textuelle, orale et vidéo entre plusieurs interlocuteurs au travers de réseaux ''IP''. Il propose en outre la possibilité d'envoyer des fichiers et de partager les écrans des correspondants. Une attention toute particulière est porté sur la sécurité des échanges avec un système de chiffrement de bout en bout obligatoire, tant entre clients (pair à pair) que lors de transactions avec le serveur (client/serveur).&lt;br /&gt;
&lt;br /&gt;
Il est nécessaire de permettre la communication vers les ports suivants :&lt;br /&gt;
* Fédération ''Synapse'' : 8448 ''TCP''&lt;br /&gt;
* ''TURN'' : 3478 ''TCP/UDP''&lt;br /&gt;
&lt;br /&gt;
=Service Synapse=&lt;br /&gt;
==Installation==&lt;br /&gt;
Ajout des dépôts ''Backports'' pour ''Debian 11''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;deb http://ftp2.fr.debian.org/debian bullseye-backports main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list&lt;br /&gt;
apt update&lt;br /&gt;
apt install --no-install-recommends -t bullseye-backports matrix-synapse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La réponse aux questions n'a pas d'importance car les fichiers de configuration seront re-générés plus loin.&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
Le domaine utilisé pour l'exemple est le suivant&lt;br /&gt;
 export DNS_SYNAPSE=synapse.exemple.fr&lt;br /&gt;
&lt;br /&gt;
Génération des fichiers configuration et de la clé de signature&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
synapse_generate_config --server-name ${DNS_SYNAPSE} --config-dir /etc/matrix-synapse --data-dir /etc/matrix-synapse/ --report-stats no --generate-secrets -o /etc/matrix-synapse/homeserver.yaml&lt;br /&gt;
synapse_generate_log_config -o /etc/matrix-synapse/${DNS_SYNAPSE}.log.config&lt;br /&gt;
synapse_generate_signing_key -o /etc/matrix-synapse/${DNS_SYNAPSE}.signing.key&lt;br /&gt;
&lt;br /&gt;
echo 'report_stats: false' &amp;gt; /etc/matrix-synapse/conf.d/report_stats.yaml&lt;br /&gt;
echo &amp;quot;server_name: \&amp;quot;${DNS_SYNAPSE}\&amp;quot;&amp;quot; &amp;gt; /etc/matrix-synapse/conf.d/server_name.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Écouter les requêtes clientes sur toutes les adresses ''IP'' du serveur&lt;br /&gt;
 sed -i &amp;quot;s/bind_addresses: \[.*\]/bind_addresses: ['0.0.0.0']/g&amp;quot; /etc/matrix-synapse/homeserver.yaml&lt;br /&gt;
&lt;br /&gt;
Redémarrer le service&lt;br /&gt;
 systemctl restart matrix-synapse.service&lt;br /&gt;
&lt;br /&gt;
Vous devriez voir un port 8008 ''TCP'' en écoute avec un &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;ss -ltn&amp;lt;/syntaxhighlight&amp;gt;. Celui-ci permet aux outils d'administrations d'utiliser les ''API'' de ''Synapse'' pour interagir avec lui.&lt;br /&gt;
&lt;br /&gt;
==Gestion des utilisateurs==&lt;br /&gt;
Actuellement, seule la création d'un utilisateur est possible avec les outils fournis. Leur suppression ou modification (ou même leur listage) n'est pas supporté (oui c'est aberrant). Ce sujet est traité dans ce [https://github.com/matrix-org/synapse/issues/1707 ticket].&lt;br /&gt;
&lt;br /&gt;
La syntaxe d'un utilisateurs dans les différents clients ''Matrix'' est &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;@michel:synapse.exemple.fr&amp;lt;/syntaxhighlight&amp;gt;. Ceci est utile pour en ajouter comme contact depuis un logiciel client (pourquoi faire simple ?).&lt;br /&gt;
&lt;br /&gt;
===Création d'un utilisateur===&lt;br /&gt;
 synapse_register_new_matrix_user http://127.0.0.1:8008 -c /etc/matrix-synapse/homeserver.yaml&lt;br /&gt;
&lt;br /&gt;
===Source de la section===&lt;br /&gt;
* https://matrix-org.github.io/synapse/latest/setup/installation.html&lt;br /&gt;
&lt;br /&gt;
=Service TURN=&lt;br /&gt;
Dans la mesure où le vrai monde est peuplé de ''NAT'' à profusion et qu'aucun protocole de communication en temps réel ne sais gérer cette situation correctement (la raison m'échappe toujours...), il est indispensable d'employer un service mitigeant cette contrainte. Ceci est le rôle des protocoles [https://en.wikipedia.org/wiki/Traversal_Using_Relays_around_NAT TURN]/[https://en.wikipedia.org/wiki/STUN STUN] implémenté dans le logiciel [https://github.com/coturn/coturn Coturn].&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
Le paquet est disponible dans les dépôts ''Sable''&lt;br /&gt;
 apt install --no-install-recommends coturn&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
Les informations spécifiques à l'instance de cette documentations seront les suivantes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export DNS_COTURN=turn.exemple.fr&lt;br /&gt;
export SECRET_COTURN=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 64 | head -n 1)&lt;br /&gt;
export IP_EXTERNE=$(wget -qO - ifconfig.co)&lt;br /&gt;
export IP_INTERNE=192.168.0.100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fichier de configuration du service se composera comme suit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /etc/turnserver.conf&lt;br /&gt;
use-auth-secret&lt;br /&gt;
static-auth-secret=${SECRET_COTURN}&lt;br /&gt;
realm=${DNS_COTURN}&lt;br /&gt;
&lt;br /&gt;
# Le trafic VoIP est entièrement UDP. Il n'y a aucune raison de laisser les utilisateurs se connecter à des points d'extrémité TCP arbitraires via le relais&lt;br /&gt;
no-tcp-relay&lt;br /&gt;
&lt;br /&gt;
# Ne laissez pas le relais essayer de se connecter à des plages d'adresses IP privées au sein de votre réseau (s'il y en a)&lt;br /&gt;
# Étant donné que le serveur tournant est probablement derrière votre pare-feu, n'oubliez pas d'inclure également toutes les adresses IP publiques privilégiées&lt;br /&gt;
denied-peer-ip=10.0.0.0-10.255.255.255&lt;br /&gt;
denied-peer-ip=192.168.0.0-192.168.255.255&lt;br /&gt;
denied-peer-ip=172.16.0.0-172.31.255.255&lt;br /&gt;
&lt;br /&gt;
# À recommandé, blocage de pairs locaux supplémentaires, afin de limiter l'accès externe aux services internes&lt;br /&gt;
# https://www.rtcsec.com/article/slack-webrtc-turn-compromise-and-bug-bounty/#how-to-fix-an-open-turn-relay-to-address-this-vulnerability&lt;br /&gt;
no-multicast-peers&lt;br /&gt;
denied-peer-ip=0.0.0.0-0.255.255.255&lt;br /&gt;
denied-peer-ip=100.64.0.0-100.127.255.255&lt;br /&gt;
denied-peer-ip=127.0.0.0-127.255.255.255&lt;br /&gt;
denied-peer-ip=169.254.0.0-169.254.255.255&lt;br /&gt;
denied-peer-ip=192.0.0.0-192.0.0.255&lt;br /&gt;
denied-peer-ip=192.0.2.0-192.0.2.255&lt;br /&gt;
denied-peer-ip=192.88.99.0-192.88.99.255&lt;br /&gt;
denied-peer-ip=198.18.0.0-198.19.255.255&lt;br /&gt;
denied-peer-ip=198.51.100.0-198.51.100.255&lt;br /&gt;
denied-peer-ip=203.0.113.0-203.0.113.255&lt;br /&gt;
denied-peer-ip=240.0.0.0-255.255.255.255&lt;br /&gt;
&lt;br /&gt;
# Cas particulier : le serveur TURN lui-même pour que les flux client-&amp;gt;TURN-&amp;gt;TURN-&amp;gt;client fonctionnent&lt;br /&gt;
# Il doit s'agir de l'une des adresses IP d'écoute du serveur TURN&lt;br /&gt;
allowed-peer-ip=${IP_INTERNE}&lt;br /&gt;
&lt;br /&gt;
# Examinez si vous souhaitez limiter le quota de flux relayés par utilisateur (ou total) pour éviter les risques de DoS&lt;br /&gt;
user-quota=12 # 4 flux par appel vidéo, donc 12 flux = 3 appels relayés simultanés par utilisateur&lt;br /&gt;
total-quota=1200&lt;br /&gt;
&lt;br /&gt;
# Certificats TLS, y compris les certificats intermédiaires&lt;br /&gt;
# Pour les certificats Let's Encrypt, utilisez 'fullchain.pem' ici&lt;br /&gt;
cert=/srv/tls/corturn.pem&lt;br /&gt;
&lt;br /&gt;
# Fichier TLS de clé privée&lt;br /&gt;
pkey=/srv/tls/corturn.key&lt;br /&gt;
&lt;br /&gt;
# Assurez-vous que les lignes de configuration qui désactivent TLS/DTLS sont commentées ou supprimées.&lt;br /&gt;
#no-tls&lt;br /&gt;
#no-dtls&lt;br /&gt;
&lt;br /&gt;
external-ip=${IP_EXTERNE}&lt;br /&gt;
listening-ip=${IP_INTERNE}&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Support du TLS===&lt;br /&gt;
Créer le répertoire d'accueil des éléments de chiffrement&lt;br /&gt;
 mkdir /srv/tls&lt;br /&gt;
&lt;br /&gt;
Ces éléments peuvent être issus d'une autorité de certification publique comme [[Letsencrypt|Letsencrypt]] (mettre la clé et le certificat '''chaînés''') ou privée, via [[Openssl|OpenSSL]] par exemple.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
chown -R root:root /srv/tls&lt;br /&gt;
chmod 500 /srv/tls&lt;br /&gt;
chmod 400 /srv/tls/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Redémarrer le service&lt;br /&gt;
 systemctl restart coturn.service&lt;br /&gt;
&lt;br /&gt;
Le service écoute sur le port 3478 ''TCP/UDP''.&lt;br /&gt;
&lt;br /&gt;
Il est à présent possible de configurer ''Synapse'' afin qu'il informe les clients d'utiliser notre service ''TURN'' lors de l'établissement des communications pair à pair entre eux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt;&amp;gt; /etc/matrix-synapse/homeserver.yaml&lt;br /&gt;
&lt;br /&gt;
turn_uris: [ &amp;quot;turn:${DNS_COTURN}?transport=udp&amp;quot;, &amp;quot;turn:${DNS_COTURN}?transport=tcp&amp;quot; ]&lt;br /&gt;
turn_shared_secret: &amp;quot;${SECRET_COTURN}&amp;quot;&lt;br /&gt;
turn_user_lifetime: 86400000&lt;br /&gt;
turn_allow_guests: True&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 systemctl restart matrix-synapse.service&lt;br /&gt;
&lt;br /&gt;
==Enregistrement DNS==&lt;br /&gt;
Cette section est totalement facultative et n'apporte rien. Il existe peut-être une configuration de ''Synapse'' permettant de trouver automatiquement le serveur ''TURN'' via ''DNS''...&lt;br /&gt;
&lt;br /&gt;
Enregistrements ''DNS SRV'' (à ajouter dans la configuration de votre zone)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
_stun._udp 10800 IN SRV 0 5 3478 exemple.fr.&lt;br /&gt;
_turn._udp 10800 IN SRV 0 5 3478 exemple.fr.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est possible de requêter le serveur de noms sur ces champs précis via les commandes suivantes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dig +short _stun._udp._tcp 10800 IN SRV 0 5 3478 exemple.fr.&lt;br /&gt;
dig +short _turn._udp._tcp 10800 IN SRV 0 5 3478 exemple.fr.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Test de fonctionnement==&lt;br /&gt;
Voici une [https://nextcloud-talk.readthedocs.io/en/latest/TURN/#6-testing-the-turn-server méthode] permettant de tester le fonctionnement du service en ligne de commande. Elle peut aider à deceler des problèmes simplement.&lt;br /&gt;
 turnutils_uclient -p 3478 -W &amp;lt;CLÉ_SERVEUR_TURN&amp;gt; -v -y turn.exemple.fr&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://matrix-org.github.io/synapse/latest/setup/turn/coturn.html&lt;br /&gt;
&lt;br /&gt;
=Client WEB Element=&lt;br /&gt;
[https://github.com/vector-im/element-web Element] est un client WEB pour ''Matrix''. Anciennement connu sous le nom de ''Riot'', il existe aussi sous forme d'application ''IOS'' et ''Android''.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
N'étant pas dans les dépôts ''Debian'', nous utiliserons la version ''Git''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt install --no-install-recommends apache2&lt;br /&gt;
&lt;br /&gt;
wget https://github.com/vector-im/element-web/releases/download/v1.10.14/element-v1.10.14.tar.gz -P /tmp&lt;br /&gt;
&lt;br /&gt;
tar xf /tmp/element-v1.10.14.tar.gz -C /var/www/&lt;br /&gt;
ln -s /var/www/element-v1.10.14/ /var/www/element&lt;br /&gt;
chown -R www-data: /var/www/element*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
L'hôte virtuel d{{'}}''Apache'' doit pointer vers le programme&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/apache2/sites-available/element.conf&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerAdmin webmaster@localhost&lt;br /&gt;
    DocumentRoot /var/www/element&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Désactivation de l'hôte virtuel par défaut et activation du nouveau&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
a2dissite 000-default.conf&lt;br /&gt;
a2ensite element.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le domaine utilisé sera le suivant&lt;br /&gt;
 export DNS_ELEMENT=element.exemple.fr&lt;br /&gt;
&lt;br /&gt;
La configuration de notre instance sera celle-ci&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /var/www/element/config.json&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;default_server_config&amp;quot;: {&lt;br /&gt;
        &amp;quot;m.homeserver&amp;quot;: {&lt;br /&gt;
            &amp;quot;base_url&amp;quot;: &amp;quot;https://${DNS_SYNAPSE}&amp;quot;,&lt;br /&gt;
            &amp;quot;server_name&amp;quot;: &amp;quot;${DNS_SYNAPSE}&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;m.identity_server&amp;quot;: {&lt;br /&gt;
            &amp;quot;base_url&amp;quot;: &amp;quot;https://vector.im&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;disable_custom_urls&amp;quot;: false,&lt;br /&gt;
    &amp;quot;disable_guests&amp;quot;: false,&lt;br /&gt;
    &amp;quot;disable_login_language_selector&amp;quot;: false,&lt;br /&gt;
    &amp;quot;disable_3pid_login&amp;quot;: false,&lt;br /&gt;
    &amp;quot;brand&amp;quot;: &amp;quot;Element&amp;quot;,&lt;br /&gt;
    &amp;quot;bug_report_endpoint_url&amp;quot;: &amp;quot;https://element.io/bugreports/submit&amp;quot;,&lt;br /&gt;
    &amp;quot;uisi_autorageshake_app&amp;quot;: &amp;quot;element-auto-uisi&amp;quot;,&lt;br /&gt;
    &amp;quot;default_country_code&amp;quot;: &amp;quot;FR&amp;quot;,&lt;br /&gt;
    &amp;quot;show_labs_settings&amp;quot;: false,&lt;br /&gt;
    &amp;quot;features&amp;quot;: { },&lt;br /&gt;
    &amp;quot;default_federate&amp;quot;: false,&lt;br /&gt;
    &amp;quot;default_theme&amp;quot;: &amp;quot;light&amp;quot;,&lt;br /&gt;
    &amp;quot;enable_presence_by_hs_url&amp;quot;: {&lt;br /&gt;
        &amp;quot;https://matrix.org&amp;quot;: false,&lt;br /&gt;
        &amp;quot;https://matrix-client.matrix.org&amp;quot;: false&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;setting_defaults&amp;quot;: {&lt;br /&gt;
        &amp;quot;breadcrumbs&amp;quot;: true&lt;br /&gt;
    },&lt;br /&gt;
   &amp;quot;features&amp;quot;: {&lt;br /&gt;
      &amp;quot;feature_you_want_to_turn_on&amp;quot;: true,&lt;br /&gt;
      &amp;quot;feature_you_want_to_keep_off&amp;quot;: false&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Redémarrer ''Apache''&lt;br /&gt;
 systemctl restart apache2.service&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
* https://github.com/vector-im/element-web/tree/develop/docs&lt;br /&gt;
&lt;br /&gt;
=Fédération=&lt;br /&gt;
Un des atouts de cette solution est la décentralisation. En effet, il est possible d'interconnecter plusieurs serveurs afin de permettre la communication d'utilisateurs enregistrés sur des instances différentes. Ces interconnexions doivent êtres explicitement spécifiées dans la configuration de ''Synapse''.&lt;br /&gt;
&lt;br /&gt;
Le domaine du serveur distant sera le suivant&lt;br /&gt;
 export DNS_SRV_DISTANT_SYNAPSE=synapse.toto.fr&lt;br /&gt;
&lt;br /&gt;
Ajout de celui-ci dans la configuration de ''Synapse'' (ceci doit être fait des deux côtés)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sed -i &amp;quot;s/^trusted_key_servers:/trusted_key_servers:\n  - server_name: \&amp;quot;${DNS_SRV_DISTANT_SYNAPSE}\&amp;quot;/g&amp;quot; /etc/matrix-synapse/homeserver.yaml&lt;br /&gt;
sed -i &amp;quot;s/^#federation_domain_whitelist:/federation_domain_whitelist:\n  - ${DNS_SRV_DISTANT_SYNAPSE}/g&amp;quot; /etc/matrix-synapse/homeserver.yaml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 systemctl restart matrix-synapse.service&lt;br /&gt;
&lt;br /&gt;
=Cas d'une connexion mandaté=&lt;br /&gt;
Dans la mesure où il est courant qu'un serveur ne soit jamais relié directement à Internet (comprendre par la qu'il ne dispose pas d'IP publique), le cas d'un [[:Category:Reverse_proxy|mandataire inverse]] officiant entre les clients du ''WAN'' et le serveur ''Element'' du ''LAN'' est le plus probable. Ce point complique la transparence des échanges entre les machines et doit être géré au niveau de cet intermédiaire. Deux services ont étés testés en production avec succès. Leur configuration est donnée ci-après.&lt;br /&gt;
&lt;br /&gt;
==Traefik==&lt;br /&gt;
Ajout d'un point d'entrer dans Traefik pour le port 8448&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt;&amp;gt; /etc/traefik/config/vhosts/matrix.toml&lt;br /&gt;
[http]&lt;br /&gt;
  [http.routers]&lt;br /&gt;
     [http.routers.synapse]&lt;br /&gt;
      entryPoints = [&amp;quot;websecure&amp;quot;]&lt;br /&gt;
      rule = &amp;quot;Host(\`${DNS_SYNAPSE}\`)&amp;quot;&lt;br /&gt;
      service = &amp;quot;synapse&amp;quot;&lt;br /&gt;
      [http.routers.synapse.tls]&lt;br /&gt;
        certResolver = &amp;quot;myresolver&amp;quot;&lt;br /&gt;
&lt;br /&gt;
     [http.routers.element]&lt;br /&gt;
      entryPoints = [&amp;quot;websecure&amp;quot;]&lt;br /&gt;
      rule = &amp;quot;Host(\`${DNS_ELEMENT}\`)&amp;quot;&lt;br /&gt;
      service = &amp;quot;element&amp;quot;&lt;br /&gt;
      [http.routers.element.tls]&lt;br /&gt;
        certResolver = &amp;quot;myresolver&amp;quot;&lt;br /&gt;
&lt;br /&gt;
     [http.routers.synapsefed]&lt;br /&gt;
      entryPoints = [&amp;quot;synapsefed&amp;quot;]&lt;br /&gt;
      rule = &amp;quot;Host(\`${DNS_SYNAPSE}\`)&amp;quot;&lt;br /&gt;
      service = &amp;quot;synapse&amp;quot;&lt;br /&gt;
      [http.routers.synapsefed.tls]&lt;br /&gt;
        certResolver = &amp;quot;myresolver&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  [http.services]&lt;br /&gt;
    [http.services.synapse.loadBalancer]&lt;br /&gt;
      [[http.services.synapse.loadBalancer.servers]]&lt;br /&gt;
        url = &amp;quot;http://${IP_INTERNE}:8008&amp;quot;&lt;br /&gt;
    [http.services.element.loadBalancer]&lt;br /&gt;
      [[http.services.element.loadBalancer.servers]]&lt;br /&gt;
        url = &amp;quot;http://${IP_INTERNE}:80&amp;quot;&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==HAProxy==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt;&amp;gt; /etc/haproxy/haproxy.cfg&lt;br /&gt;
frontend matrix-federation&lt;br /&gt;
    bind *:8448,[::]:8448 ssl crt /etc/haproxy/tls/ alpn h2,http/1.1&lt;br /&gt;
    http-request set-header X-Forwarded-Proto https if { ssl_fc }&lt;br /&gt;
    http-request set-header X-Forwarded-Proto http if !{ ssl_fc }&lt;br /&gt;
    http-request set-header X-Forwarded-For %[src]&lt;br /&gt;
    default_backend synapse&lt;br /&gt;
&lt;br /&gt;
frontend https&lt;br /&gt;
    http-response add-header X-Frame-Options SAMEORIGIN&lt;br /&gt;
&lt;br /&gt;
    bind :443 ssl crt /etc/haproxy/tls/ alpn h2,http/1.1&lt;br /&gt;
&lt;br /&gt;
    acl host_synapse hdr(host) -i synapse.exemple.fr&lt;br /&gt;
&lt;br /&gt;
    use_backend synapse if host_synapse&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;backend synapse&lt;br /&gt;
    option forwardfor except 127.0.0.1&lt;br /&gt;
    option http-server-close&lt;br /&gt;
    server synapse 192.168.170.178:8008 check maxconn 32&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Débogage=&lt;br /&gt;
La configuration de ''Synapse'' est quelque peu imbuvable et les problèmes, difficiles à corriger. Il est possible de s'appuyer sur les journaux du service afin de cibler l'origine des disfonctionnements.&lt;br /&gt;
 tail -f /var/log/matrix-synapse/homeserver.log&lt;br /&gt;
&lt;br /&gt;
Un outil permettant de determiner les caractéristiques du serveur est disponible à l'adresse https://federationtester.matrix.org/. Il peut s'avérer d'une aide précisieuse (surtout le rapport ''Json'').&lt;br /&gt;
&lt;br /&gt;
=Réinitialisation de mot de passe=&lt;br /&gt;
Aussi étrange que cela puisse parraitre, il n'existe pas de fonction pour réinitialiser le mot de passe d'un utilisateur (incroyable) ! Les développeurs de cette solution doivent ignorer que ces derniers perdent régulièrement leur mot de passe et qu'il s'agit donc d'une fonctionnalité indispensable en production.&lt;br /&gt;
Heureusement, la structure de l'authentification étant très simple, il est triviale de réaliser cette opération [https://paritoshbh.me/blog/reset-user-password-synapse-matrix-homeserver soit-même] dans la base de données après génération d'un mot de passe haché .&lt;br /&gt;
&lt;br /&gt;
 # Génération du mot de passe haché&lt;br /&gt;
 su - matrix-synapse -s /bin/sh -c 'python3 /usr/libexec/matrix-synapse/hash_password -c /etc/matrix-synapse/homeserver.yaml'&lt;br /&gt;
 # connexion à la base de donnée de Synapse&lt;br /&gt;
 su - matrix-synapse -s /bin/sh -c 'sqlite3 /etc/matrix-synapse/homeserver.db'&lt;br /&gt;
&lt;br /&gt;
Après avoir identifié l'utilisateur dont le mot de passe doit être réinitialisé (&amp;quot;michel&amp;quot; pour l'exemple), utiliser le hachi généré pour remplacer l'ancien&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM users;&lt;br /&gt;
UPDATE users SET password_hash='$2b$12$OkrnSR1hOCj0xjb7mDnvf.OXVQ0P/EU8u4lUpMuU5YepvHXpv3sxm' WHERE name='@michel:synapse.exemple.fr';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le changement est instantané.&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Unbound&amp;diff=1516</id>
		<title>Unbound</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Unbound&amp;diff=1516"/>
		<updated>2024-03-11T18:52:45Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout d'une astuce pour autoriser un ensemble de sous-domaines dans une liste RPZ&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Service_dns]]&lt;br /&gt;
&lt;br /&gt;
[https://www.nlnetlabs.nl/projects/unbound/about/ Unbound] est un serveur ''DNS'' faisant office de résolveur récursif et pouvant faire autorité sur des domaines locaux. Il est développé par [https://www.nlnetlabs.nl/ NLnet Labs] et se veut à la fois complet en fonctionnalité, léger (grâce à la modularité de ces dernières) et simple à configurer.&lt;br /&gt;
&lt;br /&gt;
=Installation et configuration=&lt;br /&gt;
Installation du service avec une ''Debian Bullseye''&lt;br /&gt;
 apt install --no-install-recommends unbound&lt;br /&gt;
&lt;br /&gt;
Afin d'utiliser directement les serveurs racines pour la résolution récursive des requêtes clientes, il faut télécharger [https://{{SERVERNAME}}/fichiers/services/dns/root.hints la liste] contenant leurs adresses&lt;br /&gt;
 wget https://www.internic.net/domain/named.root -O /var/lib/unbound/root.hints &amp;amp;&amp;amp; chown unbound:unbound /var/lib/unbound/root.hints&lt;br /&gt;
&lt;br /&gt;
Le fichier de configuration suivant sera utilisé&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nestedtext&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /etc/unbound/unbound.conf&lt;br /&gt;
# Fichier de configuration d'Unbound pour Debian.&lt;br /&gt;
#&lt;br /&gt;
# Référez-vous à la page de manuel unbound.conf(5).&lt;br /&gt;
#&lt;br /&gt;
# Voyez /usr/share/doc/unbound/examples/unbound.conf pour un&lt;br /&gt;
# fichier de configuration de référence commenté.&lt;br /&gt;
#&lt;br /&gt;
# La ligne suivante permet d'inclure les fichiers de configuration&lt;br /&gt;
# additionnels depuis le répertoire /etc/unbound/unbound.conf.d.&lt;br /&gt;
include-toplevel: &amp;quot;/etc/unbound/unbound.conf.d/*.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
server:&lt;br /&gt;
statistics-interval: 0&lt;br /&gt;
extended-statistics: yes&lt;br /&gt;
statistics-cumulative: yes&lt;br /&gt;
verbosity: 3&lt;br /&gt;
&lt;br /&gt;
# Paramètres réseau&lt;br /&gt;
interface: 127.0.0.1&lt;br /&gt;
interface: 192.168.1.5&lt;br /&gt;
port: 53&lt;br /&gt;
do-ip4: yes&lt;br /&gt;
do-ip6: no&lt;br /&gt;
do-udp: yes&lt;br /&gt;
do-tcp: no&lt;br /&gt;
&lt;br /&gt;
# Contrôle d'accès&lt;br /&gt;
access-control: 127.0.0.0/8 allow&lt;br /&gt;
access-control: 192.168.0.0/16 allow&lt;br /&gt;
access-control: 0.0.0.0/0 refuse&lt;br /&gt;
&lt;br /&gt;
# DNSSEC&lt;br /&gt;
# auto-trust-anchor-file: &amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
harden-dnssec-stripped: yes&lt;br /&gt;
&lt;br /&gt;
# Adresses des serveurs racine&lt;br /&gt;
root-hints: &amp;quot;/var/lib/unbound/root.hints&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Paramètres système&lt;br /&gt;
hide-identity: yes&lt;br /&gt;
hide-version: yes&lt;br /&gt;
harden-glue: yes&lt;br /&gt;
use-caps-for-id: yes&lt;br /&gt;
cache-min-ttl: 3600&lt;br /&gt;
cache-max-ttl: 86400&lt;br /&gt;
prefetch: yes&lt;br /&gt;
num-threads: 6&lt;br /&gt;
msg-cache-slabs: 16&lt;br /&gt;
rrset-cache-slabs: 16&lt;br /&gt;
infra-cache-slabs: 16&lt;br /&gt;
key-cache-slabs: 16&lt;br /&gt;
rrset-cache-size: 256m&lt;br /&gt;
msg-cache-size: 128m&lt;br /&gt;
so-rcvbuf: 1m&lt;br /&gt;
unwanted-reply-threshold: 10000&lt;br /&gt;
do-not-query-localhost: yes&lt;br /&gt;
val-clean-additional: yes&lt;br /&gt;
&lt;br /&gt;
# Journalisation&lt;br /&gt;
use-syslog: no&lt;br /&gt;
logfile: /var/log/unbound.log&lt;br /&gt;
&lt;br /&gt;
# Paramètres du cache&lt;br /&gt;
cache-min-ttl: 3600&lt;br /&gt;
cache-max-ttl: 86400&lt;br /&gt;
prefetch: yes&lt;br /&gt;
prefetch-key: yes&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est possible de servir des domaines locaux (faire autorité)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nestedtext&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /etc/unbound/unbound.conf.d/ycharbi.yo.conf&lt;br /&gt;
server:&lt;br /&gt;
local-zone: &amp;quot;ycharbi.yo.&amp;quot; static&lt;br /&gt;
local-data: &amp;quot;ycharbi.yo. IN A 192.168.1.1&amp;quot;&lt;br /&gt;
local-data: &amp;quot;toto1.ycharbi.yo. IN A 192.168.1.25&amp;quot;&lt;br /&gt;
local-data: &amp;quot;ycharbi.yo. IN MX 10 toto1.ycharbi.yo.&amp;quot;&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est également possible de rediriger des requêtes clientes après modification (''DNS'' menteur aussi appelée ''Reponse Policy Zone'' ou ''RPZ'') afin d’interdire l'accès à certains domaines. J'utilise cette fonctionnalité à deux fins :&lt;br /&gt;
* Servir mon [[Debmirror|miroir de dépôt local]] à toute mes machines sans avoir à changer leur [[Sources.list|configuration]]&lt;br /&gt;
* Éviter certains sites irrespectueux des données personnelles (utilisation d'une liste automatique [[#Liste_RPZ_automatique|plus bas]])&lt;br /&gt;
&lt;br /&gt;
Il est à noter que tous les sous-domaines de chaque entrée sont automatiquement pris en compte.&lt;br /&gt;
&lt;br /&gt;
{{astuce|Si vous voulez [https://serverfault.com/questions/1104690/how-to-whitelist-domain-in-unbound autoriser] un ensemble de sous-domaines inclus dans un sous-domaine bloqué, vous pouvez utiliser une ligne comportant la syntaxe suivante (exemple pour ''Gmail'') : &amp;lt;code&amp;gt;local-zone: &amp;quot;l.google.com&amp;quot; always_transparent&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nestedtext&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /etc/unbound/unbound.conf.d/rpz.conf&lt;br /&gt;
server:&lt;br /&gt;
# Miroirs de dépôts APT Debian&lt;br /&gt;
local-zone: &amp;quot;ftp.fr.debian.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;ftp.fr.debian.org A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;http.debian.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;http.debian.net A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;deb.debian.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;deb.debian.org A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;security.debian.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;security.debian.org A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;httpredir.debian.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;httpredir.debian.org A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;debian.map.fastlydns.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;debian.map.fastlydns.net A 192.168.1.77&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# APT utilise aussi des champs SRV pour résoudre l'adresse des miroirs&lt;br /&gt;
local-zone: &amp;quot;prod.debian.map.fastly.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;prod.debian.map.fastly.net A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;dpvctowv9b08b.cloudfront.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;dpvctowv9b08b.cloudfront.net A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;_http._tcp.deb.debian.org.&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;_http._tcp.deb.debian.org. 3600 IN SRV 10 1 80 prod.debian.map.fastly.net.&amp;quot;&lt;br /&gt;
local-data: &amp;quot;_http._tcp.deb.debian.org. 3600 IN SRV 10 1 80 dpvctowv9b08b.cloudfront.net.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Saloperies à supprimer&lt;br /&gt;
local-zone: &amp;quot;doubleclick.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;doubleclick.net A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;googlesyndication.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;googlesyndication.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;googleadservices.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;googleadservices.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;google-analytics.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;google-analytics.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;ads.youtube.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;ads.youtube.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;adserver.yahoo.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;adserver.yahoo.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;ask.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;ask.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;facebook.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;facebook.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;truste-svc.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;truste-svc.net A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;trustarc.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;trustarc.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;gstatic.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;gstatic.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;consent.google.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;consent.google.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;consent.youtube.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;consent.youtube.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;cdn.privacy-mgmt.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;cdn.privacy-mgmt.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;privacy-mgmt.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;privacy-mgmt.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;cdn.cookielaw.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;cdn.cookielaw.org A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;digitalfeedback.us.confirmit.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;digitalfeedback.us.confirmit.com A 127.0.0.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Télémétrie Mozilla&lt;br /&gt;
local-zone: &amp;quot;incoming.telemetry.mozilla.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;incoming.telemetry.mozilla.org A 127.0.0.1&amp;quot;&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vérification de la configuration du service&lt;br /&gt;
 unbound-checkconf&lt;br /&gt;
&lt;br /&gt;
Redémarrage du service&lt;br /&gt;
 systemctl restart unbound&lt;br /&gt;
&lt;br /&gt;
Il est également possible de recharger la configuration sans relancer le logiciel. Cela a pour effet de ne pas le faire planter si jamais un fichier de configuration contient une erreur&lt;br /&gt;
 unbound-control reload&lt;br /&gt;
&lt;br /&gt;
Enfin, il est possible de configurer le système du serveur pour utiliser notre résolveur local et ne pas dépendre d'un résolveur de plus haut niveau (celui de notre ''FAI'' par exemple)&lt;br /&gt;
 echo &amp;quot;nameserver 127.0.0.1&amp;quot; &amp;gt; /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://memo-linux.com/debian-installer-le-serveur-dns-unbound/&lt;br /&gt;
* https://memo-linux.com/ubuntu-serveur-dns-unbound/&lt;br /&gt;
* https://lists.nlnetlabs.nl/pipermail/unbound-users/2014-October/003573.html&lt;br /&gt;
* https://unbound.docs.nlnetlabs.nl/en/latest/manpages/unbound.conf.html&lt;br /&gt;
&lt;br /&gt;
=Convertir une liste de domaines en RPZ=&lt;br /&gt;
Il est possible de trouver des listes de domaines générées par des tiers sur Internet ([https://raw.githubusercontent.com/schrebra/Windows.10.DNS.Block.List/main/hosts.txt exemple] d'une liste de domaine utilisés par ''Windows 10'' - [https://github.com/schrebra/Windows.10.DNS.Block.List source]).&lt;br /&gt;
&lt;br /&gt;
Pour les convertir en fichier de configuration ''RPZ'' avec syntaxe ''Unbound'', vous pouvez utiliser mon script :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Via un fichier distant&lt;br /&gt;
unbound_rbl_src=$(wget -qO - https://raw.githubusercontent.com/schrebra/Windows.10.DNS.Block.List/main/hosts.txt)&lt;br /&gt;
# ou via un fichier local&lt;br /&gt;
# unbound_rbl_src=$(cat /tmp/windows10-rbl.txt)&lt;br /&gt;
unbound_rbl_dst=&amp;quot;/tmp/windows10-rbl-unbound.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;server:&amp;quot; &amp;gt; &amp;quot;${unbound_rbl_dst}&amp;quot;&lt;br /&gt;
for i in $unbound_rbl_src; do&lt;br /&gt;
    echo -e &amp;quot;\tlocal-zone: \&amp;quot;${i}\&amp;quot; redirect\n\tlocal-data: \&amp;quot;${i} A 127.0.0.1\&amp;quot;&amp;quot; &amp;gt;&amp;gt; &amp;quot;${unbound_rbl_dst}&amp;quot;&lt;br /&gt;
done &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce fichier sera à placer dans le répertoire des configurations du résolveur ''DNS'' &amp;lt;code&amp;gt;/etc/unbound/unbound.conf.d/&amp;lt;/code&amp;gt; avant rechargement &amp;lt;code&amp;gt;unbound-control reload&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Liste RPZ automatique=&lt;br /&gt;
Le site [https://pgl.yoyo.org pgl.yoyo.org] met à jour et publie une [https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&amp;amp;showintro=0&amp;amp;mimetype=plaintext liste de domaines] à interdire au format ''Unbound''. Ceci peut être utile afin de filtrer les sites irrespectueux de la vie privée des utilisateurs&lt;br /&gt;
&lt;br /&gt;
{{info|De façon générale, il est préférable de laisser ce filtrage être opéré par les utilisateurs eux-même afin de maintenir un [https://www.arcep.fr/nos-sujets/la-neutralite-du-net.html réseau aussi neutre que possible]. Il est important également de considérer l'aspect sécuritaire au fait de récupérer une liste de résolution canonique sur un site tiers. Rien ne garanti que son administrateur (ou un pirate) n'utilisera cette liste pour faire rediriger un site légitime vers une adresse externe et compromettre l'authenticité de vos communications avec celui-ci. Cette solution est à adapter à la situation locale.}}&lt;br /&gt;
&lt;br /&gt;
Le script suivant (écrit par [https://zestedesavoir.com/@sgble sgble] et adapté par mes soins) permet de récupérer la dernière version de la liste tout en sauvegardant sa copie actuelle, d'en vérifier la syntaxe et ainsi de soit recharger le service, soit restaurer sa version fonctionnelle :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /usr/local/sbin/maj-rbl-unbound&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Lien de la liste&lt;br /&gt;
yoyo_url=&amp;quot;https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&amp;amp;showintro=0&amp;amp;mimetype=plaintext&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Localisation de la configuration Unbound&lt;br /&gt;
unbound_confs=&amp;quot;/etc/unbound/unbound.conf.d/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Si le fichier précédent existe déjà, le garder en réserver au cas où&lt;br /&gt;
if [ -f &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf ]; then&lt;br /&gt;
	cp &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf /tmp/yoyo_blocus.conf.sauv&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Télécharger et placer la liste au bon endroit&lt;br /&gt;
wget &amp;quot;${yoyo_url}&amp;quot; -O &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf &amp;amp;&amp;amp; sed -i '1 s/^/server:\n/' &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf&lt;br /&gt;
&lt;br /&gt;
# Vérifier que Unbound ne rencontre aucun problème avec la liste et recharger si vrai&lt;br /&gt;
if unbound-checkconf; then&lt;br /&gt;
	echo &amp;quot;La nouvelle liste est bonne&amp;quot;&lt;br /&gt;
	unbound-control reload&lt;br /&gt;
	echo &amp;quot;Unbound a été rechargé&amp;quot;&lt;br /&gt;
# Sinon, rétablir l'ancien fichier qu'on a gardé en réserve&lt;br /&gt;
else&lt;br /&gt;
	echo &amp;quot;La nouvelle liste semble mal formaté&amp;quot;&lt;br /&gt;
	mv /tmp/yoyo_blocus.conf.sauv &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf&lt;br /&gt;
	echo &amp;quot;Une restauration de l'ancienne liste a été effectuée&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 chmod +x /usr/local/sbin/maj-rbl-unbound&lt;br /&gt;
&lt;br /&gt;
Création d'un [[Minuteur - systemd|minuteur Systemd]] afin d'automatiser l'actualisation de la liste (tous les jours)&lt;br /&gt;
  mkdir -p /usr/local/etc/systemd/system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /usr/local/etc/systemd/system/maj-rbl-unbound.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Actualisation de la liste RPZ d'Unbound&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=maj-rbl-unbound&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /usr/local/etc/systemd/system/maj-rbl-unbound.timer&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Exécution journalière de l'actualisation de la liste RPZ d'Unbound&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=daily&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ln -s /usr/local/etc/systemd/system/maj-rbl-unbound.service /etc/systemd/system/&lt;br /&gt;
 ln -s /usr/local/etc/systemd/system/maj-rbl-unbound.timer /etc/systemd/system/&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
 systemctl enable maj-rbl-unbound.timer&lt;br /&gt;
 systemctl start maj-rbl-unbound.timer&lt;br /&gt;
&lt;br /&gt;
=Sources de la section=&lt;br /&gt;
* https://zestedesavoir.com/billets/3908/avoir-son-dns-local-securite-controle-et-performance/&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Ffmpeg&amp;diff=1515</id>
		<title>Ffmpeg</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Ffmpeg&amp;diff=1515"/>
		<updated>2024-03-05T17:27:58Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Redimensionner une vidéo */ Correction d'une mise en gras non terminée&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
[https://fr.wikipedia.org/wiki/FFmpeg FFmpeg] est une collection de logiciels libres destinés au traitement de flux audio ou vidéo (enregistrement, lecture ou conversion d'un format à un autre). Cette bibliothèque est utilisée par de nombreux autres logiciels ou services comme ''VLC'', ''iTunes'' ou ''YouTube''.&lt;br /&gt;
&lt;br /&gt;
Développé sur ''GNU/Linux'', ''FFmpeg'' peut être compilé sur la plupart des systèmes d'exploitation, y compris [[:Category:Windows|Windows]]. Le projet est distribué sous licence libre, [https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_GNU GPL] 2+ ou [https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_limit%C3%A9e_GNU LGPL] 2.1+ en fonction des options de compilation du projet.&lt;br /&gt;
&lt;br /&gt;
=Extraire le son=&lt;br /&gt;
Voici comment [http://www.loopsbeats.com/convert/extract-audio-with-ffmpeg.html extraire le son] d'une vidéo ''mp4'' en ''mp3'' :&lt;br /&gt;
 ffmpeg -i toto.mp4 -vn -ar 44100 -ac 2 -ab 192 -f mp3 toto.mp3&lt;br /&gt;
&lt;br /&gt;
=Extraire la jaquette=&lt;br /&gt;
Les fichiers audios embarquent souvent une image (communément la jaquette de l'album). Voici comment la [https://unix.stackexchange.com/questions/41287/how-to-extract-album-cover-image-from-mp3-file récupérer] :&lt;br /&gt;
 ffmpeg -i fichier.mp3 -an -c:v copy fichier.jpg&lt;br /&gt;
&lt;br /&gt;
=Couper un extrait=&lt;br /&gt;
Il est possible de [https://superuser.com/questions/138331/using-ffmpeg-to-cut-up-video#704118 découper un morceau] de fichier avec ceci :&lt;br /&gt;
 ffmpeg -ss 00:00:53 -i Pas\ de\ manières-5hjNP5dNNs4.m4a -t 00:00:11 -c copy Ta_cherie.m4a&lt;br /&gt;
&lt;br /&gt;
Explications :&lt;br /&gt;
* '''-ss''' : début de la découpe&lt;br /&gt;
* '''-i''' : fichier source&lt;br /&gt;
* '''-t''' : temps à garder à partir de '''-ss'''&lt;br /&gt;
* '''-c''' : action à effectuer&lt;br /&gt;
&lt;br /&gt;
Il est aussi possible de préciser le nombre de trames à conserver à partir d'un temps donnée (plus précis) :&lt;br /&gt;
 ffmpeg -y -ss 00:01:28 -i Toto.mp4 -c:v libx264 -c:a aac -frames:v 100 /tmp/titi.mp4&lt;br /&gt;
&lt;br /&gt;
Paramètres différents :&lt;br /&gt;
* '''-c:v libx264''' : codec vidéo de transcodage (facultatif)&lt;br /&gt;
* '''-c:a aac''' : codec audio de transcodage (facultatif)&lt;br /&gt;
* '''-frames:v 100''' : garder 100 trames (le &amp;quot;v&amp;quot; peut être remplacé par un &amp;quot;a&amp;quot; en cas de fichier uniquement audio)&lt;br /&gt;
&lt;br /&gt;
Dans le cas d'une vidéo comportant [https://stackoverflow.com/questions/60445661/ffmpeg-how-do-i-choose-the-correct-audio-track plusieurs] pistes audios, il est possible de sélectionner la désirée de la manière suivante :&lt;br /&gt;
 ffmpeg -y -ss 00:27:26 -i Toto.mp4 -c:v libx264 -c:a aac -frames:v 530 -map 0:v:0 -map 0:a:2 /tmp/titi.mp4.mp4&lt;br /&gt;
&lt;br /&gt;
Paramètres différents :&lt;br /&gt;
* '''-map 0:v:0''' : première piste vidéo&lt;br /&gt;
* '''-map 0:a:2''' : troisième piste audio&lt;br /&gt;
&lt;br /&gt;
=Convertir un fichier=&lt;br /&gt;
Pour [https://fr.wikihow.com/utiliser-FFmpeg convertir un fichier] dans un autre format :&lt;br /&gt;
 ffmpeg -i Ni_flic_ni_pd.ogg Ni_flic_ni_pd.mp3&lt;br /&gt;
&lt;br /&gt;
''Note: L'outil détecte automatiquement le format du fichier voulu en lisant l'extension de destination.''&lt;br /&gt;
&lt;br /&gt;
Il est possible d'ajouter des paramètres afin de préciser des [https://trac.ffmpeg.org/wiki/Encode/H.264 caractéristiques d'encodage]. [https://emirchouchane.com/h264-ffmpeg/ Par exemple], pour une conversion vidéo en ''h264'' :&lt;br /&gt;
 ffmpeg -i vidéo.m4v -c:v libx264 -crf 23 vidéo.mp4&lt;br /&gt;
&lt;br /&gt;
Explications :&lt;br /&gt;
* '''-c:v libx264''' : sélection du codec (''-c'') vidéo ('':v'') h264 (''libx264'')&lt;br /&gt;
* '''-crf 23''' : facteur de taux constant (''Constant Rate Factor'') à 23. Permet de définir le débit binaire de la vidéo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;https://{{SERVERNAME}}/fichiers/multim%c3%a9dia/conversion/ffmpeg/%c3%89chelle_Constant_Rate_Factor.svg&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autre exemple avec une conversion en [https://trac.ffmpeg.org/wiki/Encode/H.265 h265] :&lt;br /&gt;
 ffmpeg -i vidéo.mp4 -c:v libx265 -crf 26 -preset fast -c:a eac3 -b:a 640k /tmp/vidéo.mp4&lt;br /&gt;
&lt;br /&gt;
* '''-c:v libx265''' : codec vidéo en ''h265''&lt;br /&gt;
* '''-preset fast''' : vitesse d'encodage et profile de compression (énumérés [https://trac.ffmpeg.org/wiki/Encode/H.265#ConstantRateFactorCRF ici])&lt;br /&gt;
* '''-c:a eac3''' : codec audio en ''eac3''&lt;br /&gt;
* '''-b:a 640k''' : débit binaire du flux audio&lt;br /&gt;
&lt;br /&gt;
=Redimensionner une vidéo=&lt;br /&gt;
Outre le codec à utiliser et le ''CRF'' à modifier, il est possible d'alléger une vidéo en réduisant ses dimensions. Les différentes techniques combinées peuvent permettre d'arriver à envoyer péniblement une vidéo par [https://fr.wikipedia.org/wiki/Multimedia_Messaging_Service MMS]...&lt;br /&gt;
 ffmpeg -y -i /tmp/a.mp4 -crf 33 -vf &amp;quot;scale=iw/2:ih/2&amp;quot; /tmp/b.mp4&lt;br /&gt;
&lt;br /&gt;
Explications :&lt;br /&gt;
* '''-y''' : écrase la destination sans demander de confirmation&lt;br /&gt;
* '''-i''' : fichier source&lt;br /&gt;
* '''-crf 33''' : forte compression (destructrice) de la vidéo&lt;br /&gt;
* '''-vf &amp;quot;scale=iw/2:ih/2&amp;quot;''' : réduction par deux des dimensions de la vidéo&lt;br /&gt;
&lt;br /&gt;
=Fusionner une bande vidéo et une bande son=&lt;br /&gt;
Il est possible de [https://qastack.fr/superuser/277642/how-to-merge-audio-and-video-file-in-ffmpeg regrouper] dans un même fichier multimédia ([https://fr.wikipedia.org/wiki/Format_conteneur conteneur]) une bande vidéo et une bande son. Un cas typique est le téléchargement d'une vidéo sur le site [https://crowdbunker.com crowdbunker.com] via les fichiers &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;.m3u&amp;lt;/syntaxhighlight&amp;gt; capturés dans le trafic réseau. La vidéo est découplé du son (deux téléchargements séparés) et c'est le lecteur vidéo ''WEB'' qui se charge de lire les deux en même temps. Pour fusionner les deux après téléchargement en local, la commande suivante peut être utilisée :&lt;br /&gt;
 ffmpeg -i Vidéo_source.mp4 -i Audio_source.mp4 -c:v copy -c:a aac -strict experimental Vidéo_et_audio_destination.mp4&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Ffmpeg&amp;diff=1514</id>
		<title>Ffmpeg</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Ffmpeg&amp;diff=1514"/>
		<updated>2024-03-05T16:58:12Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Couper un extrait */ Ajout d'une méthode pour sélectionner une piste audio + correction typographique&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
[https://fr.wikipedia.org/wiki/FFmpeg FFmpeg] est une collection de logiciels libres destinés au traitement de flux audio ou vidéo (enregistrement, lecture ou conversion d'un format à un autre). Cette bibliothèque est utilisée par de nombreux autres logiciels ou services comme ''VLC'', ''iTunes'' ou ''YouTube''.&lt;br /&gt;
&lt;br /&gt;
Développé sur ''GNU/Linux'', ''FFmpeg'' peut être compilé sur la plupart des systèmes d'exploitation, y compris [[:Category:Windows|Windows]]. Le projet est distribué sous licence libre, [https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_GNU GPL] 2+ ou [https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_limit%C3%A9e_GNU LGPL] 2.1+ en fonction des options de compilation du projet.&lt;br /&gt;
&lt;br /&gt;
=Extraire le son=&lt;br /&gt;
Voici comment [http://www.loopsbeats.com/convert/extract-audio-with-ffmpeg.html extraire le son] d'une vidéo ''mp4'' en ''mp3'' :&lt;br /&gt;
 ffmpeg -i toto.mp4 -vn -ar 44100 -ac 2 -ab 192 -f mp3 toto.mp3&lt;br /&gt;
&lt;br /&gt;
=Extraire la jaquette=&lt;br /&gt;
Les fichiers audios embarquent souvent une image (communément la jaquette de l'album). Voici comment la [https://unix.stackexchange.com/questions/41287/how-to-extract-album-cover-image-from-mp3-file récupérer] :&lt;br /&gt;
 ffmpeg -i fichier.mp3 -an -c:v copy fichier.jpg&lt;br /&gt;
&lt;br /&gt;
=Couper un extrait=&lt;br /&gt;
Il est possible de [https://superuser.com/questions/138331/using-ffmpeg-to-cut-up-video#704118 découper un morceau] de fichier avec ceci :&lt;br /&gt;
 ffmpeg -ss 00:00:53 -i Pas\ de\ manières-5hjNP5dNNs4.m4a -t 00:00:11 -c copy Ta_cherie.m4a&lt;br /&gt;
&lt;br /&gt;
Explications :&lt;br /&gt;
* '''-ss''' : début de la découpe&lt;br /&gt;
* '''-i''' : fichier source&lt;br /&gt;
* '''-t''' : temps à garder à partir de '''-ss'''&lt;br /&gt;
* '''-c''' : action à effectuer&lt;br /&gt;
&lt;br /&gt;
Il est aussi possible de préciser le nombre de trames à conserver à partir d'un temps donnée (plus précis) :&lt;br /&gt;
 ffmpeg -y -ss 00:01:28 -i Toto.mp4 -c:v libx264 -c:a aac -frames:v 100 /tmp/titi.mp4&lt;br /&gt;
&lt;br /&gt;
Paramètres différents :&lt;br /&gt;
* '''-c:v libx264''' : codec vidéo de transcodage (facultatif)&lt;br /&gt;
* '''-c:a aac''' : codec audio de transcodage (facultatif)&lt;br /&gt;
* '''-frames:v 100''' : garder 100 trames (le &amp;quot;v&amp;quot; peut être remplacé par un &amp;quot;a&amp;quot; en cas de fichier uniquement audio)&lt;br /&gt;
&lt;br /&gt;
Dans le cas d'une vidéo comportant [https://stackoverflow.com/questions/60445661/ffmpeg-how-do-i-choose-the-correct-audio-track plusieurs] pistes audios, il est possible de sélectionner la désirée de la manière suivante :&lt;br /&gt;
 ffmpeg -y -ss 00:27:26 -i Toto.mp4 -c:v libx264 -c:a aac -frames:v 530 -map 0:v:0 -map 0:a:2 /tmp/titi.mp4.mp4&lt;br /&gt;
&lt;br /&gt;
Paramètres différents :&lt;br /&gt;
* '''-map 0:v:0''' : première piste vidéo&lt;br /&gt;
* '''-map 0:a:2''' : troisième piste audio&lt;br /&gt;
&lt;br /&gt;
=Convertir un fichier=&lt;br /&gt;
Pour [https://fr.wikihow.com/utiliser-FFmpeg convertir un fichier] dans un autre format :&lt;br /&gt;
 ffmpeg -i Ni_flic_ni_pd.ogg Ni_flic_ni_pd.mp3&lt;br /&gt;
&lt;br /&gt;
''Note: L'outil détecte automatiquement le format du fichier voulu en lisant l'extension de destination.''&lt;br /&gt;
&lt;br /&gt;
Il est possible d'ajouter des paramètres afin de préciser des [https://trac.ffmpeg.org/wiki/Encode/H.264 caractéristiques d'encodage]. [https://emirchouchane.com/h264-ffmpeg/ Par exemple], pour une conversion vidéo en ''h264'' :&lt;br /&gt;
 ffmpeg -i vidéo.m4v -c:v libx264 -crf 23 vidéo.mp4&lt;br /&gt;
&lt;br /&gt;
Explications :&lt;br /&gt;
* '''-c:v libx264''' : sélection du codec (''-c'') vidéo ('':v'') h264 (''libx264'')&lt;br /&gt;
* '''-crf 23''' : facteur de taux constant (''Constant Rate Factor'') à 23. Permet de définir le débit binaire de la vidéo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;https://{{SERVERNAME}}/fichiers/multim%c3%a9dia/conversion/ffmpeg/%c3%89chelle_Constant_Rate_Factor.svg&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autre exemple avec une conversion en [https://trac.ffmpeg.org/wiki/Encode/H.265 h265] :&lt;br /&gt;
 ffmpeg -i vidéo.mp4 -c:v libx265 -crf 26 -preset fast -c:a eac3 -b:a 640k /tmp/vidéo.mp4&lt;br /&gt;
&lt;br /&gt;
* '''-c:v libx265''' : codec vidéo en ''h265''&lt;br /&gt;
* '''-preset fast''' : vitesse d'encodage et profile de compression (énumérés [https://trac.ffmpeg.org/wiki/Encode/H.265#ConstantRateFactorCRF ici])&lt;br /&gt;
* '''-c:a eac3''' : codec audio en ''eac3''&lt;br /&gt;
* '''-b:a 640k''' : débit binaire du flux audio&lt;br /&gt;
&lt;br /&gt;
=Redimensionner une vidéo=&lt;br /&gt;
Outre le codec à utiliser et le ''CRF'' à modifier, il est possible d'alléger une vidéo en réduisant ses dimensions. Les différentes techniques combinées peuvent permettre d'arriver à envoyer péniblement une vidéo par [https://fr.wikipedia.org/wiki/Multimedia_Messaging_Service MMS]...&lt;br /&gt;
 ffmpeg -y -i /tmp/a.mp4 -crf 33 -vf &amp;quot;scale=iw/2:ih/2&amp;quot; /tmp/b.mp4&lt;br /&gt;
&lt;br /&gt;
Explications :&lt;br /&gt;
* '''-y''' : écrase la destination sans demander de confirmation&lt;br /&gt;
* '''-i''' : fichier source&lt;br /&gt;
* '''-crf 33''' : forte compression (destructrice) de la vidéo&lt;br /&gt;
* '''-vf &amp;quot;scale=iw/2:ih/2&amp;quot; réduction par deux des dimensions de la vidéo&lt;br /&gt;
&lt;br /&gt;
=Fusionner une bande vidéo et une bande son=&lt;br /&gt;
Il est possible de [https://qastack.fr/superuser/277642/how-to-merge-audio-and-video-file-in-ffmpeg regrouper] dans un même fichier multimédia ([https://fr.wikipedia.org/wiki/Format_conteneur conteneur]) une bande vidéo et une bande son. Un cas typique est le téléchargement d'une vidéo sur le site [https://crowdbunker.com crowdbunker.com] via les fichiers &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;.m3u&amp;lt;/syntaxhighlight&amp;gt; capturés dans le trafic réseau. La vidéo est découplé du son (deux téléchargements séparés) et c'est le lecteur vidéo ''WEB'' qui se charge de lire les deux en même temps. Pour fusionner les deux après téléchargement en local, la commande suivante peut être utilisée :&lt;br /&gt;
 ffmpeg -i Vidéo_source.mp4 -i Audio_source.mp4 -c:v copy -c:a aac -strict experimental Vidéo_et_audio_destination.mp4&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Shred&amp;diff=1513</id>
		<title>Shred</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Shred&amp;diff=1513"/>
		<updated>2024-02-29T20:27:28Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Correction de fautes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Linux]]&lt;br /&gt;
&lt;br /&gt;
[https://www.man7.org/linux/man-pages/man1/shred.1.html Shred] (déchiqueter) est un outil des [https://www.gnu.org/software/coreutils/coreutils.html GNU coreutils] permettant l’effacement sécurisé de données sur un système de fichiers monté en lecture/écriture. Il permet de s'assurer qu'un fichier a bien été totalement écrasé sans laisser de trace dans les blocs l'ayant accueilli en écrivant des caractères pseudos-aléatoires par dessus celui-ci (3 fois par défaut). Il agit donc comme une déchiqueteuse de papier physique.&lt;br /&gt;
&lt;br /&gt;
En effet, la suppression traditionnelle ainsi que les formatages rapides se contentent généralement de vider les nœuds d'index (''inodes'') correspondants aux blocs contenants l'information et non les données elles mêmes. Les fichiers sont alors récupérables via des outils dédiés.&lt;br /&gt;
&lt;br /&gt;
Le programme n'intégrant pas d'option de récursivité, il faut passer par une boucle pour supprimer le contenu d'un répertoire. La [https://unix.stackexchange.com/questions/27027/how-do-i-recursively-shred-an-entire-directory-tree commande] &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; peut être employée pour réaliser cette tâche finement&lt;br /&gt;
 find &amp;lt;rèp&amp;gt; -type f -exec shred -uvz {} \;&lt;br /&gt;
&lt;br /&gt;
Options :&lt;br /&gt;
* '''-u''' : dés-alloue les blocs et supprime le fichier après réécriture (par défaut, il le laisse rempli avec des caractères pseudos-aléatoires)&lt;br /&gt;
* '''-v''' : affiche les opérations en cours&lt;br /&gt;
* '''-z''' : ajoute une passe de zéro pour masquer le déchiquetage&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Shred&amp;diff=1512</id>
		<title>Shred</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Shred&amp;diff=1512"/>
		<updated>2024-02-29T16:15:10Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Correction d'une faute de frappe dans la catégorie de la page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Linux]]&lt;br /&gt;
&lt;br /&gt;
[https://www.man7.org/linux/man-pages/man1/shred.1.html Shred] (déchiqueter) est un outil des [https://www.gnu.org/software/coreutils/coreutils.html GNU coreutils] permettant l’efficacement sécurisé de données sur un système de fichiers monté en lecture/écriture. Il permet de s'assurer qu'un fichier a bien été totalement écrasé sans laisser de trace dans les blocs l'ayant accueilli en réécrivant des caractères pseudos-aléatoires par dessus celui-ci (3 fois par défaut). Il agit donc comme une déchiqueteuse de papier physique.&lt;br /&gt;
&lt;br /&gt;
En effet, la suppression traditionnelle ainsi que les formatages rapides se contentent généralement vider les nœud d'index (''inodes'') correspondant aux blocs contenant les données et non les données elles mêmes. Les fichiers sont alors récupérables via des outils dédiés.&lt;br /&gt;
&lt;br /&gt;
Le programme n'intégrant pas d'option de récursivité, il faut passer par une boucle pour supprimer le contenu d'un répertoire. La [https://unix.stackexchange.com/questions/27027/how-do-i-recursively-shred-an-entire-directory-tree commande] &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; peut être employée pour réaliser cette tâche finement&lt;br /&gt;
 find &amp;lt;rèp&amp;gt; -type f -exec shred -uvz {} \;&lt;br /&gt;
&lt;br /&gt;
Options :&lt;br /&gt;
* '''-u''' : dés-alloue les blocs et supprime le fichier après réécriture (par défaut, il le laisse rempli des caractères pseudos-aléatoires)&lt;br /&gt;
* '''-v''' : affiche les opérations en cours&lt;br /&gt;
* '''-z''' : ajoute une passe de zéro pour masquer le déchiquetage&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Shred&amp;diff=1511</id>
		<title>Shred</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Shred&amp;diff=1511"/>
		<updated>2024-02-29T16:14:09Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Page créée avec « Linux  [https://www.man7.org/linux/man-pages/man1/shred.1.html Shred] (déchiqueter) est un outil des [https://www.gnu.org/software/coreutils/coreutils.html GNU coreutils] permettant l’efficacement sécurisé de données sur un système de fichiers monté en lecture/écriture. Il permet de s'assurer qu'un fichier a bien été totalement écrasé sans laisser de trace dans les blocs l'ayant accueilli en réécrivant des caractères pseudos-aléatoire... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Categoy|Linux]]&lt;br /&gt;
&lt;br /&gt;
[https://www.man7.org/linux/man-pages/man1/shred.1.html Shred] (déchiqueter) est un outil des [https://www.gnu.org/software/coreutils/coreutils.html GNU coreutils] permettant l’efficacement sécurisé de données sur un système de fichiers monté en lecture/écriture. Il permet de s'assurer qu'un fichier a bien été totalement écrasé sans laisser de trace dans les blocs l'ayant accueilli en réécrivant des caractères pseudos-aléatoires par dessus celui-ci (3 fois par défaut). Il agit donc comme une déchiqueteuse de papier physique.&lt;br /&gt;
&lt;br /&gt;
En effet, la suppression traditionnelle ainsi que les formatages rapides se contentent généralement vider les nœud d'index (''inodes'') correspondant aux blocs contenant les données et non les données elles mêmes. Les fichiers sont alors récupérables via des outils dédiés.&lt;br /&gt;
&lt;br /&gt;
Le programme n'intégrant pas d'option de récursivité, il faut passer par une boucle pour supprimer le contenu d'un répertoire. La [https://unix.stackexchange.com/questions/27027/how-do-i-recursively-shred-an-entire-directory-tree commande] &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; peut être employée pour réaliser cette tâche finement&lt;br /&gt;
 find &amp;lt;rèp&amp;gt; -type f -exec shred -uvz {} \;&lt;br /&gt;
&lt;br /&gt;
Options :&lt;br /&gt;
* '''-u''' : dés-alloue les blocs et supprime le fichier après réécriture (par défaut, il le laisse rempli des caractères pseudos-aléatoires)&lt;br /&gt;
* '''-v''' : affiche les opérations en cours&lt;br /&gt;
* '''-z''' : ajoute une passe de zéro pour masquer le déchiquetage&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Ffmpeg&amp;diff=1510</id>
		<title>Ffmpeg</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Ffmpeg&amp;diff=1510"/>
		<updated>2024-02-28T21:42:48Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout d'une méthode supplémentaire pour couper un extrait de média + ajout de la section &amp;quot;Redimensionner une vidéo&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
[https://fr.wikipedia.org/wiki/FFmpeg FFmpeg] est une collection de logiciels libres destinés au traitement de flux audio ou vidéo (enregistrement, lecture ou conversion d'un format à un autre). Cette bibliothèque est utilisée par de nombreux autres logiciels ou services comme ''VLC'', ''iTunes'' ou ''YouTube''.&lt;br /&gt;
&lt;br /&gt;
Développé sur ''GNU/Linux'', ''FFmpeg'' peut être compilé sur la plupart des systèmes d'exploitation, y compris [[:Category:Windows|Windows]]. Le projet est distribué sous licence libre, [https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_GNU GPL] 2+ ou [https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_limit%C3%A9e_GNU LGPL] 2.1+ en fonction des options de compilation du projet.&lt;br /&gt;
&lt;br /&gt;
=Extraire le son=&lt;br /&gt;
Voici comment [http://www.loopsbeats.com/convert/extract-audio-with-ffmpeg.html extraire le son] d'une vidéo ''mp4'' en ''mp3'' :&lt;br /&gt;
 ffmpeg -i toto.mp4 -vn -ar 44100 -ac 2 -ab 192 -f mp3 toto.mp3&lt;br /&gt;
&lt;br /&gt;
=Extraire la jaquette=&lt;br /&gt;
Les fichiers audios embarquent souvent une image (communément la jaquette de l'album). Voici comment la [https://unix.stackexchange.com/questions/41287/how-to-extract-album-cover-image-from-mp3-file récupérer] :&lt;br /&gt;
 ffmpeg -i fichier.mp3 -an -c:v copy fichier.jpg&lt;br /&gt;
&lt;br /&gt;
=Couper un extrait=&lt;br /&gt;
Il est possible de [https://superuser.com/questions/138331/using-ffmpeg-to-cut-up-video#704118 découper un morceau] de fichier avec ceci :&lt;br /&gt;
 ffmpeg -ss 00:00:53 -i Pas\ de\ manières-5hjNP5dNNs4.m4a -t 00:00:11 -c copy Ta_cherie.m4a&lt;br /&gt;
&lt;br /&gt;
Explications :&lt;br /&gt;
* '''-ss''' : début de la découpe&lt;br /&gt;
* '''-i''' : fichier source&lt;br /&gt;
* '''-t''' : temps à garder à partir de '''-ss'''&lt;br /&gt;
* '''-c''' : action à effectuer&lt;br /&gt;
&lt;br /&gt;
Il est aussi possible de préciser le nombre de trames à conserver à partir d'un temps donnée (plus précis)&lt;br /&gt;
 ffmpeg -y -ss 00:01:28 -i Toto.mp4 -c:v libx264 -c:a aac -frames:v 100 /tmp/titi.mp4&lt;br /&gt;
&lt;br /&gt;
Paramètres différents :&lt;br /&gt;
* '''-c:v libx264''' : codec vidéo de transcodage (facultatif)&lt;br /&gt;
* '''-c:a aac''' : codec audio de transcodage (facultatif)&lt;br /&gt;
* '''-frames:v 100''' : garder 100 trames (le &amp;quot;v&amp;quot; peut être remplacé par un &amp;quot;a&amp;quot; en cas de fichier uniquement audio)&lt;br /&gt;
&lt;br /&gt;
=Convertir un fichier=&lt;br /&gt;
Pour [https://fr.wikihow.com/utiliser-FFmpeg convertir un fichier] dans un autre format :&lt;br /&gt;
 ffmpeg -i Ni_flic_ni_pd.ogg Ni_flic_ni_pd.mp3&lt;br /&gt;
&lt;br /&gt;
''Note: L'outil détecte automatiquement le format du fichier voulu en lisant l'extension de destination.''&lt;br /&gt;
&lt;br /&gt;
Il est possible d'ajouter des paramètres afin de préciser des [https://trac.ffmpeg.org/wiki/Encode/H.264 caractéristiques d'encodage]. [https://emirchouchane.com/h264-ffmpeg/ Par exemple], pour une conversion vidéo en ''h264'' :&lt;br /&gt;
 ffmpeg -i vidéo.m4v -c:v libx264 -crf 23 vidéo.mp4&lt;br /&gt;
&lt;br /&gt;
Explications :&lt;br /&gt;
* '''-c:v libx264''' : sélection du codec (''-c'') vidéo ('':v'') h264 (''libx264'')&lt;br /&gt;
* '''-crf 23''' : facteur de taux constant (''Constant Rate Factor'') à 23. Permet de définir le débit binaire de la vidéo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;https://{{SERVERNAME}}/fichiers/multim%c3%a9dia/conversion/ffmpeg/%c3%89chelle_Constant_Rate_Factor.svg&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autre exemple avec une conversion en [https://trac.ffmpeg.org/wiki/Encode/H.265 h265] :&lt;br /&gt;
 ffmpeg -i vidéo.mp4 -c:v libx265 -crf 26 -preset fast -c:a eac3 -b:a 640k /tmp/vidéo.mp4&lt;br /&gt;
&lt;br /&gt;
* '''-c:v libx265''' : codec vidéo en ''h265''&lt;br /&gt;
* '''-preset fast''' : vitesse d'encodage et profile de compression (énumérés [https://trac.ffmpeg.org/wiki/Encode/H.265#ConstantRateFactorCRF ici])&lt;br /&gt;
* '''-c:a eac3''' : codec audio en ''eac3''&lt;br /&gt;
* '''-b:a 640k''' : débit binaire du flux audio&lt;br /&gt;
&lt;br /&gt;
=Redimensionner une vidéo=&lt;br /&gt;
Outre le codec à utiliser et le ''CRF'' à modifier, il est possible d'alléger une vidéo en réduisant ses dimensions. Les différentes techniques combinées peuvent permettre d'arriver à envoyer péniblement une vidéo par [https://fr.wikipedia.org/wiki/Multimedia_Messaging_Service MMS]...&lt;br /&gt;
 ffmpeg -y -i /tmp/a.mp4 -crf 33 -vf &amp;quot;scale=iw/2:ih/2&amp;quot; /tmp/b.mp4&lt;br /&gt;
&lt;br /&gt;
Explications :&lt;br /&gt;
* '''-y''' : écrase la destination sans demander de confirmation&lt;br /&gt;
* '''-i''' : fichier source&lt;br /&gt;
* '''-crf 33''' : forte compression (destructrice) de la vidéo&lt;br /&gt;
* '''-vf &amp;quot;scale=iw/2:ih/2&amp;quot; réduction par deux des dimensions de la vidéo&lt;br /&gt;
&lt;br /&gt;
=Fusionner une bande vidéo et une bande son=&lt;br /&gt;
Il est possible de [https://qastack.fr/superuser/277642/how-to-merge-audio-and-video-file-in-ffmpeg regrouper] dans un même fichier multimédia ([https://fr.wikipedia.org/wiki/Format_conteneur conteneur]) une bande vidéo et une bande son. Un cas typique est le téléchargement d'une vidéo sur le site [https://crowdbunker.com crowdbunker.com] via les fichiers &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;.m3u&amp;lt;/syntaxhighlight&amp;gt; capturés dans le trafic réseau. La vidéo est découplé du son (deux téléchargements séparés) et c'est le lecteur vidéo ''WEB'' qui se charge de lire les deux en même temps. Pour fusionner les deux après téléchargement en local, la commande suivante peut être utilisée :&lt;br /&gt;
 ffmpeg -i Vidéo_source.mp4 -i Audio_source.mp4 -c:v copy -c:a aac -strict experimental Vidéo_et_audio_destination.mp4&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Unified_kernel_image&amp;diff=1509</id>
		<title>Unified kernel image</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Unified_kernel_image&amp;diff=1509"/>
		<updated>2024-02-28T11:46:40Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Secure Boot */ Ajout d'une recommandation sur le mot de passe UEFI&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Noyau_linux]]&lt;br /&gt;
&lt;br /&gt;
Une Image Noyau Unifiée (INU) ou ''Unified Kernel Image'' (''UKI'') est la combinaison d'un programme de démarrage ''UEFI'', d'une image noyau ''Linux'', d'un ''initrd'' ainsi que d'autres ressources optionnelles dans un seul fichier ''UEFI [https://fr.wikipedia.org/wiki/Portable_Executable PE]''. Il peut alors être invoqué directement par :&lt;br /&gt;
* le micrologiciel ''UEFI'' : utile notamment dans certains environnements d'informatique en nuage ou confidentiels&lt;br /&gt;
* un chargeur de démarrage : généralement utile pour permettre plusieurs versions de noyau avec une sélection interactive ou automatique de la version dans laquelle démarrer ([[Systemd-boot]] ou [[Grub]] permettent cela)&lt;br /&gt;
&lt;br /&gt;
L'amorçage de cette image unifiée est permise par le ''stub'', programme logé dans celle-ci et pouvant être interprété par l{{'}}''UEFI''. Il constitue donc la partie exécutable initiale de l'image combinée et charge par la suite d'autres ressources à partir du reste de l{{'}}''INU'', en particulier le noyau et l{{'}}''initrd''.&lt;br /&gt;
&lt;br /&gt;
La [https://uapi-group.org/specifications/specs/unified_kernel_image/ spécification officielle] définit le format et les composants (obligatoires et optionnels) des ''UKI'' qui sont fournis en tant que sections ''PE/COFF'' de l'exécutable.&lt;br /&gt;
&lt;br /&gt;
L'intérêt principal de cette approche est qu'elle permet de mieux sécuriser le démarrage d'un système en exposant un unique binaire (''UEFI PE'') en clair sur le disque d'amorçage (''EFI System Partition'' - ''ESP'') au lieu d'une multitude de fichiers pouvant être modifiés par le premier pirate venu. Cet exécutable pourra alors être signé par ''Secure Boot'' et permettre, entre-autre, le déchiffrement de la racine en s'assurant de l’absence de sa propre altération (enregistreur de frappes par exemple).&lt;br /&gt;
&lt;br /&gt;
=Image Noyau Unifiée=&lt;br /&gt;
==Installation des outils==&lt;br /&gt;
La génération d'une ''INU'' nécessite quelques outils. Le projet ''Systemd'' met à disposition un programme ''Python'' nommé &amp;lt;code&amp;gt;Ukify&amp;lt;/code&amp;gt; à partir de la version 253 de l{{'}}''init''. Il est logé à l'emplacement &amp;lt;code&amp;gt;/usr/lib/systemd/ukify&amp;lt;/code&amp;gt; mais nécessite la bibliothèque &amp;lt;code&amp;gt;python3-pefile&amp;lt;/code&amp;gt; et ses dépendances pour fonctionner. L'approche exposé dans ce document visant la frugalité (''Ukify'' apporte surtout une configuration épurée mais l'aspect fonctionnel est identique), le strict nécessaire sera installé.&lt;br /&gt;
 apt install --no-install-recommends systemd-boot-efi binutils gawk sbsigntool&lt;br /&gt;
&lt;br /&gt;
Détails des paquets installés :&lt;br /&gt;
* '''systemd-boot-efi''' : fournit le ''stub &amp;lt;code&amp;gt;/usr/lib/systemd/boot/efi/linuxx64.efi.stub&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''binutils''' : fournit le programme de construction du binaire ''PE'' &amp;lt;code&amp;gt;objdump&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''gawk''' : fournit la version ''GNU'' de l'interpréteur de langage ''AWK'' afin de ne pas avoir l'erreur de fonction non définie &amp;lt;code&amp;gt;function strtonum never defined&amp;lt;/code&amp;gt; du &amp;lt;code&amp;gt;awk&amp;lt;/code&amp;gt; de base&lt;br /&gt;
* '''sbsigntool''' : permet de signer l{{'}}''UKI'' en vu d'une validation ''Secure Boot'' (optionnel)&lt;br /&gt;
&lt;br /&gt;
==Script de génération==&lt;br /&gt;
La génération d'une ''UKI'' nécessitant la concaténation d'une multitude d'éléments, il n'est pas envisageable de renseigner l'ensemble des paramètres manuellement. Je vous propose un script permettant la création d'une image ainsi que sa rotation sur trois versions différentes (l'une écrase la précédente à chaque nouvelle exécution). &lt;br /&gt;
 vim /mnt/usr/local/sbin/gen-uki&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Récupération de la version du noyau en cours d'utilisation&lt;br /&gt;
if [[ -n &amp;quot;${1}&amp;quot; ]]; then&lt;br /&gt;
	version_noyau=&amp;quot;${1}&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
	version_noyau=&amp;quot;$(uname -r)&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Chemin vers l'initrd de travail&lt;br /&gt;
if [[ -n &amp;quot;${2}&amp;quot; ]]; then&lt;br /&gt;
	chemin_initrd=&amp;quot;${2}&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
	chemin_initrd=&amp;quot;/boot/initrd.img-${version_noyau}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Chemin vers le noyau de travail&lt;br /&gt;
if [[ -n &amp;quot;${2}&amp;quot; ]]; then&lt;br /&gt;
	chemin_noyau=&amp;quot;/boot/vmlinuz-${1}&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
	chemin_noyau=&amp;quot;/boot/vmlinuz-${version_noyau}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Définition des variables du script&lt;br /&gt;
chemin_lsb=&amp;quot;/usr/lib/os-release&amp;quot;&lt;br /&gt;
chemin_stub=&amp;quot;/usr/lib/systemd/boot/efi/linuxx64.efi.stub&amp;quot;&lt;br /&gt;
chemin_cmdline=&amp;quot;/etc/kernel/cmdline&amp;quot;&lt;br /&gt;
chemin_splash=&amp;quot;/dev/null&amp;quot;&lt;br /&gt;
nom_uki1=&amp;quot;1-debian.efi&amp;quot;&lt;br /&gt;
nom_uki2=&amp;quot;2-debian.efi&amp;quot;&lt;br /&gt;
nom_uki3=&amp;quot;3-debian.efi&amp;quot;&lt;br /&gt;
chemin_base=&amp;quot;/boot/efi/EFI/Linux/&amp;quot;&lt;br /&gt;
chemin_dst_uki=&amp;quot;${chemin_base}/${nom_uki1}&amp;quot;&lt;br /&gt;
chemin_sb_clef=&amp;quot;/usr/local/lib/secureboot/mok/MOK.priv&amp;quot;&lt;br /&gt;
chemin_sb_cert=&amp;quot;/usr/local/lib/secureboot/mok/MOK.pem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Création de l'arborescence des UKI&lt;br /&gt;
mkdir -p &amp;quot;${chemin_base}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Préparation de l'UKI&lt;br /&gt;
align=&amp;quot;$(objdump -p ${chemin_stub} | awk '{ if ($1 == &amp;quot;SectionAlignment&amp;quot;){print $2} }')&amp;quot;&lt;br /&gt;
align=$((16#$align))&lt;br /&gt;
osrel_offs=&amp;quot;$(objdump -h &amp;quot;${chemin_stub}&amp;quot; | awk 'NF==7 {size=strtonum(&amp;quot;0x&amp;quot;$3); offset=strtonum(&amp;quot;0x&amp;quot;$4)} END {print size + offset}')&amp;quot;&lt;br /&gt;
osrel_offs=$((osrel_offs + &amp;quot;$align&amp;quot; - osrel_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
cmdline_offs=$((osrel_offs + $(stat -Lc%s &amp;quot;${chemin_lsb}&amp;quot;)))&lt;br /&gt;
cmdline_offs=$((cmdline_offs + &amp;quot;$align&amp;quot; - cmdline_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
splash_offs=$((cmdline_offs + $(stat -Lc%s &amp;quot;${chemin_cmdline}&amp;quot;)))&lt;br /&gt;
splash_offs=$((splash_offs + &amp;quot;$align&amp;quot; - splash_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
initrd_offs=$((splash_offs + $(stat -Lc%s &amp;quot;${chemin_splash}&amp;quot;)))&lt;br /&gt;
initrd_offs=$((initrd_offs + &amp;quot;$align&amp;quot; - initrd_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
linux_offs=$((initrd_offs + $(stat -Lc%s &amp;quot;${chemin_initrd}&amp;quot;)))&lt;br /&gt;
linux_offs=$((linux_offs + &amp;quot;$align&amp;quot; - linux_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
# Roulement, si elle existe et n'est pas vide, de l'UKI 2 en 3&lt;br /&gt;
if [[ -s &amp;quot;${chemin_base}${nom_uki2}&amp;quot; ]]; then&lt;br /&gt;
	echo &amp;quot;Copie de l'UKI 2 en 3...&amp;quot;&lt;br /&gt;
	cp -v &amp;quot;${chemin_base}${nom_uki2}&amp;quot; &amp;quot;${chemin_base}${nom_uki3}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Roulement, si elle existe et n'est pas vide, de l'UKI 1 en 2&lt;br /&gt;
if [[ -s &amp;quot;${chemin_dst_uki}&amp;quot; ]]; then&lt;br /&gt;
	echo &amp;quot;Copie de l'UKI 1 en 2...&amp;quot;&lt;br /&gt;
	cp -v &amp;quot;${chemin_dst_uki}&amp;quot; &amp;quot;${chemin_base}${nom_uki2}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Génération de l'image noyau combinée (UKI) numéro 1...&amp;quot;&lt;br /&gt;
objcopy \&lt;br /&gt;
    --add-section .osrel=&amp;quot;${chemin_lsb}&amp;quot; --change-section-vma .osrel=$(printf 0x%x $osrel_offs) \&lt;br /&gt;
    --add-section .cmdline=&amp;quot;${chemin_cmdline}&amp;quot; --change-section-vma .cmdline=$(printf 0x%x $cmdline_offs) \&lt;br /&gt;
    --add-section .splash=&amp;quot;${chemin_splash}&amp;quot; --change-section-vma .splash=$(printf 0x%x $splash_offs) \&lt;br /&gt;
    --add-section .initrd=&amp;quot;${chemin_initrd}&amp;quot; --change-section-vma .initrd=$(printf 0x%x $initrd_offs) \&lt;br /&gt;
    --add-section .linux=&amp;quot;${chemin_noyau}&amp;quot; --change-section-vma .linux=$(printf 0x%x $linux_offs) \&lt;br /&gt;
    &amp;quot;${chemin_stub}&amp;quot; &amp;quot;${chemin_dst_uki}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Signature de l'UKI pour la vérification Secure Boot seulement si la clé et son certificat son présents&lt;br /&gt;
if [[ -r &amp;quot;${chemin_sb_clef}&amp;quot; &amp;amp;&amp;amp; -r &amp;quot;${chemin_sb_cert}&amp;quot; ]]; then&lt;br /&gt;
	sbsign --key &amp;quot;${chemin_sb_clef}&amp;quot; --cert &amp;quot;${chemin_sb_cert}&amp;quot; --output &amp;quot;${chemin_dst_uki}&amp;quot; &amp;quot;${chemin_dst_uki}&amp;quot;&lt;br /&gt;
	sbverify --cert &amp;quot;${chemin_sb_cert}&amp;quot; &amp;quot;${chemin_dst_uki}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les [[Paramètres linux|paramètres]] du noyau (de la variable &amp;lt;code&amp;gt;$chemin_cmdline&amp;lt;/code&amp;gt;) doivent contenir les informations sur votre système de fichier racine afin que ''Linux'' puisse l'amorcer. Vous pouvez vous appuyer sur l'exemple ci-dessous qui comprend une partition chiffrée contenant un sous-volume ''BTRFS''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;root=UUID=${uuid_racine} cryptdevice=UUID=${uuid_luks} ro rootflags=subvol=@rootfs console=tty0 console=ttyS0,115200n8&amp;quot; &amp;gt; /mnt/etc/kernel/cmdline&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pensez bien entendu à remplacer les variables par vos propres valeurs...&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également vous appuyer sur le &amp;lt;code&amp;gt;/proc/cmdline&amp;lt;/code&amp;gt; pour visualiser les paramètres utilisés par votre propre système afin de vous en inspirer. La liste des paramètres possible est visualisable dans la [https://www.kernel.org/doc/html/v6.5/admin-guide/kernel-parameters.html documentation] du noyau.&lt;br /&gt;
&lt;br /&gt;
 chmod u+x /usr/local/sbin/gen-uki&lt;br /&gt;
&lt;br /&gt;
==Automatisation==&lt;br /&gt;
Le script ainsi créé peut être lancé manuellement mais il est préférable qu'il soit appelé à chaque mise à jour de noyau ou d{{'}}''initrd'' afin de garantir un démarrage sur la dernière version disponible. Cette dépendance se créée en l'exposant dans les répertoire de post-construction de nos deux composants d'intérêts.&lt;br /&gt;
&lt;br /&gt;
 mkdir -p /etc/initramfs/post-update.d&lt;br /&gt;
 ln -s /usr/local/sbin/gen-uki /etc/initramfs/post-update.d/zz-gen-uki&lt;br /&gt;
 ln -s /usr/local/sbin/gen-uki /etc/kernel/postinst.d/zz-gen-uki&lt;br /&gt;
 chmod u+x /etc/initramfs/post-update.d/zz-gen-uki /etc/kernel/postinst.d/zz-gen-uki&lt;br /&gt;
&lt;br /&gt;
{{info|Le répertoire &amp;lt;code&amp;gt;/etc/initramfs/post-update.d&amp;lt;/code&amp;gt; n'est pas créé par défaut dans ''GNU/Linux Debian'' mais est bien parcouru lors de la génération d'une nouvelle archive d{{'}}''init''.}}&lt;br /&gt;
&lt;br /&gt;
==Création des entrées de démarrage==&lt;br /&gt;
Dans l'optique d'optimiser au mieux le démarrage de notre machine, nous n'utiliserons aucun chargeur d'amorçage. Nous créerons alors des entrées de démarrage dans notre  ''UEFI'' pointant directement sur nos ''UKI'' (son menu nous permettra de sélectionner la version à lancer). Pour se faire, il est possible de passer par l'interface de celui-ci (lorsque l'option est disponible) ou via l'outil [[Efibootmgr]] (universel). Voici un exemple pour les trois générées par le script (il est possible de créer les entrées avant les images) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
disque_systeme=/dev/nvme0n1&lt;br /&gt;
&lt;br /&gt;
efibootmgr -c -d &amp;quot;${disque_systeme}&amp;quot; -p 1 -l '\EFI\Linux\1-debian.efi' -L &amp;quot;Debian UKI 1&amp;quot;&lt;br /&gt;
efibootmgr -c -d &amp;quot;${disque_systeme}&amp;quot; -p 1 -l '\EFI\Linux\2-debian.efi' -L &amp;quot;Debian UKI 2&amp;quot;&lt;br /&gt;
efibootmgr -c -d &amp;quot;${disque_systeme}&amp;quot; -p 1 -l '\EFI\Linux\3-debian.efi' -L &amp;quot;Debian UKI 3&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi, dans le cas malencontreux où une mise à jour de noyau ou une reconstruction d{{'}}''initrd'' occasionne une impossibilité à démarrer, les versions précédentes de votre image vous permettront de vous en sortir.&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://uapi-group.org/specifications/specs/unified_kernel_image/&lt;br /&gt;
* https://0pointer.de/blog/brave-new-trusted-boot-world.html&lt;br /&gt;
* https://wiki.debian.org/EFIStub#Setting_up_a_Unified_Kernel_Image&lt;br /&gt;
&lt;br /&gt;
=Secure Boot=&lt;br /&gt;
&lt;br /&gt;
{{info|Cette section est facultative.}}&lt;br /&gt;
&lt;br /&gt;
''Secure Boot'' ([https://uefi.org/sites/default/files/resources/UEFI_Spec_2_3_1.pdf chapitre 27] des spécification ''UEFI'') est une fonctionnalité apparue avec la version 2.3.1 de l{{'}}''UEFI'' permettant de borner l'amorçage aux seuls systèmes dont la signature cryptographique est reconnue par sa base interne. Son intérêt principal est d'empêcher l'exécution de code ayant été ajouté à l{{'}}''UEFI PE'' à l'insu de l'administrateur de la machine mais il peut également servir, entre-autre, à empêcher tout autre système (amorçage ''USB'' par exemple) de démarrer.&lt;br /&gt;
&lt;br /&gt;
Afin que cette fonction ai un sens, il est préférable de n'autoriser que vos propres clés. Ceci n'est malheureusement pas possible sur la plupart des ''PC'' du marcher. En effet, les ''UEFI'' des machines grand publique embarquent celles de ''Microsoft'' pour le démarrage de ''Windows'' (obligatoire pour bénéficier de la certification idoine) et elles ne proposent pas (dans toutes celles que j'ai vu) de fonction pour gérer la base interne de clés (elles ne proposent bien souvent même pas d'administrer les entrées de démarrage...). Il est peut-être possible de contourner cette limitation avec l'outil &amp;lt;code&amp;gt;mokutil&amp;lt;/code&amp;gt; mais je n'ai pas creusé cette piste... La problématique des clés ''Microsoft'' est bien entendu que leur présence rend caduc l'exclusivité de la validité de vos signatures. Qui peut utiliser leur clé ? L'administration de ce paramètre semble donc réservée aux ordinateurs professionnels (les ''DELL XPS'' le permettent) et aux plateformes serveurs.&lt;br /&gt;
&lt;br /&gt;
Il convient en outre de s'assurer qu'aucun accès physique non autorisé à la machine n'a lieu car les gros malins qui ont rédigés les spécifications de l{{'}}''UEFI'' n'ont pas crus bon d'imposer le stockage de sa configuration en mémoire morte... L'utilisation d'une mémoire vive maintenue par une pile comme sur l'antique ''BIOS'' ayant retenu leur préférence, le débranchement de cette dernière engendrera une réinitialisation complète des paramètres et de la base de clés ''Secure Boot'' (permettant ainsi l'introduction de toute forme de charges utiles au démarrage). Ceci aura donc pour effet de ruiner la mince barrière de sécurité que nous venons de mettre en place...&lt;br /&gt;
&lt;br /&gt;
Enfin, un mot de passe d'accès aux paramètres de l{{'}}''UEFI'' reste tout de même une pratique à suivre afin de vous assurer qu'aucune injection de clé non autorisée n'ai lieu. Dans le cas d'une réinitialisation par débranchement de la pile, vous saurez au moins qu'une action physique a été opérée sur la machine et pourrez entreprendre les mesures qui s'imposent (à commencer par ne surtout pas taper votre phrase de passe [[Cryptsetup|LUKS]] !). Vous pourrez par la suite vérifier la signature de votre ''UKI'' via un autre système pour s'assurer de son intégrité (pensez également à vérifier la présence d'enregistreurs de frappes [https://www.youtube.com/watch?v=AMzv6ymmUcw matériels]).&lt;br /&gt;
&lt;br /&gt;
==Glossaire==&lt;br /&gt;
La base de clés de ''Secure Boot'' comporte cinq [https://www.malekal.com/quest-ce-que-secure-boot-protection-pc-uefi-comment-ca-marche/ sections] :&lt;br /&gt;
* '''MOK''' (''Machine Owner Key'') : base de données contenant les clés de l'utilisateur - inutile pour cette procédure&lt;br /&gt;
* '''PK''' (''Plateform Key'') : base de données contenant les clés de la machine - utile pour cette procédure&lt;br /&gt;
* '''DB''' (''Data Base'') : base de données des clés autorisées (liste blanche) - utile pour cette procédure&lt;br /&gt;
* '''KEK''' (''Key Exchange Keys'') : aucune idée - inutile pour cette procédure&lt;br /&gt;
* '''DBX''' : (''Data Base'' &amp;lt;introuvable dans les specs mais probablement ''Exclusion''&amp;gt;)  : base de données des clés interdites (liste noire) - inutile pour cette procédure&lt;br /&gt;
&lt;br /&gt;
==Génération de clés==&lt;br /&gt;
Création du répertoire de travail&lt;br /&gt;
 mkdir -p /usr/local/lib/secureboot/mok&lt;br /&gt;
&lt;br /&gt;
Génération d'une clé privée ''RSA'' 4096 bits (le maximum possible avec ''Shim'' - que nous n'utilisons pas - est, aux dernières nouvelles ([https://wiki.debian.org/SecureBoot#Generating_a_new_key 21/06/2022]) 2048 bits) et d'un certificat public associé&lt;br /&gt;
 openssl req -nodes -new -x509 -newkey rsa:4096 -keyout /usr/local/lib/secureboot/mok/MOK.priv -outform DER -out /usr/local/lib/secureboot/mok/MOK.der -days 36500 -subj &amp;quot;/CN=Mon Nom/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Conversion du certificat en ''PEM'' afin d'être utilisable par &amp;lt;code&amp;gt;sbsign&amp;lt;/code&amp;gt;&lt;br /&gt;
 openssl x509 -inform der -in /usr/local/lib/secureboot/mok/MOK.der -out /usr/local/lib/secureboot/mok/MOK.pem&lt;br /&gt;
&lt;br /&gt;
Empêcher la lecture de ces fichiers par un autre utilisateur que root&lt;br /&gt;
 chmod 400 /usr/local/lib/secureboot/mok/{MOK.priv,MOK.der,MOK.pem}&lt;br /&gt;
&lt;br /&gt;
Les étapes qui suivent sont réalisées automatiquement par le script créé plus haut et sont notées à titre indicatif.&lt;br /&gt;
&lt;br /&gt;
Le certificat au format ''PEM'' est utilisé par les commandes du paquet &amp;lt;code&amp;gt;sbsigntool&amp;lt;/code&amp;gt; alors que la ''DER'' est utilisée par les ''UEFI'' (pourquoi utiliser le même format hein ?). il doit être renseignée deux fois dans les menus de gestion des clés de votre carte mère :&lt;br /&gt;
* une fois dans ''Plateform Key'' (''PK'')&lt;br /&gt;
* l'autre dans ''DB'' (''Authorized Signatures'')&lt;br /&gt;
&lt;br /&gt;
Le certificat ''DER'' doit être accessible à l{{'}}''UEFI'' pour injection. Vous pouvez le mettre dans toute partition ''FAT'' comme votre ''ESP'' &amp;lt;code&amp;gt;/boot/efi/EFI/&amp;lt;/code&amp;gt; ou sur une clé ''USB'' afin de l'y sélectionner depuis le menu dédié (peut être supprimé à l'issue).&lt;br /&gt;
&lt;br /&gt;
==Signature de l'image==&lt;br /&gt;
Dans la commande qui suit, la signature de l'image va réécrir par dessus l'originale (sa somme de contrôle va changer). Ce comportement est volontaire mais peut être changé en modifiant la valeur de &amp;lt;code&amp;gt;--output&amp;lt;/code&amp;gt;&lt;br /&gt;
 sbsign --key /usr/local/lib/secureboot/mok/MOK.priv --cert /usr/local/lib/secureboot/mok/MOK.pem --output /boot/efi/EFI/Linux/1-debian.efi /boot/efi/EFI/Linux/1-debian.efi&lt;br /&gt;
&lt;br /&gt;
Vérification de la signature&lt;br /&gt;
 sbverify --cert /usr/local/lib/secureboot/mok/MOK.pem /boot/efi/EFI/Linux/1-debian.efi&lt;br /&gt;
&lt;br /&gt;
Une fois ''Secure Boot'' activé et votre système démarré, vous pouvez vérifier l'effectivité de cette fonctionnalité via la commande suivante du paquet &amp;lt;code&amp;gt;mokutil&amp;lt;/code&amp;gt;&lt;br /&gt;
 mokutil --sb-state&lt;br /&gt;
&lt;br /&gt;
{{astuce|La signature d'un module noyau complilé par vous même peut se faire via la commande suivante (exemple pour le pilote &amp;lt;code&amp;gt;ixgbe&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;/usr/lib/linux-kbuild-6.1/scripts/sign-file sha512 /usr/local/lib/secureboot/mok/MOK.{priv,der} /lib/modules/6.1.0-17-amd64/updates/drivers/net/ethernet/intel/ixgbe/ixgbe.ko /tmp/ixgbe.ko&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://uefi.org/specifications&lt;br /&gt;
* https://wiki.debian.org/SecureBoot#Generating_a_new_key&lt;br /&gt;
* https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-secure-boot-key-creation-and-management-guidance?view=windows-11&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Ipxe&amp;diff=1508</id>
		<title>Ipxe</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Ipxe&amp;diff=1508"/>
		<updated>2024-02-28T11:17:51Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout d'une explication sur la compilation multi-plateforme + remplacement des balises sources obsolètes + ajout d'un lien en introduction + corrections typographiques&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:pxe]]&lt;br /&gt;
[https://ipxe.org/start IPXE] est une ''ROM'' contenant un micrologiciel permettant d'amorcer un système depuis le réseau (comme celui intégré aux cartes mères). Sa particularité réside dans le fait qu'il ne se limite pas à une utilisation basique du protocole ''PXE'' mais va beaucoup plus loin. Il est notamment possible d'amorcer un système via ''HTTP/HTTPS'', ''FTP'', ''SLAM'', ''NFS'' et ''ISCSI'' en plus du ''TFTP/TFTP-Multicast'' traditionnel. Il est également capable d’exécuter des scripts et on peut le personnaliser avant sa compilation pour intégrer plus ou moins de fonctionnalité en fonction des besoins.&lt;br /&gt;
&lt;br /&gt;
Une image IPXE pré-compilée est disponible sur le [http://ipxe.org site officiel] à [http://boot.ipxe.org/ipxe.iso cette adresse]. Nous allons détailler les étapes de compilation manuelles. Il est à noter que l'usage de l'outil en ligne ([https://github.com/xbgmsharp/ipxe-buildweb/ auto-hébergeable]) https://rom-o-matic.eu/ permet une compilation à distance en cliquant sur les éléments que l'on veut intégrer à notre image.&lt;br /&gt;
&lt;br /&gt;
=Compilation=&lt;br /&gt;
'''Installation des dépendances'''&lt;br /&gt;
 apt install git make gcc perl binutils liblzma-dev genisoimage&lt;br /&gt;
&lt;br /&gt;
'''Téléchargement des sources'''&lt;br /&gt;
 git clone git://git.ipxe.org/ipxe.git&lt;br /&gt;
&lt;br /&gt;
'''Édition du fichier de configuration'''&lt;br /&gt;
&lt;br /&gt;
L'outil ''make'' lit le fichier de configuration &amp;lt;code&amp;gt;./src/config/general.h&amp;lt;/code&amp;gt; pour déterminer les modules à intégrer à la compilation.&lt;br /&gt;
&lt;br /&gt;
Tout les paramètres à prendre en compte doivent être précédés par un croisillon (&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;). Les modules à définir doivent êtres passés en paramètre à &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt; et ceux qui ne doivent pas l'être, à &amp;lt;code&amp;gt;undefine&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aussi, voici ce que nous avons pour la gestion de l{{'}}''IPv6'', du ''NFS'' et de l{{'}}''ISCSI'' (fichier partiel, j'ai juste mis ce que j'ai modifié en remplaçant les autres lignes par &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;) :&lt;br /&gt;
&lt;br /&gt;
 cd ./ipxe/src/&lt;br /&gt;
 vim config/general.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
#define NET_PROTO_IPV6          /* IPv6 protocol */&lt;br /&gt;
...&lt;br /&gt;
#define DOWNLOAD_PROTO_NFS&lt;br /&gt;
...&lt;br /&gt;
#define SANBOOT_PROTO_ISCSI&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 make -j 9&lt;br /&gt;
&lt;br /&gt;
Un fichier &amp;lt;code&amp;gt;bin/ipxe.iso&amp;lt;/code&amp;gt; a été créé. Nous y trouvons également d'autre fichiers tel que des ''ROM'' pour cartes réseau et un noyau Linux ''iPXE'' (''ipxe.lkrn'') permettant l'amorçage par le réseau via ''pxelinux'' (nous utilisons ce dernier dans notre documentation sur l'[[Installation Windows via PXE|Installation de Windows via PXE]]).&lt;br /&gt;
&lt;br /&gt;
'''Multi-plateforme'''&lt;br /&gt;
&lt;br /&gt;
Pour compiler l'outil sur les plateformes ''UEFI'' (32 et 64 bits) et ''Bios'' pour amorçage ''PXE'', les commandes suivantes peuvent êtres utilisées :&lt;br /&gt;
 make bin-x86_64-efi/ipxe.efi -j 9&lt;br /&gt;
 make bin-i386-efi/ipxe.efi -j 9&lt;br /&gt;
 make bin-i386-pcbios/ipxe.pxe -j 9&lt;br /&gt;
&lt;br /&gt;
Les binaires d'amorçage sont disponibles aux noms indiqués dans les commandes pour leur plateforme respective. La liste supportés est disponible sur la page de [https://ipxe.org/appnote/buildtargets documentation] du projet.&lt;br /&gt;
&lt;br /&gt;
=Test=&lt;br /&gt;
Dés à présent, l'ISO généré peut être utilisé dans un média amorçable, un [[serveur PXE]] ou testé via [[Qemu]] comme suit :&lt;br /&gt;
 qemu-system-x86_64 -m 1024 -vga qxl -fda /tmp/ipxe/src/bin/ipxe.iso -tftp /tmp/pxe -bootp lpxelinux.0 -boot n -net user -net nic,model=e1000,macaddr=00:11:22:33:44:55 -net tap,ifname=qtap0 -netdev tap,id=t0,ifname=vnet0,script=no,downscript=no -device e1000,netdev=t0 --enable-kvm -cpu host -smp cores=2,threads=1,sockets=1&lt;br /&gt;
&lt;br /&gt;
J'ai copié les fichiers nécessaires au démarrage ''PXE'' de mon serveur dans le &amp;lt;code&amp;gt;/tmp/pxe&amp;lt;/code&amp;gt; (créé pour l'occasion) de mon hôte. L'interface réseau '''vnet0''' se créée toute seule sur l'hôte et permet une communication paire à paire avec la machine virtuelle (c'est avec ce lien que l'amorçage s'effectue). La deuxième interface permet à la ''MV'' de sortir sur le ''WAN'' si un routage est effectué dans votre réseau ou si vous utilisez du ''NAT'' comme ceci :&lt;br /&gt;
&lt;br /&gt;
 iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE&lt;br /&gt;
 echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
 ip a a 172.16.1.1/24 dev vnet0&lt;br /&gt;
 ip l set vnet0 up&lt;br /&gt;
&lt;br /&gt;
Ne pas oublié le serveur ''HTTP'' sur l'hôte (un [[Busybox#Serveur_WEB|busybox httpd]] fait très bien l'affaire) :&lt;br /&gt;
 busybox httpd -fvv -h /tmp/pxe/&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* http://ipxe.org/download&lt;br /&gt;
* https://blog.widodh.nl/2015/11/pxe-boot-over-ipv6-with-ipxe/&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Unified_kernel_image&amp;diff=1507</id>
		<title>Unified kernel image</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Unified_kernel_image&amp;diff=1507"/>
		<updated>2024-02-28T00:34:12Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Page créée avec « Category:Noyau_linux  Une Image Noyau Unifiée (INU) ou ''Unified Kernel Image'' (''UKI'') est la combinaison d'un programme de démarrage ''UEFI'', d'une image noyau ''Linux'', d'un ''initrd'' ainsi que d'autres ressources optionnelles dans un seul fichier ''UEFI [https://fr.wikipedia.org/wiki/Portable_Executable PE]''. Il peut alors être invoqué directement par : * le micrologiciel ''UEFI'' : utile notamment dans certains environnements d'informatique en... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Noyau_linux]]&lt;br /&gt;
&lt;br /&gt;
Une Image Noyau Unifiée (INU) ou ''Unified Kernel Image'' (''UKI'') est la combinaison d'un programme de démarrage ''UEFI'', d'une image noyau ''Linux'', d'un ''initrd'' ainsi que d'autres ressources optionnelles dans un seul fichier ''UEFI [https://fr.wikipedia.org/wiki/Portable_Executable PE]''. Il peut alors être invoqué directement par :&lt;br /&gt;
* le micrologiciel ''UEFI'' : utile notamment dans certains environnements d'informatique en nuage ou confidentiels&lt;br /&gt;
* un chargeur de démarrage : généralement utile pour permettre plusieurs versions de noyau avec une sélection interactive ou automatique de la version dans laquelle démarrer ([[Systemd-boot]] ou [[Grub]] permettent cela)&lt;br /&gt;
&lt;br /&gt;
L'amorçage de cette image unifiée est permise par le ''stub'', programme logé dans celle-ci et pouvant être interprété par l{{'}}''UEFI''. Il constitue donc la partie exécutable initiale de l'image combinée et charge par la suite d'autres ressources à partir du reste de l{{'}}''INU'', en particulier le noyau et l{{'}}''initrd''.&lt;br /&gt;
&lt;br /&gt;
La [https://uapi-group.org/specifications/specs/unified_kernel_image/ spécification officielle] définit le format et les composants (obligatoires et optionnels) des ''UKI'' qui sont fournis en tant que sections ''PE/COFF'' de l'exécutable.&lt;br /&gt;
&lt;br /&gt;
L'intérêt principal de cette approche est qu'elle permet de mieux sécuriser le démarrage d'un système en exposant un unique binaire (''UEFI PE'') en clair sur le disque d'amorçage (''EFI System Partition'' - ''ESP'') au lieu d'une multitude de fichiers pouvant être modifiés par le premier pirate venu. Cet exécutable pourra alors être signé par ''Secure Boot'' et permettre, entre-autre, le déchiffrement de la racine en s'assurant de l’absence de sa propre altération (enregistreur de frappes par exemple).&lt;br /&gt;
&lt;br /&gt;
=Image Noyau Unifiée=&lt;br /&gt;
==Installation des outils==&lt;br /&gt;
La génération d'une ''INU'' nécessite quelques outils. Le projet ''Systemd'' met à disposition un programme ''Python'' nommé &amp;lt;code&amp;gt;Ukify&amp;lt;/code&amp;gt; à partir de la version 253 de l{{'}}''init''. Il est logé à l'emplacement &amp;lt;code&amp;gt;/usr/lib/systemd/ukify&amp;lt;/code&amp;gt; mais nécessite la bibliothèque &amp;lt;code&amp;gt;python3-pefile&amp;lt;/code&amp;gt; et ses dépendances pour fonctionner. L'approche exposé dans ce document visant la frugalité (''Ukify'' apporte surtout une configuration épurée mais l'aspect fonctionnel est identique), le strict nécessaire sera installé.&lt;br /&gt;
 apt install --no-install-recommends systemd-boot-efi binutils gawk sbsigntool&lt;br /&gt;
&lt;br /&gt;
Détails des paquets installés :&lt;br /&gt;
* '''systemd-boot-efi''' : fournit le ''stub &amp;lt;code&amp;gt;/usr/lib/systemd/boot/efi/linuxx64.efi.stub&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''binutils''' : fournit le programme de construction du binaire ''PE'' &amp;lt;code&amp;gt;objdump&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''gawk''' : fournit la version ''GNU'' de l'interpréteur de langage ''AWK'' afin de ne pas avoir l'erreur de fonction non définie &amp;lt;code&amp;gt;function strtonum never defined&amp;lt;/code&amp;gt; du &amp;lt;code&amp;gt;awk&amp;lt;/code&amp;gt; de base&lt;br /&gt;
* '''sbsigntool''' : permet de signer l{{'}}''UKI'' en vu d'une validation ''Secure Boot'' (optionnel)&lt;br /&gt;
&lt;br /&gt;
==Script de génération==&lt;br /&gt;
La génération d'une ''UKI'' nécessitant la concaténation d'une multitude d'éléments, il n'est pas envisageable de renseigner l'ensemble des paramètres manuellement. Je vous propose un script permettant la création d'une image ainsi que sa rotation sur trois versions différentes (l'une écrase la précédente à chaque nouvelle exécution). &lt;br /&gt;
 vim /mnt/usr/local/sbin/gen-uki&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Récupération de la version du noyau en cours d'utilisation&lt;br /&gt;
if [[ -n &amp;quot;${1}&amp;quot; ]]; then&lt;br /&gt;
	version_noyau=&amp;quot;${1}&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
	version_noyau=&amp;quot;$(uname -r)&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Chemin vers l'initrd de travail&lt;br /&gt;
if [[ -n &amp;quot;${2}&amp;quot; ]]; then&lt;br /&gt;
	chemin_initrd=&amp;quot;${2}&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
	chemin_initrd=&amp;quot;/boot/initrd.img-${version_noyau}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Chemin vers le noyau de travail&lt;br /&gt;
if [[ -n &amp;quot;${2}&amp;quot; ]]; then&lt;br /&gt;
	chemin_noyau=&amp;quot;/boot/vmlinuz-${1}&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
	chemin_noyau=&amp;quot;/boot/vmlinuz-${version_noyau}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Définition des variables du script&lt;br /&gt;
chemin_lsb=&amp;quot;/usr/lib/os-release&amp;quot;&lt;br /&gt;
chemin_stub=&amp;quot;/usr/lib/systemd/boot/efi/linuxx64.efi.stub&amp;quot;&lt;br /&gt;
chemin_cmdline=&amp;quot;/etc/kernel/cmdline&amp;quot;&lt;br /&gt;
chemin_splash=&amp;quot;/dev/null&amp;quot;&lt;br /&gt;
nom_uki1=&amp;quot;1-debian.efi&amp;quot;&lt;br /&gt;
nom_uki2=&amp;quot;2-debian.efi&amp;quot;&lt;br /&gt;
nom_uki3=&amp;quot;3-debian.efi&amp;quot;&lt;br /&gt;
chemin_base=&amp;quot;/boot/efi/EFI/Linux/&amp;quot;&lt;br /&gt;
chemin_dst_uki=&amp;quot;${chemin_base}/${nom_uki1}&amp;quot;&lt;br /&gt;
chemin_sb_clef=&amp;quot;/usr/local/lib/secureboot/mok/MOK.priv&amp;quot;&lt;br /&gt;
chemin_sb_cert=&amp;quot;/usr/local/lib/secureboot/mok/MOK.pem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Création de l'arborescence des UKI&lt;br /&gt;
mkdir -p &amp;quot;${chemin_base}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Préparation de l'UKI&lt;br /&gt;
align=&amp;quot;$(objdump -p ${chemin_stub} | awk '{ if ($1 == &amp;quot;SectionAlignment&amp;quot;){print $2} }')&amp;quot;&lt;br /&gt;
align=$((16#$align))&lt;br /&gt;
osrel_offs=&amp;quot;$(objdump -h &amp;quot;${chemin_stub}&amp;quot; | awk 'NF==7 {size=strtonum(&amp;quot;0x&amp;quot;$3); offset=strtonum(&amp;quot;0x&amp;quot;$4)} END {print size + offset}')&amp;quot;&lt;br /&gt;
osrel_offs=$((osrel_offs + &amp;quot;$align&amp;quot; - osrel_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
cmdline_offs=$((osrel_offs + $(stat -Lc%s &amp;quot;${chemin_lsb}&amp;quot;)))&lt;br /&gt;
cmdline_offs=$((cmdline_offs + &amp;quot;$align&amp;quot; - cmdline_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
splash_offs=$((cmdline_offs + $(stat -Lc%s &amp;quot;${chemin_cmdline}&amp;quot;)))&lt;br /&gt;
splash_offs=$((splash_offs + &amp;quot;$align&amp;quot; - splash_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
initrd_offs=$((splash_offs + $(stat -Lc%s &amp;quot;${chemin_splash}&amp;quot;)))&lt;br /&gt;
initrd_offs=$((initrd_offs + &amp;quot;$align&amp;quot; - initrd_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
linux_offs=$((initrd_offs + $(stat -Lc%s &amp;quot;${chemin_initrd}&amp;quot;)))&lt;br /&gt;
linux_offs=$((linux_offs + &amp;quot;$align&amp;quot; - linux_offs % &amp;quot;$align&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
# Roulement, si elle existe et n'est pas vide, de l'UKI 2 en 3&lt;br /&gt;
if [[ -s &amp;quot;${chemin_base}${nom_uki2}&amp;quot; ]]; then&lt;br /&gt;
	echo &amp;quot;Copie de l'UKI 2 en 3...&amp;quot;&lt;br /&gt;
	cp -v &amp;quot;${chemin_base}${nom_uki2}&amp;quot; &amp;quot;${chemin_base}${nom_uki3}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Roulement, si elle existe et n'est pas vide, de l'UKI 1 en 2&lt;br /&gt;
if [[ -s &amp;quot;${chemin_dst_uki}&amp;quot; ]]; then&lt;br /&gt;
	echo &amp;quot;Copie de l'UKI 1 en 2...&amp;quot;&lt;br /&gt;
	cp -v &amp;quot;${chemin_dst_uki}&amp;quot; &amp;quot;${chemin_base}${nom_uki2}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Génération de l'image noyau combinée (UKI) numéro 1...&amp;quot;&lt;br /&gt;
objcopy \&lt;br /&gt;
    --add-section .osrel=&amp;quot;${chemin_lsb}&amp;quot; --change-section-vma .osrel=$(printf 0x%x $osrel_offs) \&lt;br /&gt;
    --add-section .cmdline=&amp;quot;${chemin_cmdline}&amp;quot; --change-section-vma .cmdline=$(printf 0x%x $cmdline_offs) \&lt;br /&gt;
    --add-section .splash=&amp;quot;${chemin_splash}&amp;quot; --change-section-vma .splash=$(printf 0x%x $splash_offs) \&lt;br /&gt;
    --add-section .initrd=&amp;quot;${chemin_initrd}&amp;quot; --change-section-vma .initrd=$(printf 0x%x $initrd_offs) \&lt;br /&gt;
    --add-section .linux=&amp;quot;${chemin_noyau}&amp;quot; --change-section-vma .linux=$(printf 0x%x $linux_offs) \&lt;br /&gt;
    &amp;quot;${chemin_stub}&amp;quot; &amp;quot;${chemin_dst_uki}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Signature de l'UKI pour la vérification Secure Boot seulement si la clé et son certificat son présents&lt;br /&gt;
if [[ -r &amp;quot;${chemin_sb_clef}&amp;quot; &amp;amp;&amp;amp; -r &amp;quot;${chemin_sb_cert}&amp;quot; ]]; then&lt;br /&gt;
	sbsign --key &amp;quot;${chemin_sb_clef}&amp;quot; --cert &amp;quot;${chemin_sb_cert}&amp;quot; --output &amp;quot;${chemin_dst_uki}&amp;quot; &amp;quot;${chemin_dst_uki}&amp;quot;&lt;br /&gt;
	sbverify --cert &amp;quot;${chemin_sb_cert}&amp;quot; &amp;quot;${chemin_dst_uki}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les [[Paramètres linux|paramètres]] du noyau (de la variable &amp;lt;code&amp;gt;$chemin_cmdline&amp;lt;/code&amp;gt;) doivent contenir les informations sur votre système de fichier racine afin que ''Linux'' puisse l'amorcer. Vous pouvez vous appuyer sur l'exemple ci-dessous qui comprend une partition chiffrée contenant un sous-volume ''BTRFS''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;root=UUID=${uuid_racine} cryptdevice=UUID=${uuid_luks} ro rootflags=subvol=@rootfs console=tty0 console=ttyS0,115200n8&amp;quot; &amp;gt; /mnt/etc/kernel/cmdline&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pensez bien entendu à remplacer les variables par vos propres valeurs...&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également vous appuyer sur le &amp;lt;code&amp;gt;/proc/cmdline&amp;lt;/code&amp;gt; pour visualiser les paramètres utilisés par votre propre système afin de vous en inspirer. La liste des paramètres possible est visualisable dans la [https://www.kernel.org/doc/html/v6.5/admin-guide/kernel-parameters.html documentation] du noyau.&lt;br /&gt;
&lt;br /&gt;
 chmod u+x /usr/local/sbin/gen-uki&lt;br /&gt;
&lt;br /&gt;
==Automatisation==&lt;br /&gt;
Le script ainsi créé peut être lancé manuellement mais il est préférable qu'il soit appelé à chaque mise à jour de noyau ou d{{'}}''initrd'' afin de garantir un démarrage sur la dernière version disponible. Cette dépendance se créée en l'exposant dans les répertoire de post-construction de nos deux composants d'intérêts.&lt;br /&gt;
&lt;br /&gt;
 mkdir -p /etc/initramfs/post-update.d&lt;br /&gt;
 ln -s /usr/local/sbin/gen-uki /etc/initramfs/post-update.d/zz-gen-uki&lt;br /&gt;
 ln -s /usr/local/sbin/gen-uki /etc/kernel/postinst.d/zz-gen-uki&lt;br /&gt;
 chmod u+x /etc/initramfs/post-update.d/zz-gen-uki /etc/kernel/postinst.d/zz-gen-uki&lt;br /&gt;
&lt;br /&gt;
{{info|Le répertoire &amp;lt;code&amp;gt;/etc/initramfs/post-update.d&amp;lt;/code&amp;gt; n'est pas créé par défaut dans ''GNU/Linux Debian'' mais est bien parcouru lors de la génération d'une nouvelle archive d{{'}}''init''.}}&lt;br /&gt;
&lt;br /&gt;
==Création des entrées de démarrage==&lt;br /&gt;
Dans l'optique d'optimiser au mieux le démarrage de notre machine, nous n'utiliserons aucun chargeur d'amorçage. Nous créerons alors des entrées de démarrage dans notre  ''UEFI'' pointant directement sur nos ''UKI'' (son menu nous permettra de sélectionner la version à lancer). Pour se faire, il est possible de passer par l'interface de celui-ci (lorsque l'option est disponible) ou via l'outil [[Efibootmgr]] (universel). Voici un exemple pour les trois générées par le script (il est possible de créer les entrées avant les images) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
disque_systeme=/dev/nvme0n1&lt;br /&gt;
&lt;br /&gt;
efibootmgr -c -d &amp;quot;${disque_systeme}&amp;quot; -p 1 -l '\EFI\Linux\1-debian.efi' -L &amp;quot;Debian UKI 1&amp;quot;&lt;br /&gt;
efibootmgr -c -d &amp;quot;${disque_systeme}&amp;quot; -p 1 -l '\EFI\Linux\2-debian.efi' -L &amp;quot;Debian UKI 2&amp;quot;&lt;br /&gt;
efibootmgr -c -d &amp;quot;${disque_systeme}&amp;quot; -p 1 -l '\EFI\Linux\3-debian.efi' -L &amp;quot;Debian UKI 3&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi, dans le cas malencontreux où une mise à jour de noyau ou une reconstruction d{{'}}''initrd'' occasionne une impossibilité à démarrer, les versions précédentes de votre image vous permettront de vous en sortir.&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://uapi-group.org/specifications/specs/unified_kernel_image/&lt;br /&gt;
* https://0pointer.de/blog/brave-new-trusted-boot-world.html&lt;br /&gt;
* https://wiki.debian.org/EFIStub#Setting_up_a_Unified_Kernel_Image&lt;br /&gt;
&lt;br /&gt;
=Secure Boot=&lt;br /&gt;
&lt;br /&gt;
{{info|Cette section est facultative.}}&lt;br /&gt;
&lt;br /&gt;
''Secure Boot'' ([https://uefi.org/sites/default/files/resources/UEFI_Spec_2_3_1.pdf chapitre 27] des spécification ''UEFI'') est une fonctionnalité apparue avec la version 2.3.1 de l{{'}}''UEFI'' permettant de borner l'amorçage aux seuls systèmes dont la signature cryptographique est reconnue par sa base interne. Son intérêt principal est d'empêcher l'exécution de code ayant été ajouté à l{{'}}''UEFI PE'' à l'insu de l'administrateur de la machine mais il peut également servir, entre-autre, à empêcher tout autre système (amorçage ''USB'' par exemple) de démarrer.&lt;br /&gt;
&lt;br /&gt;
Afin que cette fonction ai un sens, il est préférable de n'autoriser que vos propres clés. Ceci n'est malheureusement pas possible sur la plupart des ''PC'' du marcher. En effet, les ''UEFI'' des machines grand publique embarquent celles de ''Microsoft'' pour le démarrage de ''Windows'' (obligatoire pour bénéficier de la certification idoine) et elles ne proposent pas (dans toutes celles que j'ai vu) de fonction pour gérer la base interne de clés (elles ne proposent bien souvent même pas d'administrer les entrées de démarrage...). Il est peut-être possible de contourner cette limitation avec l'outil &amp;lt;code&amp;gt;mokutil&amp;lt;/code&amp;gt; mais je n'ai pas creusé cette piste... La problématique des clés ''Microsoft'' est bien entendu que leur présence rend caduc l'exclusivité de la validité de vos signatures. Qui peut utiliser leur clé ? L'administration de ce paramètre semble donc réservée aux ordinateurs professionnels (les ''DELL XPS'' le permettent) et aux plateformes serveurs.&lt;br /&gt;
&lt;br /&gt;
Enfin, il convient de s'assurer qu'aucun accès physique non autorisé à la machine n'a lieu car les gros malins qui ont rédigés les spécifications de l{{'}}''UEFI'' n'ont pas crus bon d'imposer le stockage de sa configuration en mémoire morte... L'utilisation d'une mémoire vive maintenue par une pile comme sur l'antique ''BIOS'' ayant retenu leur préférence, le débranchement de cette dernière engendrera une réinitialisation complète des paramètres et de la base de clés ''Secure Boot'' (permettant ainsi l'introduction de toute forme de charges utiles au démarrage), ce qui ruinera la mince barrière de sécurité que nous venons de mettre en place...&lt;br /&gt;
&lt;br /&gt;
==Glossaire==&lt;br /&gt;
La base de clés de ''Secure Boot'' comporte cinq [https://www.malekal.com/quest-ce-que-secure-boot-protection-pc-uefi-comment-ca-marche/ sections] :&lt;br /&gt;
* '''MOK''' (''Machine Owner Key'') : base de données contenant les clés de l'utilisateur - inutile pour cette procédure&lt;br /&gt;
* '''PK''' (''Plateform Key'') : base de données contenant les clés de la machine - utile pour cette procédure&lt;br /&gt;
* '''DB''' (''Data Base'') : base de données des clés autorisées (liste blanche) - utile pour cette procédure&lt;br /&gt;
* '''KEK''' (''Key Exchange Keys'') : aucune idée - inutile pour cette procédure&lt;br /&gt;
* '''DBX''' : (''Data Base'' &amp;lt;introuvable dans les specs mais probablement ''Exclusion''&amp;gt;)  : base de données des clés interdites (liste noire) - inutile pour cette procédure&lt;br /&gt;
&lt;br /&gt;
==Génération de clés==&lt;br /&gt;
Création du répertoire de travail&lt;br /&gt;
 mkdir -p /usr/local/lib/secureboot/mok&lt;br /&gt;
&lt;br /&gt;
Génération d'une clé privée ''RSA'' 4096 bits (le maximum possible avec ''Shim'' - que nous n'utilisons pas - est, aux dernières nouvelles ([https://wiki.debian.org/SecureBoot#Generating_a_new_key 21/06/2022]) 2048 bits) et d'un certificat public associé&lt;br /&gt;
 openssl req -nodes -new -x509 -newkey rsa:4096 -keyout /usr/local/lib/secureboot/mok/MOK.priv -outform DER -out /usr/local/lib/secureboot/mok/MOK.der -days 36500 -subj &amp;quot;/CN=Mon Nom/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Conversion du certificat en ''PEM'' afin d'être utilisable par &amp;lt;code&amp;gt;sbsign&amp;lt;/code&amp;gt;&lt;br /&gt;
 openssl x509 -inform der -in /usr/local/lib/secureboot/mok/MOK.der -out /usr/local/lib/secureboot/mok/MOK.pem&lt;br /&gt;
&lt;br /&gt;
Empêcher la lecture de ces fichiers par un autre utilisateur que root&lt;br /&gt;
 chmod 400 /usr/local/lib/secureboot/mok/{MOK.priv,MOK.der,MOK.pem}&lt;br /&gt;
&lt;br /&gt;
Les étapes qui suivent sont réalisées automatiquement par le script créé plus haut et sont notées à titre indicatif.&lt;br /&gt;
&lt;br /&gt;
Le certificat au format ''PEM'' est utilisé par les commandes du paquet &amp;lt;code&amp;gt;sbsigntool&amp;lt;/code&amp;gt; alors que la ''DER'' est utilisée par les ''UEFI'' (pourquoi utiliser le même format hein ?). il doit être renseignée deux fois dans les menus de gestion des clés de votre carte mère :&lt;br /&gt;
* une fois dans ''Plateform Key'' (''PK'')&lt;br /&gt;
* l'autre dans ''DB'' (''Authorized Signatures'')&lt;br /&gt;
&lt;br /&gt;
Le certificat ''DER'' doit être accessible à l{{'}}''UEFI'' pour injection. Vous pouvez le mettre dans toute partition ''FAT'' comme votre ''ESP'' &amp;lt;code&amp;gt;/boot/efi/EFI/&amp;lt;/code&amp;gt; ou sur une clé ''USB'' afin de l'y sélectionner depuis le menu dédié (peut être supprimé à l'issue).&lt;br /&gt;
&lt;br /&gt;
==Signature de l'image==&lt;br /&gt;
Dans la commande qui suit, la signature de l'image va réécrir par dessus l'originale (sa somme de contrôle va changer). Ce comportement est volontaire mais peut être changé en modifiant la valeur de &amp;lt;code&amp;gt;--output&amp;lt;/code&amp;gt;&lt;br /&gt;
 sbsign --key /usr/local/lib/secureboot/mok/MOK.priv --cert /usr/local/lib/secureboot/mok/MOK.pem --output /boot/efi/EFI/Linux/1-debian.efi /boot/efi/EFI/Linux/1-debian.efi&lt;br /&gt;
&lt;br /&gt;
Vérification de la signature&lt;br /&gt;
 sbverify --cert /usr/local/lib/secureboot/mok/MOK.pem /boot/efi/EFI/Linux/1-debian.efi&lt;br /&gt;
&lt;br /&gt;
Une fois ''Secure Boot'' activé et votre système démarré, vous pouvez vérifier l'effectivité de cette fonctionnalité via la commande suivante du paquet &amp;lt;code&amp;gt;mokutil&amp;lt;/code&amp;gt;&lt;br /&gt;
 mokutil --sb-state&lt;br /&gt;
&lt;br /&gt;
{{astuce|La signature d'un module noyau complilé par vous même peut se faire via la commande suivante (exemple pour le pilote &amp;lt;code&amp;gt;ixgbe&amp;lt;/code&amp;gt;) : &amp;lt;code&amp;gt;/usr/lib/linux-kbuild-6.1/scripts/sign-file sha512 /usr/local/lib/secureboot/mok/MOK.{priv,der} /lib/modules/6.1.0-17-amd64/updates/drivers/net/ethernet/intel/ixgbe/ixgbe.ko /tmp/ixgbe.ko&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://uefi.org/specifications&lt;br /&gt;
* https://wiki.debian.org/SecureBoot#Generating_a_new_key&lt;br /&gt;
* https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-secure-boot-key-creation-and-management-guidance?view=windows-11&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Unbound&amp;diff=1506</id>
		<title>Unbound</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Unbound&amp;diff=1506"/>
		<updated>2024-02-10T22:26:49Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout de la section &amp;quot;Convertir une liste de domaines en RPZ&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Service_dns]]&lt;br /&gt;
&lt;br /&gt;
[https://www.nlnetlabs.nl/projects/unbound/about/ Unbound] est un serveur ''DNS'' faisant office de résolveur récursif et pouvant faire autorité sur des domaines locaux. Il est développé par [https://www.nlnetlabs.nl/ NLnet Labs] et se veut à la fois complet en fonctionnalité, léger (grâce à la modularité de ces dernières) et simple à configurer.&lt;br /&gt;
&lt;br /&gt;
=Installation et configuration=&lt;br /&gt;
Installation du service avec une ''Debian Bullseye''&lt;br /&gt;
 apt install --no-install-recommends unbound&lt;br /&gt;
&lt;br /&gt;
Afin d'utiliser directement les serveurs racines pour la résolution récursive des requêtes clientes, il faut télécharger [https://{{SERVERNAME}}/fichiers/services/dns/root.hints la liste] contenant leurs adresses&lt;br /&gt;
 wget https://www.internic.net/domain/named.root -O /var/lib/unbound/root.hints &amp;amp;&amp;amp; chown unbound:unbound /var/lib/unbound/root.hints&lt;br /&gt;
&lt;br /&gt;
Le fichier de configuration suivant sera utilisé&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nestedtext&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /etc/unbound/unbound.conf&lt;br /&gt;
# Fichier de configuration d'Unbound pour Debian.&lt;br /&gt;
#&lt;br /&gt;
# Référez-vous à la page de manuel unbound.conf(5).&lt;br /&gt;
#&lt;br /&gt;
# Voyez /usr/share/doc/unbound/examples/unbound.conf pour un&lt;br /&gt;
# fichier de configuration de référence commenté.&lt;br /&gt;
#&lt;br /&gt;
# La ligne suivante permet d'inclure les fichiers de configuration&lt;br /&gt;
# additionnels depuis le répertoire /etc/unbound/unbound.conf.d.&lt;br /&gt;
include-toplevel: &amp;quot;/etc/unbound/unbound.conf.d/*.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
server:&lt;br /&gt;
statistics-interval: 0&lt;br /&gt;
extended-statistics: yes&lt;br /&gt;
statistics-cumulative: yes&lt;br /&gt;
verbosity: 3&lt;br /&gt;
&lt;br /&gt;
# Paramètres réseau&lt;br /&gt;
interface: 127.0.0.1&lt;br /&gt;
interface: 192.168.1.5&lt;br /&gt;
port: 53&lt;br /&gt;
do-ip4: yes&lt;br /&gt;
do-ip6: no&lt;br /&gt;
do-udp: yes&lt;br /&gt;
do-tcp: no&lt;br /&gt;
&lt;br /&gt;
# Contrôle d'accès&lt;br /&gt;
access-control: 127.0.0.0/8 allow&lt;br /&gt;
access-control: 192.168.0.0/16 allow&lt;br /&gt;
access-control: 0.0.0.0/0 refuse&lt;br /&gt;
&lt;br /&gt;
# DNSSEC&lt;br /&gt;
# auto-trust-anchor-file: &amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
harden-dnssec-stripped: yes&lt;br /&gt;
&lt;br /&gt;
# Adresses des serveurs racine&lt;br /&gt;
root-hints: &amp;quot;/var/lib/unbound/root.hints&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Paramètres système&lt;br /&gt;
hide-identity: yes&lt;br /&gt;
hide-version: yes&lt;br /&gt;
harden-glue: yes&lt;br /&gt;
use-caps-for-id: yes&lt;br /&gt;
cache-min-ttl: 3600&lt;br /&gt;
cache-max-ttl: 86400&lt;br /&gt;
prefetch: yes&lt;br /&gt;
num-threads: 6&lt;br /&gt;
msg-cache-slabs: 16&lt;br /&gt;
rrset-cache-slabs: 16&lt;br /&gt;
infra-cache-slabs: 16&lt;br /&gt;
key-cache-slabs: 16&lt;br /&gt;
rrset-cache-size: 256m&lt;br /&gt;
msg-cache-size: 128m&lt;br /&gt;
so-rcvbuf: 1m&lt;br /&gt;
unwanted-reply-threshold: 10000&lt;br /&gt;
do-not-query-localhost: yes&lt;br /&gt;
val-clean-additional: yes&lt;br /&gt;
&lt;br /&gt;
# Journalisation&lt;br /&gt;
use-syslog: no&lt;br /&gt;
logfile: /var/log/unbound.log&lt;br /&gt;
&lt;br /&gt;
# Paramètres du cache&lt;br /&gt;
cache-min-ttl: 3600&lt;br /&gt;
cache-max-ttl: 86400&lt;br /&gt;
prefetch: yes&lt;br /&gt;
prefetch-key: yes&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est possible de servir des domaines locaux (faire autorité)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nestedtext&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /etc/unbound/unbound.conf.d/ycharbi.yo.conf&lt;br /&gt;
server:&lt;br /&gt;
local-zone: &amp;quot;ycharbi.yo.&amp;quot; static&lt;br /&gt;
local-data: &amp;quot;ycharbi.yo. IN A 192.168.1.1&amp;quot;&lt;br /&gt;
local-data: &amp;quot;toto1.ycharbi.yo. IN A 192.168.1.25&amp;quot;&lt;br /&gt;
local-data: &amp;quot;ycharbi.yo. IN MX 10 toto1.ycharbi.yo.&amp;quot;&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est également possible de rediriger des requêtes clientes après modification (''DNS'' menteur aussi appelée ''Reponse Policy Zone'' ou ''RPZ'') afin d’interdire l'accès à certains domaines. J'utilise cette fonctionnalité à deux fins :&lt;br /&gt;
* Servir mon [[Debmirror|miroir de dépôt local]] à toute mes machines sans avoir à changer leur [[Sources.list|configuration]]&lt;br /&gt;
* Éviter certains sites irrespectueux des données personnelles (utilisation d'une liste automatique [[#Liste_RPZ_automatique|plus bas]])&lt;br /&gt;
&lt;br /&gt;
Il est à noter que tous les sous-domaines de chaque entrée sont automatiquement pris en compte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nestedtext&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /etc/unbound/unbound.conf.d/rpz.conf&lt;br /&gt;
server:&lt;br /&gt;
# Miroirs de dépôts APT Debian&lt;br /&gt;
local-zone: &amp;quot;ftp.fr.debian.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;ftp.fr.debian.org A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;http.debian.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;http.debian.net A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;deb.debian.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;deb.debian.org A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;security.debian.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;security.debian.org A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;httpredir.debian.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;httpredir.debian.org A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;debian.map.fastlydns.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;debian.map.fastlydns.net A 192.168.1.77&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# APT utilise aussi des champs SRV pour résoudre l'adresse des miroirs&lt;br /&gt;
local-zone: &amp;quot;prod.debian.map.fastly.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;prod.debian.map.fastly.net A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;dpvctowv9b08b.cloudfront.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;dpvctowv9b08b.cloudfront.net A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;_http._tcp.deb.debian.org.&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;_http._tcp.deb.debian.org. 3600 IN SRV 10 1 80 prod.debian.map.fastly.net.&amp;quot;&lt;br /&gt;
local-data: &amp;quot;_http._tcp.deb.debian.org. 3600 IN SRV 10 1 80 dpvctowv9b08b.cloudfront.net.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Saloperies à supprimer&lt;br /&gt;
local-zone: &amp;quot;doubleclick.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;doubleclick.net A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;googlesyndication.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;googlesyndication.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;googleadservices.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;googleadservices.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;google-analytics.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;google-analytics.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;ads.youtube.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;ads.youtube.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;adserver.yahoo.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;adserver.yahoo.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;ask.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;ask.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;facebook.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;facebook.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;truste-svc.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;truste-svc.net A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;trustarc.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;trustarc.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;gstatic.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;gstatic.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;consent.google.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;consent.google.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;consent.youtube.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;consent.youtube.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;cdn.privacy-mgmt.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;cdn.privacy-mgmt.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;privacy-mgmt.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;privacy-mgmt.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;cdn.cookielaw.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;cdn.cookielaw.org A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;digitalfeedback.us.confirmit.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;digitalfeedback.us.confirmit.com A 127.0.0.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Télémétrie Mozilla&lt;br /&gt;
local-zone: &amp;quot;incoming.telemetry.mozilla.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;incoming.telemetry.mozilla.org A 127.0.0.1&amp;quot;&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vérification de la configuration du service&lt;br /&gt;
 unbound-checkconf&lt;br /&gt;
&lt;br /&gt;
Redémarrage du service&lt;br /&gt;
 systemctl restart unbound&lt;br /&gt;
&lt;br /&gt;
Il est également possible de recharger la configuration sans relancer le logiciel. Cela a pour effet de ne pas le faire planter si jamais un fichier de configuration contient une erreur&lt;br /&gt;
 unbound-control reload&lt;br /&gt;
&lt;br /&gt;
Enfin, il est possible de configurer le système du serveur pour utiliser notre résolveur local et ne pas dépendre d'un résolveur de plus haut niveau (celui de notre ''FAI'' par exemple)&lt;br /&gt;
 echo &amp;quot;nameserver 127.0.0.1&amp;quot; &amp;gt; /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://memo-linux.com/debian-installer-le-serveur-dns-unbound/&lt;br /&gt;
* https://memo-linux.com/ubuntu-serveur-dns-unbound/&lt;br /&gt;
* https://lists.nlnetlabs.nl/pipermail/unbound-users/2014-October/003573.html&lt;br /&gt;
* https://unbound.docs.nlnetlabs.nl/en/latest/manpages/unbound.conf.html&lt;br /&gt;
&lt;br /&gt;
=Convertir une liste de domaines en RPZ=&lt;br /&gt;
Il est possible de trouver des listes de domaines générées par des tiers sur Internet ([https://raw.githubusercontent.com/schrebra/Windows.10.DNS.Block.List/main/hosts.txt exemple] d'une liste de domaine utilisés par ''Windows 10'' - [https://github.com/schrebra/Windows.10.DNS.Block.List source]).&lt;br /&gt;
&lt;br /&gt;
Pour les convertir en fichier de configuration ''RPZ'' avec syntaxe ''Unbound'', vous pouvez utiliser mon script :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Via un fichier distant&lt;br /&gt;
unbound_rbl_src=$(wget -qO - https://raw.githubusercontent.com/schrebra/Windows.10.DNS.Block.List/main/hosts.txt)&lt;br /&gt;
# ou via un fichier local&lt;br /&gt;
# unbound_rbl_src=$(cat /tmp/windows10-rbl.txt)&lt;br /&gt;
unbound_rbl_dst=&amp;quot;/tmp/windows10-rbl-unbound.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;server:&amp;quot; &amp;gt; &amp;quot;${unbound_rbl_dst}&amp;quot;&lt;br /&gt;
for i in $unbound_rbl_src; do&lt;br /&gt;
    echo -e &amp;quot;\tlocal-zone: \&amp;quot;${i}\&amp;quot; redirect\n\tlocal-data: \&amp;quot;${i} A 127.0.0.1\&amp;quot;&amp;quot; &amp;gt;&amp;gt; &amp;quot;${unbound_rbl_dst}&amp;quot;&lt;br /&gt;
done &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce fichier sera à placer dans le répertoire des configurations du résolveur ''DNS'' &amp;lt;code&amp;gt;/etc/unbound/unbound.conf.d/&amp;lt;/code&amp;gt; avant rechargement &amp;lt;code&amp;gt;unbound-control reload&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Liste RPZ automatique=&lt;br /&gt;
Le site [https://pgl.yoyo.org pgl.yoyo.org] met à jour et publie une [https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&amp;amp;showintro=0&amp;amp;mimetype=plaintext liste de domaines] à interdire au format ''Unbound''. Ceci peut être utile afin de filtrer les sites irrespectueux de la vie privée des utilisateurs&lt;br /&gt;
&lt;br /&gt;
{{info|De façon générale, il est préférable de laisser ce filtrage être opéré par les utilisateurs eux-même afin de maintenir un [https://www.arcep.fr/nos-sujets/la-neutralite-du-net.html réseau aussi neutre que possible]. Il est important également de considérer l'aspect sécuritaire au fait de récupérer une liste de résolution canonique sur un site tiers. Rien ne garanti que son administrateur (ou un pirate) n'utilisera cette liste pour faire rediriger un site légitime vers une adresse externe et compromettre l'authenticité de vos communications avec celui-ci. Cette solution est à adapter à la situation locale.}}&lt;br /&gt;
&lt;br /&gt;
Le script suivant (écrit par [https://zestedesavoir.com/@sgble sgble] et adapté par mes soins) permet de récupérer la dernière version de la liste tout en sauvegardant sa copie actuelle, d'en vérifier la syntaxe et ainsi de soit recharger le service, soit restaurer sa version fonctionnelle :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /usr/local/sbin/maj-rbl-unbound&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Lien de la liste&lt;br /&gt;
yoyo_url=&amp;quot;https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&amp;amp;showintro=0&amp;amp;mimetype=plaintext&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Localisation de la configuration Unbound&lt;br /&gt;
unbound_confs=&amp;quot;/etc/unbound/unbound.conf.d/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Si le fichier précédent existe déjà, le garder en réserver au cas où&lt;br /&gt;
if [ -f &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf ]; then&lt;br /&gt;
	cp &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf /tmp/yoyo_blocus.conf.sauv&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Télécharger et placer la liste au bon endroit&lt;br /&gt;
wget &amp;quot;${yoyo_url}&amp;quot; -O &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf &amp;amp;&amp;amp; sed -i '1 s/^/server:\n/' &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf&lt;br /&gt;
&lt;br /&gt;
# Vérifier que Unbound ne rencontre aucun problème avec la liste et recharger si vrai&lt;br /&gt;
if unbound-checkconf; then&lt;br /&gt;
	echo &amp;quot;La nouvelle liste est bonne&amp;quot;&lt;br /&gt;
	unbound-control reload&lt;br /&gt;
	echo &amp;quot;Unbound a été rechargé&amp;quot;&lt;br /&gt;
# Sinon, rétablir l'ancien fichier qu'on a gardé en réserve&lt;br /&gt;
else&lt;br /&gt;
	echo &amp;quot;La nouvelle liste semble mal formaté&amp;quot;&lt;br /&gt;
	mv /tmp/yoyo_blocus.conf.sauv &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf&lt;br /&gt;
	echo &amp;quot;Une restauration de l'ancienne liste a été effectuée&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 chmod +x /usr/local/sbin/maj-rbl-unbound&lt;br /&gt;
&lt;br /&gt;
Création d'un [[Minuteur - systemd|minuteur Systemd]] afin d'automatiser l'actualisation de la liste (tous les jours)&lt;br /&gt;
  mkdir -p /usr/local/etc/systemd/system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /usr/local/etc/systemd/system/maj-rbl-unbound.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Actualisation de la liste RPZ d'Unbound&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=maj-rbl-unbound&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /usr/local/etc/systemd/system/maj-rbl-unbound.timer&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Exécution journalière de l'actualisation de la liste RPZ d'Unbound&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=daily&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ln -s /usr/local/etc/systemd/system/maj-rbl-unbound.service /etc/systemd/system/&lt;br /&gt;
 ln -s /usr/local/etc/systemd/system/maj-rbl-unbound.timer /etc/systemd/system/&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
 systemctl enable maj-rbl-unbound.timer&lt;br /&gt;
 systemctl start maj-rbl-unbound.timer&lt;br /&gt;
&lt;br /&gt;
=Sources de la section=&lt;br /&gt;
* https://zestedesavoir.com/billets/3908/avoir-son-dns-local-securite-controle-et-performance/&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Unbound&amp;diff=1505</id>
		<title>Unbound</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Unbound&amp;diff=1505"/>
		<updated>2024-02-10T21:03:03Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Liste RPZ automatique */ ajout du lien direct vers la RBL de yoyo.org&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Service_dns]]&lt;br /&gt;
&lt;br /&gt;
[https://www.nlnetlabs.nl/projects/unbound/about/ Unbound] est un serveur ''DNS'' faisant office de résolveur récursif et pouvant faire autorité sur des domaines locaux. Il est développé par [https://www.nlnetlabs.nl/ NLnet Labs] et se veut à la fois complet en fonctionnalité, léger (grâce à la modularité de ces dernières) et simple à configurer.&lt;br /&gt;
&lt;br /&gt;
=Installation et configuration=&lt;br /&gt;
Installation du service avec une ''Debian Bullseye''&lt;br /&gt;
 apt install --no-install-recommends unbound&lt;br /&gt;
&lt;br /&gt;
Afin d'utiliser directement les serveurs racines pour la résolution récursive des requêtes clientes, il faut télécharger [https://{{SERVERNAME}}/fichiers/services/dns/root.hints la liste] contenant leurs adresses&lt;br /&gt;
 wget https://www.internic.net/domain/named.root -O /var/lib/unbound/root.hints &amp;amp;&amp;amp; chown unbound:unbound /var/lib/unbound/root.hints&lt;br /&gt;
&lt;br /&gt;
Le fichier de configuration suivant sera utilisé&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nestedtext&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /etc/unbound/unbound.conf&lt;br /&gt;
# Fichier de configuration d'Unbound pour Debian.&lt;br /&gt;
#&lt;br /&gt;
# Référez-vous à la page de manuel unbound.conf(5).&lt;br /&gt;
#&lt;br /&gt;
# Voyez /usr/share/doc/unbound/examples/unbound.conf pour un&lt;br /&gt;
# fichier de configuration de référence commenté.&lt;br /&gt;
#&lt;br /&gt;
# La ligne suivante permet d'inclure les fichiers de configuration&lt;br /&gt;
# additionnels depuis le répertoire /etc/unbound/unbound.conf.d.&lt;br /&gt;
include-toplevel: &amp;quot;/etc/unbound/unbound.conf.d/*.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
server:&lt;br /&gt;
statistics-interval: 0&lt;br /&gt;
extended-statistics: yes&lt;br /&gt;
statistics-cumulative: yes&lt;br /&gt;
verbosity: 3&lt;br /&gt;
&lt;br /&gt;
# Paramètres réseau&lt;br /&gt;
interface: 127.0.0.1&lt;br /&gt;
interface: 192.168.1.5&lt;br /&gt;
port: 53&lt;br /&gt;
do-ip4: yes&lt;br /&gt;
do-ip6: no&lt;br /&gt;
do-udp: yes&lt;br /&gt;
do-tcp: no&lt;br /&gt;
&lt;br /&gt;
# Contrôle d'accès&lt;br /&gt;
access-control: 127.0.0.0/8 allow&lt;br /&gt;
access-control: 192.168.0.0/16 allow&lt;br /&gt;
access-control: 0.0.0.0/0 refuse&lt;br /&gt;
&lt;br /&gt;
# DNSSEC&lt;br /&gt;
# auto-trust-anchor-file: &amp;quot;/var/lib/unbound/root.key&amp;quot;&lt;br /&gt;
harden-dnssec-stripped: yes&lt;br /&gt;
&lt;br /&gt;
# Adresses des serveurs racine&lt;br /&gt;
root-hints: &amp;quot;/var/lib/unbound/root.hints&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Paramètres système&lt;br /&gt;
hide-identity: yes&lt;br /&gt;
hide-version: yes&lt;br /&gt;
harden-glue: yes&lt;br /&gt;
use-caps-for-id: yes&lt;br /&gt;
cache-min-ttl: 3600&lt;br /&gt;
cache-max-ttl: 86400&lt;br /&gt;
prefetch: yes&lt;br /&gt;
num-threads: 6&lt;br /&gt;
msg-cache-slabs: 16&lt;br /&gt;
rrset-cache-slabs: 16&lt;br /&gt;
infra-cache-slabs: 16&lt;br /&gt;
key-cache-slabs: 16&lt;br /&gt;
rrset-cache-size: 256m&lt;br /&gt;
msg-cache-size: 128m&lt;br /&gt;
so-rcvbuf: 1m&lt;br /&gt;
unwanted-reply-threshold: 10000&lt;br /&gt;
do-not-query-localhost: yes&lt;br /&gt;
val-clean-additional: yes&lt;br /&gt;
&lt;br /&gt;
# Journalisation&lt;br /&gt;
use-syslog: no&lt;br /&gt;
logfile: /var/log/unbound.log&lt;br /&gt;
&lt;br /&gt;
# Paramètres du cache&lt;br /&gt;
cache-min-ttl: 3600&lt;br /&gt;
cache-max-ttl: 86400&lt;br /&gt;
prefetch: yes&lt;br /&gt;
prefetch-key: yes&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est possible de servir des domaines locaux (faire autorité)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nestedtext&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /etc/unbound/unbound.conf.d/ycharbi.yo.conf&lt;br /&gt;
server:&lt;br /&gt;
local-zone: &amp;quot;ycharbi.yo.&amp;quot; static&lt;br /&gt;
local-data: &amp;quot;ycharbi.yo. IN A 192.168.1.1&amp;quot;&lt;br /&gt;
local-data: &amp;quot;toto1.ycharbi.yo. IN A 192.168.1.25&amp;quot;&lt;br /&gt;
local-data: &amp;quot;ycharbi.yo. IN MX 10 toto1.ycharbi.yo.&amp;quot;&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est également possible de rediriger des requêtes clientes après modification (''DNS'' menteur aussi appelée ''Reponse Policy Zone'' ou ''RPZ'') afin d’interdire l'accès à certains domaines. J'utilise cette fonctionnalité à deux fins :&lt;br /&gt;
* Servir mon [[Debmirror|miroir de dépôt local]] à toute mes machines sans avoir à changer leur [[Sources.list|configuration]]&lt;br /&gt;
* Éviter certains sites irrespectueux des données personnelles (utilisation d'une liste automatique [[#Liste_RPZ_automatique|plus bas]])&lt;br /&gt;
&lt;br /&gt;
Il est à noter que tous les sous-domaines de chaque entrée sont automatiquement pris en compte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nestedtext&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /etc/unbound/unbound.conf.d/rpz.conf&lt;br /&gt;
server:&lt;br /&gt;
# Miroirs de dépôts APT Debian&lt;br /&gt;
local-zone: &amp;quot;ftp.fr.debian.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;ftp.fr.debian.org A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;http.debian.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;http.debian.net A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;deb.debian.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;deb.debian.org A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;security.debian.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;security.debian.org A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;httpredir.debian.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;httpredir.debian.org A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;debian.map.fastlydns.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;debian.map.fastlydns.net A 192.168.1.77&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# APT utilise aussi des champs SRV pour résoudre l'adresse des miroirs&lt;br /&gt;
local-zone: &amp;quot;prod.debian.map.fastly.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;prod.debian.map.fastly.net A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;dpvctowv9b08b.cloudfront.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;dpvctowv9b08b.cloudfront.net A 192.168.1.77&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;_http._tcp.deb.debian.org.&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;_http._tcp.deb.debian.org. 3600 IN SRV 10 1 80 prod.debian.map.fastly.net.&amp;quot;&lt;br /&gt;
local-data: &amp;quot;_http._tcp.deb.debian.org. 3600 IN SRV 10 1 80 dpvctowv9b08b.cloudfront.net.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Saloperies à supprimer&lt;br /&gt;
local-zone: &amp;quot;doubleclick.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;doubleclick.net A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;googlesyndication.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;googlesyndication.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;googleadservices.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;googleadservices.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;google-analytics.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;google-analytics.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;ads.youtube.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;ads.youtube.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;adserver.yahoo.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;adserver.yahoo.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;ask.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;ask.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;facebook.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;facebook.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;truste-svc.net&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;truste-svc.net A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;trustarc.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;trustarc.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;gstatic.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;gstatic.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;consent.google.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;consent.google.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;consent.youtube.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;consent.youtube.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;cdn.privacy-mgmt.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;cdn.privacy-mgmt.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;privacy-mgmt.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;privacy-mgmt.com A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;cdn.cookielaw.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;cdn.cookielaw.org A 127.0.0.1&amp;quot;&lt;br /&gt;
local-zone: &amp;quot;digitalfeedback.us.confirmit.com&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;digitalfeedback.us.confirmit.com A 127.0.0.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Télémétrie Mozilla&lt;br /&gt;
local-zone: &amp;quot;incoming.telemetry.mozilla.org&amp;quot; redirect&lt;br /&gt;
local-data: &amp;quot;incoming.telemetry.mozilla.org A 127.0.0.1&amp;quot;&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vérification de la configuration du service&lt;br /&gt;
 unbound-checkconf&lt;br /&gt;
&lt;br /&gt;
Redémarrage du service&lt;br /&gt;
 systemctl restart unbound&lt;br /&gt;
&lt;br /&gt;
Il est également possible de recharger la configuration sans relancer le logiciel. Cela a pour effet de ne pas le faire planter si jamais un fichier de configuration contient une erreur&lt;br /&gt;
 unbound-control reload&lt;br /&gt;
&lt;br /&gt;
Enfin, il est possible de configurer le système du serveur pour utiliser notre résolveur local et ne pas dépendre d'un résolveur de plus haut niveau (celui de notre ''FAI'' par exemple)&lt;br /&gt;
 echo &amp;quot;nameserver 127.0.0.1&amp;quot; &amp;gt; /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://memo-linux.com/debian-installer-le-serveur-dns-unbound/&lt;br /&gt;
* https://memo-linux.com/ubuntu-serveur-dns-unbound/&lt;br /&gt;
* https://lists.nlnetlabs.nl/pipermail/unbound-users/2014-October/003573.html&lt;br /&gt;
* https://unbound.docs.nlnetlabs.nl/en/latest/manpages/unbound.conf.html&lt;br /&gt;
&lt;br /&gt;
=Liste RPZ automatique=&lt;br /&gt;
Le site [https://pgl.yoyo.org pgl.yoyo.org] met à jour et publie une [https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&amp;amp;showintro=0&amp;amp;mimetype=plaintext liste de domaines] à interdire au format ''Unbound''. Ceci peut être utile afin de filtrer les sites irrespectueux de la vie privée des utilisateurs&lt;br /&gt;
&lt;br /&gt;
{{info|De façon générale, il est préférable de laisser ce filtrage être opéré par les utilisateurs eux-même afin de maintenir un [https://www.arcep.fr/nos-sujets/la-neutralite-du-net.html réseau aussi neutre que possible]. Il est important également de considérer l'aspect sécuritaire au fait de récupérer une liste de résolution canonique sur un site tiers. Rien ne garanti que son administrateur (ou un pirate) n'utilisera cette liste pour faire rediriger un site légitime vers une adresse externe et compromettre l'authenticité de vos communications avec celui-ci. Cette solution est à adapter à la situation locale.}}&lt;br /&gt;
&lt;br /&gt;
Le script suivant (écrit par [https://zestedesavoir.com/@sgble sgble] et adapté par mes soins) permet de récupérer la dernière version de la liste tout en sauvegardant sa copie actuelle, d'en vérifier la syntaxe et ainsi de soit recharger le service, soit restaurer sa version fonctionnelle :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /usr/local/sbin/maj-rbl-unbound&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Lien de la liste&lt;br /&gt;
yoyo_url=&amp;quot;https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&amp;amp;showintro=0&amp;amp;mimetype=plaintext&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Localisation de la configuration Unbound&lt;br /&gt;
unbound_confs=&amp;quot;/etc/unbound/unbound.conf.d/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Si le fichier précédent existe déjà, le garder en réserver au cas où&lt;br /&gt;
if [ -f &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf ]; then&lt;br /&gt;
	cp &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf /tmp/yoyo_blocus.conf.sauv&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Télécharger et placer la liste au bon endroit&lt;br /&gt;
wget &amp;quot;${yoyo_url}&amp;quot; -O &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf &amp;amp;&amp;amp; sed -i '1 s/^/server:\n/' &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf&lt;br /&gt;
&lt;br /&gt;
# Vérifier que Unbound ne rencontre aucun problème avec la liste et recharger si vrai&lt;br /&gt;
if unbound-checkconf; then&lt;br /&gt;
	echo &amp;quot;La nouvelle liste est bonne&amp;quot;&lt;br /&gt;
	unbound-control reload&lt;br /&gt;
	echo &amp;quot;Unbound a été rechargé&amp;quot;&lt;br /&gt;
# Sinon, rétablir l'ancien fichier qu'on a gardé en réserve&lt;br /&gt;
else&lt;br /&gt;
	echo &amp;quot;La nouvelle liste semble mal formaté&amp;quot;&lt;br /&gt;
	mv /tmp/yoyo_blocus.conf.sauv &amp;quot;${unbound_confs}&amp;quot;/yoyo_blocus.conf&lt;br /&gt;
	echo &amp;quot;Une restauration de l'ancienne liste a été effectuée&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 chmod +x /usr/local/sbin/maj-rbl-unbound&lt;br /&gt;
&lt;br /&gt;
Création d'un [[Minuteur - systemd|minuteur Systemd]] afin d'automatiser l'actualisation de la liste (tous les jours)&lt;br /&gt;
  mkdir -p /usr/local/etc/systemd/system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /usr/local/etc/systemd/system/maj-rbl-unbound.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Actualisation de la liste RPZ d'Unbound&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=maj-rbl-unbound&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; _EOF_ &amp;gt; /usr/local/etc/systemd/system/maj-rbl-unbound.timer&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Exécution journalière de l'actualisation de la liste RPZ d'Unbound&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=daily&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ln -s /usr/local/etc/systemd/system/maj-rbl-unbound.service /etc/systemd/system/&lt;br /&gt;
 ln -s /usr/local/etc/systemd/system/maj-rbl-unbound.timer /etc/systemd/system/&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
 systemctl enable maj-rbl-unbound.timer&lt;br /&gt;
 systemctl start maj-rbl-unbound.timer&lt;br /&gt;
&lt;br /&gt;
=Sources de la section=&lt;br /&gt;
* https://zestedesavoir.com/billets/3908/avoir-son-dns-local-securite-controle-et-performance/&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Appimage&amp;diff=1504</id>
		<title>Appimage</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Appimage&amp;diff=1504"/>
		<updated>2024-02-02T17:09:05Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout d'une section &amp;quot;Sources de la section&amp;quot; + ajout des fichiers utilisés dans &amp;quot;nos fichiers&amp;quot; + corrections de quelques commandes + correction de fautes de français + suppression d'une balise &amp;quot;info&amp;quot; faisant doublon&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Gestionnaire_paquets]]&lt;br /&gt;
&lt;br /&gt;
[https://appimage.org/ Appimage] est un format de paquets portable (dit &amp;quot;universel&amp;quot;) pour les systèmes d'exploitations utilisant un [[:Category:Noyau_linux|noyau Linux]]. Son but est de permettre la mise à disposition de logiciels indépendamment d'une distribution en particulier. Il se présente sous la forme d'un unique fichier binaire [https://fr.wikipedia.org/wiki/Executable_and_Linkable_Format Executable and Linkable Format] (''ELF'') comportant une image [[Squashfs|SquashFS]]. Cette dernière contient alors toutes les dépendances nécessaires au fonctionnement du programme. On y trouvera une similitude avec certains programmes ''Windows'' ou ''Mac OS X''.&lt;br /&gt;
&lt;br /&gt;
=Avantages=&lt;br /&gt;
Les intérêts d'une telle approche sont multiples, tant pour les éditeurs, les développeurs et les utilisateurs que pour les administrateurs.&lt;br /&gt;
&lt;br /&gt;
Habituellement, un logiciel doit être empaqueté dans un format spécifique à une [[:Category:Distributions_linux|distribution Linux]] (''.deb'', ''.rpm'', ''.pkg''...) et doit être livré sans intégrer ses dépendances. L'éditeur doit alors maintenir un paquets par distribution en gérant un nombre de paramètres insoutenable (la version du paquet pour une distribution donnée doit se contenter des librairies imposées dans les dépôts de chaque système !). Un mainteneur de paquet spécifique (bien souvent un bénévole indépendant du projet initial) est alors désigné pour se charger de l'empaquetage, la maintenance et la distribution dans les dépôts servants les différents [[:Category:Gestionnaire_paquets|gestionnaires de paquets]].&lt;br /&gt;
&lt;br /&gt;
L'approche ''AppImage'' réduit donc les intermédiaires intervenant dans le processus de distribution d'un logiciel. L'éditeur construit et met à disposition un paquet standardisé intégrant les composants spécifiques au fonctionnement de sa création sur le dépôt de son choix. Les utilisateurs peuvent alors se le procurer directement (téléchargement depuis leur navigateur ''Web'' par exemple) sans attendre que leur distribution l'embarque (chose qui peut ne jamais arriver en fonction de leur gouvernance). La charge de travail est moindre pour l'éditeur et certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
En effet, si un programme n'est pas disponible dans les dépôts de sa distribution, ce dernier doit entreprendre un périple qui n'est parfois pas sans conséquence sur son système :&lt;br /&gt;
* ajout de dépôts tiers comportant au choix : des failles de sécurités ou du code malveillant, des librairies entrants en conflits avec celles présentes dans la distribution d'origine, une maintenance ne suivant pas la politique de cette dernière, etc... (je ne compte plus les fois où l'assistance à un débutant concerne des problèmes liés à cette liste et dont l'unique point de convergence est la gestion de paquet sous ''Linux''...)&lt;br /&gt;
* installation depuis un paquet au format de la distribution d'origine : comme dit précédemment, un paquet standard ne vient pas avec ses dépendances, il s’appuie sur celles des dépôts officiels (modulos les technologies spécifiques comme ''GoLang'' ou ''Electron''). Il faut alors en premier lieu réaliser l'installation dédites dépendances à la main (ou via le gestionnaire de paquet si vous avez le cul bordé de nouilles) pour procéder à celle de votre logiciel. Si les dépendances ne sont pas disponibles dans les dépôts et que les externes rentrent en conflits avec ces dernières, vous ne pouvez pas installer votre logiciel sans risquer de tout casser&lt;br /&gt;
* compilation depuis les sources : non content d'être une galère sans nom (sur 100, combien de fois cela a fonctionné pour vous ?), la gestion des mises à jours est au mieux, une plaie totale, au pire impossible (et je ne parle bien entendu pas de la désinstallation qui relève du mystère une fois que des milliers de fichiers se sont disséminés un peu partout sur votre disque...).&lt;br /&gt;
&lt;br /&gt;
Un autre avantage notoire est la non altération du logiciel entre l'éditeur et l'utilisateur par des mainteneurs modifiants les options de compilation ou appliquant des patch avant distribution. On peut noter par exemple certains codecs enfreignant les brevets logiciels aux États Unis d'Amérique alors que cette notion juridique est absente dans le droit Français. Dans ce cas, un paquets hébergé sur un serveur Français pourrait contenir l'ensemble des codecs et profiter à la totalité des utilisateurs mondiaux sans passer par un mainteneur spécifique.&lt;br /&gt;
&lt;br /&gt;
Enfin, il est relativement aisé de cloisonner l'exécution d'un programme contenu dans un unique binaire en comparaison de la méthode traditionnelle visant à en mettre partout sur le système de fichier d'exploitation. Nous utiliserons cette méthode chaque fois que cela est souhaité afin de ne pas pourrir notre machine de production (faites un &amp;lt;code&amp;gt;tree -a ~/.*&amp;lt;/code&amp;gt; si vous ne voyez pas de quoi je veux parler...).&lt;br /&gt;
&lt;br /&gt;
=Inconvénients=&lt;br /&gt;
Comme toute solution est rarement intégralement rose, les avantages apportés par ''AppImage'' viennent à leur tour contrecarrer ceux apporter par la gestion traditionnelle des paquets sous ''Linux'' :&lt;br /&gt;
* pas d'installation et de mise à jour unifié : il n'y a pas d'unique dépôt comme sous une distribution classique centralisant tous les ''AppImage'' pour permettre leur installation et leur mise à jour en une unique commande ou via un magasin d'applications (ceci n'est cependant pas techniquement impossible à l'image de ce qui se fait sur le monde des [[:Category:Ordiphones|ordiphones]])&lt;br /&gt;
* sécurité : aucun support de l'équipe de sécurité de la distribution n'est apporté sur le paquet que vous installez, tant concernant les patchs de sécurité que la revue de code (il faut faire plus attention à ce que l'on télécharge). Le cloisonnement est une bonne pratique pour se prémunir au mieux des actes de malveillance ou simplement de la collecte de données personnelles (sous ''Debian'', ce type de comportement non éthique est généralement supprimé par les mainteneurs à la compilation)&lt;br /&gt;
* espace disque : taille globale du paquet bien plus importante que via les dépôts officiels puisque il embarque tous les composants nécessaires à son fonctionnement. Il n'y a aucune mutualisation des librairies utilisées par les différents programmes ''AppImage'' (contrairement, dans une [très] moindre mesure, à [https://www.flatpak.org/ Flatpak])&lt;br /&gt;
&lt;br /&gt;
La meilleure approche semble donc une utilisation hybride des deux solutions en privilégiant la méthode traditionnelle (gestionnaire de paquets) et en usant des paquets unifiés lorsque le besoin s'en fait sentir en combinaison d'un cloisonnement lorsque cela est possible/souhaitable.&lt;br /&gt;
&lt;br /&gt;
=Construction d'une image=&lt;br /&gt;
==Dépendances==&lt;br /&gt;
''AppImage'' n'a besoin pour fonctionner que de &amp;lt;code&amp;gt;libfuse2&amp;lt;/code&amp;gt;. Il convient alors de l'installer sur votre système (''Debian 12'' pour l'exemple).&lt;br /&gt;
 apt install --no-install-recommends libfuse2&lt;br /&gt;
&lt;br /&gt;
L'[https://github.com/AppImage/AppImageKit outil] permettant la construction des images étant lui même un paquet ''AppImage'', il suffit de le télécharger et de le rendre exécutable pour pouvoir commencer à l'utiliser.&lt;br /&gt;
 wget https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage -O /usr/local/bin/appimagetool&lt;br /&gt;
 chmod +x /usr/local/bin/appimagetool&lt;br /&gt;
&lt;br /&gt;
Vous trouverez la version de cette documentation en cache dans [https://{{SERVERNAME}}/fichiers/gestion_paquets/appimage/appimagetool-x86_64.AppImage nos fichiers].&lt;br /&gt;
&lt;br /&gt;
==Construction d'une image==&lt;br /&gt;
L'empaquetage d'une application, bien que suivant une trame générique, comporte des spécificités inhérente au programme que vous traitez. Les grandes lignes de ce qui sera montré dans cette section sera transposable pour le votre mais il ne me sera pas possible de rédiger une procédure universelle. Il faudra inévitablement galérer un peu pour votre cas particulier.&lt;br /&gt;
&lt;br /&gt;
===Principes===&lt;br /&gt;
La structure d'un paquet ''AppImage'' est globalement la [https://docs.appimage.org/packaging-guide/manual.html#creating-an-appdir-manually suivante] :&lt;br /&gt;
 AppDir/&lt;br /&gt;
 AppDir/AppRun&lt;br /&gt;
 AppDir/monprog.desktop&lt;br /&gt;
 AppDir/monprog.png&lt;br /&gt;
 AppDir/usr/bin/monprog&lt;br /&gt;
 AppDir/usr/lib/libfoo.so.0&lt;br /&gt;
&lt;br /&gt;
* la totalité des ressources nécessaires au fonctionnement du programme doit être contenue dans le dossier normalisé &amp;lt;code&amp;gt;AppDir/&amp;lt;/code&amp;gt;&lt;br /&gt;
* les chemins aux ressources contenus dans celui-ci doivent obligatoirement êtres relatifs afin de s'assurer que la paquet ''AppImage'' ne va pas utiliser des données (comme des librairies) locales au système. Ce qui donnerait une fausse impression de portabilité (cesserai de fonctionner chez certains utilisateurs)&lt;br /&gt;
* le fichier &amp;lt;code&amp;gt;AppRun&amp;lt;/code&amp;gt; est ce qui est exécuté au lancement d'un paquet ''AppImage'' (point d'entrée). Il peut s'agir de n'importe quel exécutable&lt;br /&gt;
&lt;br /&gt;
Afin de convertir les chemins absolus en relatifs, les commandes &amp;lt;code&amp;gt;busybox strings AppDir/usr/bin/monprog | grep /usr&amp;lt;/code&amp;gt; suivie de &amp;lt;code&amp;gt;sed -i -e 's#/usr#././#g' AppDir/usr/bin/monprog&amp;lt;/code&amp;gt; sont données dans la documentation officielle. Il conviendra bien évidemment de s'assurer que cette commande ne casse pas tout.&lt;br /&gt;
&lt;br /&gt;
===VSCodium===&lt;br /&gt;
[https://vscodium.com/ VSCodium] est une bifurcation de l'éditeur de code [https://code.visualstudio.com/ Visual Studio Code] de ''Microsoft'' purgée de toute références aux pratiques malveillantes de cette entreprise. De part sa nature ''Microsoftienne'' et ceux, malgré les efforts pour en faire un binaire saint, nous cloisonnerons ce logiciel afin qu'il n'ai pas accès à Internet ainsi qu'au répertoire personnel de notre utilisateur via une prison [https://manpages.debian.org/stretch/firejail/firejail.1.en.html Firejail].&lt;br /&gt;
&lt;br /&gt;
Cette application n'étant pas disponible dans ''Debian'', nous allons la construire nous même.&lt;br /&gt;
&lt;br /&gt;
Les étapes de cette section consisteront à télécharger le paquet ''Debian'' (''.deb'') depuis le site de l'éditeur dans un répertoire de travail et d'y transférer son contenu en vu d'un empaquetage ''AppImage''.&lt;br /&gt;
&lt;br /&gt;
====Préparation====&lt;br /&gt;
Création d'une variable de chemin spécifique à notre projet (rendra plus facile les copier/coller pour un autre programme)&lt;br /&gt;
 export appimage=&amp;quot;/tmp/VSCodium/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Création de l'espace de travail&lt;br /&gt;
 mkdir -p $appimage/{AppDir/usr/share/,DEB} &amp;amp;&amp;amp; cd $appimage&lt;br /&gt;
&lt;br /&gt;
Téléchargement de ''VSCodium''&lt;br /&gt;
 wget https://github.com/VSCodium/vscodium/releases/download/1.85.2.24019/codium_1.85.2.24019_amd64.deb -P $appimage/DEB/&lt;br /&gt;
&lt;br /&gt;
Extraction de son contenu&lt;br /&gt;
 dpkg-deb -R $appimage/DEB/codium_1.85.2.24019_amd64.deb $appimage/DEB/&lt;br /&gt;
&lt;br /&gt;
Copie de l'icône et du raccourci pour environnement graphique du programme&lt;br /&gt;
 cp $appimage/DEB/usr/share/pixmaps/vscodium.png $appimage/AppDir/&lt;br /&gt;
 cp $appimage/DEB/usr/share/applications/codium.desktop $appimage/AppDir/&lt;br /&gt;
&lt;br /&gt;
Copie des fichiers nécessaires au fonctionnement du programme&lt;br /&gt;
 cp -rv $appimage/DEB/usr/share/codium $appimage/AppDir/usr/share/&lt;br /&gt;
&lt;br /&gt;
Création d'un point d'entrée à l'exécution de notre paquet&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; $appimage/AppDir/AppRun&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
$(dirname &amp;quot;$0&amp;quot;)/usr/share/codium/codium ~ --ms-enable-electron-run-as-node $@&lt;br /&gt;
#$(dirname &amp;quot;$0&amp;quot;)/usr/share/codium/codium $(dirname &amp;quot;$0&amp;quot;) --ms-enable-electron-run-as-node $@&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 chmod +x $appimage/AppDir/AppRun&lt;br /&gt;
&lt;br /&gt;
====Empaquetage====&lt;br /&gt;
Création du répertoire contenant le résultat&lt;br /&gt;
 mkdir $appimage/VSCodium&lt;br /&gt;
&lt;br /&gt;
Construction du ''AppImage''&lt;br /&gt;
 appimagetool $appimage/AppDir/ $appimage/VSCodium/VSCodium.appimage&lt;br /&gt;
&lt;br /&gt;
Votre application est prête à l'emploi !&lt;br /&gt;
&lt;br /&gt;
La section suivante concerne son cloisonnement. Il est complètement optionnel et vous pouvez vous arrêter là si vous n'en avez pas besoin.&lt;br /&gt;
&lt;br /&gt;
Il est possible d'extraire le contenu du paquet via un &amp;lt;code&amp;gt;./VSCodium.appimage --appimage-extract&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Cloisonnement====&lt;br /&gt;
Afin de cloisonner notre application, nous utiliserons le logiciel ''Firejail'', devenu une référence pour cette tâche (il comporte une option spécifique pour notre besoin).&lt;br /&gt;
&lt;br /&gt;
{{attention|L'utilisateur soucieux d'utiliser le cloisonnement devra installer ce programme : &amp;lt;code&amp;gt;apt install --no-install-recommends firejail&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
Création du script d'exécution du paquet cloisonné&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; $appimage/VSCodium/vscodium&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
firejail --quiet --noprofile --nonewprivs --net=none --private=$(dirname &amp;quot;$0&amp;quot;) --private-dev --caps.drop=all --seccomp --appimage $(dirname &amp;quot;$0&amp;quot;)/VSCodium.appimage --no-sandbox&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 chmod +x $appimage/VSCodium/vscodium&lt;br /&gt;
&lt;br /&gt;
Les paramètres utilisés sont les suivants :&lt;br /&gt;
* &amp;lt;code&amp;gt;--quiet&amp;lt;/code&amp;gt; : désactive les messages de sorties de &amp;lt;code&amp;gt;firejail&amp;lt;/code&amp;gt;. Celles du programme cloisonné continues quant à elles de s'afficher. La variable  d'environnement &amp;lt;code&amp;gt;FIREJAIL_QUIET=yes&amp;lt;/code&amp;gt; permet le même résultat&lt;br /&gt;
* &amp;lt;code&amp;gt;--noprofile&amp;lt;/code&amp;gt; : ne pas utiliser de profile par défaut (ils foutent plus la merde qu'autre chose). Il est possible de créer les notre&lt;br /&gt;
* &amp;lt;code&amp;gt;--nonewprivs&amp;lt;/code&amp;gt; : permet de s'assurer via le [https://www.man7.org/linux/man-pages/man2/prctl.2.html prctl] &amp;lt;code&amp;gt;NO_NEW_PRIVS&amp;lt;/code&amp;gt; que le processus fils (notre application) ne peut pas obtenir de nouveau privilèges &lt;br /&gt;
* &amp;lt;code&amp;gt;--net=none&amp;lt;/code&amp;gt; : coupe totalement l'accès au réseau de la prison&lt;br /&gt;
* &amp;lt;code&amp;gt;--private=$(dirname &amp;quot;$0&amp;quot;)&amp;lt;/code&amp;gt; : monte le répertoire contenant le script d'exécution de la prison (&amp;lt;code&amp;gt;dirname &amp;quot;$0&amp;quot;&amp;lt;/code&amp;gt;) comme répertoire personnel du programme cloisonné&lt;br /&gt;
* &amp;lt;code&amp;gt;--private-dev&amp;lt;/code&amp;gt; : créé un nouveau répertoire &amp;lt;code&amp;gt;/dev&amp;lt;/code&amp;gt; ne contenant que les fichiers spéciaux ''disc'', ''dri'', ''dvb'', ''hidraw'', ''null'', ''full'', ''zero'', ''tty'', ''pts'', ''ptmx'', ''random'', ''snd'', ''urandom'', ''video'', ''log'', ''shm'', et ''usb''&lt;br /&gt;
* &amp;lt;code&amp;gt;--caps.drop=all&amp;lt;/code&amp;gt; : supprime toute les [https://www.man7.org/linux/man-pages/man7/capabilities.7.html capacités] du noyau. Cela répond au principe de moindre privilèges pour les applications ne nécessitant pas d'accès ''root''&lt;br /&gt;
* &amp;lt;code&amp;gt;--seccomp&amp;lt;/code&amp;gt; : active les filtres ''Secure computing mode'' (''Seccomp'') de la liste noir des appels système par défaut&lt;br /&gt;
* &amp;lt;code&amp;gt;--appimage $(dirname &amp;quot;$0&amp;quot;)/VSCodium.appimage --no-sandbox&amp;lt;/code&amp;gt; : permet le cloisonnement d'un paquet ''AppImage''. L'option &amp;lt;code&amp;gt;--nonewprivs&amp;lt;/code&amp;gt; et les filtres de capacités noyau par défaut sont activés avec cette option. Les paramètres qui suivent sont ceux spécifiques au programme cloisonné (notre ''AppImage'' en l’occurrence)&lt;br /&gt;
&lt;br /&gt;
Dans la mesure où le cloisonnement coupe l'accès au réseau, l'ajout de modules complémentaires (greffons) à ''VSCodium'' devra se faire via la méthode d'installation hors-ligne par fichier ''.vsix''. Ces fichiers pourront êtres disposés dans le répertoire de travail passé par &amp;lt;code&amp;gt;--private=&amp;lt;/code&amp;gt; afin de les rendre accessibles à l'éditeur de code.&lt;br /&gt;
&lt;br /&gt;
Par commodité, nous pouvons proposer le [https://marketplace.visualstudio.com/_apis/public/gallery/publishers/MS-CEINTL/vsextensions/vscode-language-pack-fr/1.85.2024012409/vspackage pack de langue français] (site officiel des modules de ''Visual Studio Code'') dans l'archive que nous mettrons à disposition des utilisateurs. Pensez à vous chronométrer avant de cliquer sur le lien pour savoir combien de temps vous mettez à simplement trouver le bouton de téléchargement (L’ergonomie façon ''Microsoft''...). Vous pouvez récupérer ce fichier dans [https://{{SERVERNAME}}/fichiers/gestion_paquets/appimage/MS-CEINTL.vscode-language-pack-fr-1.85.2024013109.vsix nos fichiers] et le mettre dans votre répertoire de travail &amp;lt;code&amp;gt;$appimage/VSCodium/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Génération de l'archive finale&lt;br /&gt;
 tar -czvf /tmp/VSCodium.tar.gz -C $appimage/ VSCodium&lt;br /&gt;
&lt;br /&gt;
Votre application est maintenant prête à être déployée et utilisée ! Vous pouvez récupérer l'archive finale de cette procédure dans [https://{{SERVERNAME}}/fichiers/gestion_paquets/appimage/VSCodium.tar.gz nos fichiers].&lt;br /&gt;
&lt;br /&gt;
Les utilisateurs devrons décompresser son contenu dans l'emplacement de leur choix et exécuter le script &amp;lt;code&amp;gt;vscodium&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://docs.appimage.org/packaging-guide/manual.html&lt;br /&gt;
* https://docs.appimage.org/reference/appdir.html&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Appimage&amp;diff=1503</id>
		<title>Appimage</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Appimage&amp;diff=1503"/>
		<updated>2024-01-28T16:32:29Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Page créée avec « Category:Gestionnaire_paquets  [https://appimage.org/ Appimage] est un format de paquets portable (dit &amp;quot;universel&amp;quot;) pour les systèmes d'exploitations utilisant un noyau Linux. Son but est de permettre la mise à disposition de logiciels indépendamment d'une distribution en particulier. Il se présente sous la forme d'un unique fichier binaire [https://fr.wikipedia.org/wiki/Executable_and_Linkable_Format Executable and Linkable Form... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Gestionnaire_paquets]]&lt;br /&gt;
&lt;br /&gt;
[https://appimage.org/ Appimage] est un format de paquets portable (dit &amp;quot;universel&amp;quot;) pour les systèmes d'exploitations utilisant un [[:Category:Noyau_linux|noyau Linux]]. Son but est de permettre la mise à disposition de logiciels indépendamment d'une distribution en particulier. Il se présente sous la forme d'un unique fichier binaire [https://fr.wikipedia.org/wiki/Executable_and_Linkable_Format Executable and Linkable Format] (''ELF'') comportant une image [[Squashfs|SquashFS]]. Cette dernière contient alors toutes les dépendances nécessaires au fonctionnement du programme. On y trouvera une similitude avec certains programmes ''Windows'' ou ''Mac OS X''.&lt;br /&gt;
&lt;br /&gt;
=Avantages=&lt;br /&gt;
Les intérêts d'une telle approche sont multiples, tant pour les éditeurs, les développeurs et les utilisateurs que pour les administrateurs.&lt;br /&gt;
&lt;br /&gt;
Habituellement, un logiciel doit être empaqueté dans un format spécifique à une [[:Category:Distributions_linux|distribution Linux]] (''.deb'', ''.rpm'', ''.pkg''...) et doit être livré sans intégrer ses dépendances. L'éditeur doit alors maintenir un paquets par distribution en gérant un nombre de paramètres insoutenable (la version du paquet pour une distribution donnée doit se contenter des librairies imposées dans les dépôts de chaque système !). Un mainteneur de paquet spécifique (bien souvent un bénévole indépendant du projet initial) est alors désigné pour se charger de l'empaquetage, la maintenance et la distribution dans les dépôts servants les différents [[:Category:Gestionnaire_paquets|gestionnaires de paquets]].&lt;br /&gt;
&lt;br /&gt;
L'approche ''AppImage'' réduit donc les intermédiaires intervenant dans le processus de distribution d'un logiciel. L'éditeur construit et met à disposition un paquet standardisé intégrant les composants spécifiques au fonctionnement de sa création sur le dépôt de son choix. Les utilisateurs peuvent alors se le procurer directement (téléchargement depuis leur navigateur ''Web'' par exemple) sans attendre que leur distribution l'embarque (chose qui peut ne jamais arriver en fonction de leur gouvernance). La charge de travail est moindre pour l'éditeur et certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
En effet, si un programme n'est pas disponible dans les dépôts de sa distribution, ce dernier doit entreprendre un périple qui n'est parfois pas sans conséquence sur son système :&lt;br /&gt;
* ajout de dépôts tiers comportant au choix : des failles de sécurités ou du code malveillant, des librairies entrants en conflits avec celles présentes dans la distribution d'origine, une maintenance ne suivant pas la politique de cette dernière, etc... (je ne compte plus les fois où l'assistance à un débutant concerne des problèmes liés à cette liste et dont l'unique point de convergence est la gestion de paquet sous ''Linux''...)&lt;br /&gt;
* installation depuis un paquet au format de la distribution d'origine : comme dit précédemment, un paquet standard ne vient pas avec ses dépendances, il s’appuie sur celles des dépôts officiels (modulos les technologies spécifiques comme ''GoLang'' ou ''Electron''). Il faut alors en premier lieu réaliser l'installation dédites dépendances à la main (ou via le gestionnaire de paquet si vous avez le cul bordé de nouilles) pour procéder à celle de votre logiciel. Si les dépendances ne sont pas disponibles dans les dépôts et que les externes rentrent en conflits avec ces dernières, vous ne pouvez pas installer votre logiciel sans risquer de tout casser&lt;br /&gt;
* compilation depuis les sources : non content d'être une galère sans nom (sur 100, combien de fois cela à fonctionner pour vous ?), la gestion des mises à jours est au mieux, une plaie totale, au pire impossible (et je ne parle bien entendu pas de la désinstallation qui relève du mystère une fois que des milliers de fichiers se sont disséminés un peu partout sur votre disque...).&lt;br /&gt;
&lt;br /&gt;
Un autre avantage notoire est la non altération du logiciel entre l'éditeur et l'utilisateur par des mainteneurs modifiants les options de compilation ou appliquant des patch avant distribution. On peut noter par exemple certains codecs enfreignant les brevets logiciels aux États Unis d'Amérique alors que cette notion juridique est absente dans le droit Français. Dans ce cas, un paquets hébergé sur un serveur Français pourrait contenir l'ensemble des codecs et profiter à la totalité des utilisateurs mondiaux sans passer par un mainteneur spécifique.&lt;br /&gt;
&lt;br /&gt;
Enfin, il est relativement aisé de cloisonner l'exécution d'un programme contenu dans un unique binaire en comparaison de la méthode traditionnelle visant à en mettre partout sur le système de fichier d'exploitation. Nous utiliserons cette méthode chaque fois que cela est souhaité afin de ne pas pourrir notre machine de production (faites un &amp;lt;code&amp;gt;tree -a ~/.*&amp;lt;/code&amp;gt; si vous ne voyez pas de quoi je veux parler...).&lt;br /&gt;
&lt;br /&gt;
=Inconvénients=&lt;br /&gt;
Comme toute solution est rarement intégralement rose, les avantages apportés par ''AppImage'' viennent à leur tour contrecarrer ceux apporter par la gestion traditionnelle des paquets sous ''Linux'' :&lt;br /&gt;
* pas d'installation et de mise à jour unifié : il n'y a pas d'unique dépôt comme sous une distribution classique centralisant tous les ''AppImage'' pour permettre leur installation et leur mise à jour en une unique commande ou via un magasin d'applications (ceci n'est cependant pas techniquement impossible à l'image de ce qui se fait sur le monde des [[:Category:Ordiphones|ordiphones]])&lt;br /&gt;
* sécurité : aucun support de l'équipe de sécurité de la distribution n'est apporté sur le paquet que vous installez, tant concernant les patchs de sécurité que la revue de code (il faut faire plus attention à ce que l'on télécharge). Le cloisonnement est une bonne pratique pour se prémunir au mieux des actes de malveillance ou simplement de la collecte de données personnelles (sous ''Debian'', ce types de comportement non éthique est généralement supprimé par les mainteneurs à la compilation)&lt;br /&gt;
* espace disque : taille globale du paquet bien plus importante que via les dépôts officiels puisque il embarque tous les composants nécessaires à son fonctionnement. Il n'y a aucune mutualisation des librairies utilisées par les différents programmes ''AppImage'' (contrairement, dans une [très] moindre mesure, à [https://www.flatpak.org/ Flatpak])&lt;br /&gt;
&lt;br /&gt;
La meilleure approche semble donc une utilisation hybride des deux solutions en privilégiant la méthode traditionnelle (gestionnaire de paquets) et en usant des paquets unifiés lorsque le besoin s'en fait sentir en combinaison d'un cloisonnement lorsque cela est possible/souhaitable.&lt;br /&gt;
&lt;br /&gt;
=Construction d'une image=&lt;br /&gt;
==Dépendances==&lt;br /&gt;
''AppImage'' n'a besoin pour fonctionner que de &amp;lt;code&amp;gt;libfuse2&amp;lt;/code&amp;gt;. Il convient alors de l'installer sur votre système (''Debian 12'' pour l'exemple).&lt;br /&gt;
 apt install --no-install-recommends libfuse2&lt;br /&gt;
&lt;br /&gt;
L'[https://github.com/AppImage/AppImageKit outil] permettant la construction des images étant lui même un paquet ''AppImage'', il suffit de le télécharger et de le rendre exécutable pour pouvoir commencer à l'utiliser.&lt;br /&gt;
 wget https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage -O /usr/local/bin/appimagetool&lt;br /&gt;
 chmod +x /usr/local/bin/appimagetool&lt;br /&gt;
&lt;br /&gt;
==Construction d'une image==&lt;br /&gt;
L'empaquetage d'une application, bien que suivant une trame générique, comporte des spécificités inhérente au programme que vous traitez. Les grandes lignes de ce qui sera montré dans cette section sera transposable pour le votre mais il ne me sera pas possible de rédiger une procédure universelle. Il faudra inévitablement galérer un peu pour votre cas particulier.&lt;br /&gt;
&lt;br /&gt;
===Principes===&lt;br /&gt;
La structure d'un paquet ''AppImage'' est globalement la [https://docs.appimage.org/packaging-guide/manual.html#creating-an-appdir-manually suivante] :&lt;br /&gt;
 AppDir/&lt;br /&gt;
 AppDir/AppRun&lt;br /&gt;
 AppDir/myapp.desktop&lt;br /&gt;
 AppDir/myapp.png&lt;br /&gt;
 AppDir/usr/bin/myapp&lt;br /&gt;
 AppDir/usr/lib/libfoo.so.0&lt;br /&gt;
&lt;br /&gt;
* la totalité des ressources nécessaires au fonctionnement du programme doit être contenue dans le dossier normalisé &amp;lt;code&amp;gt;AppDir/&amp;lt;/code&amp;gt;&lt;br /&gt;
* les chemins aux ressources contenus dans celui-ci doivent obligatoirement êtres relatifs afin de s'assurer que la paquet ''AppImage'' ne va pas utiliser des données (comme des librairies) locales au système. Ce qui donnerait une fausse impression de portabilité (cesserai de fonctionner chez certains utilisateurs)&lt;br /&gt;
* le fichier &amp;lt;code&amp;gt;AppRun&amp;lt;/code&amp;gt; est ce qui est exécuté au lancement d'un paquet ''AppImage'' (point d'entrée). Il peut s'agir de n'importe quel exécutable&lt;br /&gt;
&lt;br /&gt;
Afin de convertir les chemins absolus en relatifs, les commandes &amp;lt;code&amp;gt;busybox strings usr/share/codium/bin/monprog | grep /usr&amp;lt;/code&amp;gt; suivie de &amp;lt;code&amp;gt;sed -i -e 's#/usr#././#g' AppDir/usr/bin/monprog&amp;lt;/code&amp;gt; sont données dans la documentation officielle. Il conviendra bien évidemment de s'assurer que cette commande ne casse pas tout.&lt;br /&gt;
&lt;br /&gt;
===VSCodium===&lt;br /&gt;
[https://vscodium.com/ VSCodium] est une bifurcation de l'éditeur de code [https://code.visualstudio.com/ Visual Studio Code] de ''Microsoft'' purgé de toute références aux pratiques malveillantes de cet éditeur. De part sa nature ''Microsoftienne'' et ceux, malgré les efforts pour en faire un binaire saint, nous cloisonnerons ce logiciel afin qu'il n'ai pas accès à Internet ainsi qu'au répertoire personnel de notre utilisateur via une prison [https://manpages.debian.org/stretch/firejail/firejail.1.en.html Firejail].&lt;br /&gt;
&lt;br /&gt;
Cette application n'étant pas disponible dans ''Debian'', nous allons la construire nous même.&lt;br /&gt;
&lt;br /&gt;
Les étapes de cette section consisteront à télécharger le paquet ''Debian'' (''.deb'') depuis le site de l'éditeur dans un répertoire de travail et d'y transférer son contenu en vu d'un empaquetage ''AppImage''.&lt;br /&gt;
&lt;br /&gt;
====Préparation====&lt;br /&gt;
Création d'une variable de chemin spécifique à notre projet (rendra plus facile les copier/coller pour un autre programme)&lt;br /&gt;
 export appimage=&amp;quot;/tmp/VSCodium/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Création de l'espace de travail&lt;br /&gt;
 mkdir -p $appimage/{AppDir/usr/share/,DEB} &amp;amp;&amp;amp; cd $appimage&lt;br /&gt;
&lt;br /&gt;
Téléchargement de ''VSCodium''&lt;br /&gt;
 wget https://github.com/VSCodium/vscodium/releases/download/1.85.2.24019/codium_1.85.2.24019_amd64.deb -P $appimage/DEB/&lt;br /&gt;
&lt;br /&gt;
Extraction de son contenu&lt;br /&gt;
 dpkg-deb -R $appimage/DEB/codium_1.85.2.24019_amd64.deb $appimage/DEB/&lt;br /&gt;
&lt;br /&gt;
Copie de l'icône et du raccourci pour environnement graphique du programme&lt;br /&gt;
 cp $appimage/DEB/usr/share/pixmaps/vscodium.png $appimage/AppDir/&lt;br /&gt;
 cp $appimage/DEB/usr/share/applications/codium.desktop $appimage/AppDir/&lt;br /&gt;
&lt;br /&gt;
Copie des fichiers nécessaires au fonctionnement du programme&lt;br /&gt;
 cp -rv $appimage/DEB/usr/share/codium $appimage/AppDir/usr/share/&lt;br /&gt;
&lt;br /&gt;
Création d'un point d'entrée à l'exécution de notre paquet&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; $appimage/AppDir/AppRun&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
$(dirname &amp;quot;$0&amp;quot;)/usr/share/codium/codium ~ --ms-enable-electron-run-as-node $@&lt;br /&gt;
#$(dirname &amp;quot;$0&amp;quot;)/usr/share/codium/codium $(dirname &amp;quot;$0&amp;quot;) --ms-enable-electron-run-as-node $@&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{info|le fichier &amp;lt;code&amp;gt;AppRun&amp;lt;/code&amp;gt; est ce qui est exécuté au lancement d'un paquet ''AppImage''. Il peut s'agir de n'importe quel exécutable.}}&lt;br /&gt;
&lt;br /&gt;
 chmod +x $appimage/AppDir/AppRun&lt;br /&gt;
&lt;br /&gt;
====Empaquetage====&lt;br /&gt;
Création du répertoire contenant le résultat&lt;br /&gt;
 mkdir $appimage/VSCodium&lt;br /&gt;
&lt;br /&gt;
Construction du ''AppImage''&lt;br /&gt;
 appimagetool $appimage/AppDir/ $appimage/VSCodium/VSCodium.appimage&lt;br /&gt;
&lt;br /&gt;
Votre application est prête à l'emploi !&lt;br /&gt;
&lt;br /&gt;
La section suivante concerne son cloisonnement. Il est complètement optionnel et vous pouvez vous arrêter là si vous n'en avez pas besoin.&lt;br /&gt;
&lt;br /&gt;
Il est possible d'extraire le contenu du paquet via un &amp;lt;code&amp;gt;VSCodium.appimage --appimage-extract&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Cloisonnement====&lt;br /&gt;
Afin de cloisonner notre application, nous utiliserons le logiciel ''Firejail'', devenu une référence pour cette tâche (il comporte une option spécifique pour notre besoin).&lt;br /&gt;
&lt;br /&gt;
{{attention|L'utilisateur soucieux d'utiliser le cloisonnement devra installer ce programme : &amp;lt;code&amp;gt;apt install --no-install-recommends firejail&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
Création du script d'exécution du paquet cloisonné&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; $appimage/VSCodium/vscodium&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
firejail --quiet --noprofile --nonewprivs --net=none --private=$(dirname &amp;quot;$0&amp;quot;) --private-dev --caps.drop=all --seccomp --appimage $(dirname &amp;quot;$0&amp;quot;)/VSCodium.appimage --no-sandbox&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 chmod +x $appimage/VSCodium/vscodium&lt;br /&gt;
&lt;br /&gt;
Les paramètres utilisés sont les suivants :&lt;br /&gt;
* &amp;lt;code&amp;gt;--quiet&amp;lt;/code&amp;gt; : désactive les sorties de &amp;lt;code&amp;gt;firejail&amp;lt;/code&amp;gt;. Les sorties du programme cloisonné continues quant à elles de s'afficher. La variable  d'environnement &amp;lt;code&amp;gt;FIREJAIL_QUIET=yes&amp;lt;/code&amp;gt; permet le même résultat&lt;br /&gt;
* &amp;lt;code&amp;gt;--noprofile&amp;lt;/code&amp;gt; : ne pas utiliser de profile par défaut (ils foutent plus la merde qu'autre chose). Il est possible de créer les notre&lt;br /&gt;
* &amp;lt;code&amp;gt;--nonewprivs&amp;lt;/code&amp;gt; : permet de s'assurer via le [https://www.man7.org/linux/man-pages/man2/prctl.2.html prctl] &amp;lt;code&amp;gt;NO_NEW_PRIVS&amp;lt;/code&amp;gt; que le processus fils (notre application) ne peut pas obtenir de nouveau privilèges &lt;br /&gt;
* &amp;lt;code&amp;gt;--net=none&amp;lt;/code&amp;gt; : coupe totalement l'accès au réseau de la prison&lt;br /&gt;
* &amp;lt;code&amp;gt;--private=$(dirname &amp;quot;$0&amp;quot;)&amp;lt;/code&amp;gt; : monte le répertoire contenant le script d'exécution de la prison (&amp;lt;code&amp;gt;dirname &amp;quot;$0&amp;quot;&amp;lt;/code&amp;gt;) comme répertoire personnel du programme cloisonné&lt;br /&gt;
* &amp;lt;code&amp;gt;--private-dev&amp;lt;/code&amp;gt; : créé un nouveau répertoire &amp;lt;code&amp;gt;/dev&amp;lt;/code&amp;gt; ne contenant que les fichiers spéciaux ''disc'', ''dri'', ''dvb'', ''hidraw'', ''null'', ''full'', ''zero'', ''tty'', ''pts'', ''ptmx'', ''random'', ''snd'', ''urandom'', ''video'', ''log'', ''shm'', et ''usb''&lt;br /&gt;
* &amp;lt;code&amp;gt;--caps.drop=all&amp;lt;/code&amp;gt; : supprime toute les [https://www.man7.org/linux/man-pages/man7/capabilities.7.html capacités] du noyau. Cela répond au principe de moindre privilèges pour les application ne nécessitant pas d'accès ''root''&lt;br /&gt;
* &amp;lt;code&amp;gt;--seccomp&amp;lt;/code&amp;gt; : active les filtres ''Secure computing mode'' (''Seccomp'') de la liste noir des appels système par défaut&lt;br /&gt;
* &amp;lt;code&amp;gt;--appimage $(dirname &amp;quot;$0&amp;quot;)/VSCodium.appimage --no-sandbox&amp;lt;/code&amp;gt; : permet le cloisonnement d'un paquet ''AppImage''. L'option &amp;lt;code&amp;gt;--nonewprivs&amp;lt;/code&amp;gt; et les filtres de capacités noyau par défaut sont activés avec cette option. Les param_tres qui suivent sont ceux spécifique au programme cloisonné (notre ''AppImage'' en l’occurrence)&lt;br /&gt;
&lt;br /&gt;
Dans la mesure où le cloisonnement coupe l'accès au réseau, l'ajout de modules complémentaires (greffons) à ''VSCodium'' devra se faire via la méthode d'installation hors-ligne par fichier ''.vsix''. Ces fichiers pourront êtres disposés dans le répertoire de travail passé par &amp;lt;code&amp;gt;--private=&amp;lt;/code&amp;gt; afin de les rendre accessibles à l'éditeur de code.&lt;br /&gt;
&lt;br /&gt;
Par commodité, nous pouvons proposer le [https://marketplace.visualstudio.com/_apis/public/gallery/publishers/MS-CEINTL/vsextensions/vscode-language-pack-fr/1.85.2024012409/vspackage pack de langue français] (site officiel des modules de ''Visual Studio Code'') dans l'archive que nous mettrons à disposition des utilisateurs. Pensez à vous chronométrer avant de cliquer sur le lien pour savoir combien de temps vous mettez à simplement trouver le bouton de téléchargement (L’ergonomie façon ''Microsoft''...). Vous pouvez récupérer ce fichier dans l'archive de résultat de cette section le mettre dans votre répertoire de travail &amp;lt;code&amp;gt;$appimage/VSCodium/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Génération de l'archive finale&lt;br /&gt;
 tar -czf /tmp/VSCodium.tar.gz -C $appimage/ VSCodium&lt;br /&gt;
&lt;br /&gt;
Votre application est maintenant prête à être déployée et utilisée !&lt;br /&gt;
&lt;br /&gt;
Les utilisateurs devrons décompresser son contenu dans l'emplacement de leur choix et exécuter le script &amp;lt;code&amp;gt;vscodium&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Busybox_init&amp;diff=1502</id>
		<title>Busybox init</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Busybox_init&amp;diff=1502"/>
		<updated>2024-01-28T11:16:57Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Busybox */ Ajout d'un lien vers les sources de Busybox en caches dans nos fichiers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:distributions_linux]]&lt;br /&gt;
&lt;br /&gt;
[[Busybox]] intègre &amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt;, un programme pouvant être amorcé directement par un noyau ''Linux'' au démarrage d'une machine. Il est ainsi possible de concevoir un système d'exploitation léger composé uniquement d'un noyau et de ''Busybox''. L'adjonction d'outils supplémentaires sur cette base minimaliste pourra engendrer une distribution spécifiquement conçue pour un besoin particulier. Cette association s’avère donc particulièrement intéressante dans des systèmes embarqués tel que les ''appliances'' réseau comme [https://openwrt.org/ OpenWRT] ou [https://dd-wrt.com/ DD-WRT].&lt;br /&gt;
&lt;br /&gt;
Nous verrons comment construire un tel système en partant des sources de chaque programmes depuis une ''GNU/Linux Debian 12 Bookworm''. Les compilations se feront avec l'ensemble des paramètres par défaut. Je recommande d'utiliser une machine (virtuelle ''amd64'' dans mon cas) spécifiquement installée pour cet usage car un grand nombre de dépendances est nécessaire et il serait dommage de pourrir votre environnement de travail...&lt;br /&gt;
&lt;br /&gt;
L'espace de travail sera le répertoire personnel de l'utilisateur ''root''.&lt;br /&gt;
&lt;br /&gt;
=Linux=&lt;br /&gt;
Installation des dépendances&lt;br /&gt;
 apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev libelf-dev libssl-dev libncurses-dev dwarves&lt;br /&gt;
&lt;br /&gt;
Téléchargement des sources du dernier noyau stable (01/11/2023)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Code source&lt;br /&gt;
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz -P ~&lt;br /&gt;
# Signature GPG&lt;br /&gt;
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.sign -P ~&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note : le code source est également disponible dans [https://{{SERVERNAME}}/fichiers/système/noyaux/linux/linux-6.6.tar.xz nos fichiers].&lt;br /&gt;
&lt;br /&gt;
Décompression de l'archive des sources&lt;br /&gt;
 unxz -k ~/linux-6.6.tar.xz&lt;br /&gt;
&lt;br /&gt;
Vérification de la signature GPG de l'archive&lt;br /&gt;
 apt install gnupg2&lt;br /&gt;
 gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org&lt;br /&gt;
 gpg2 --tofu-policy good 38DBBDC86092693E&lt;br /&gt;
 gpg2 --tofu-policy good 79BE3E4300411886&lt;br /&gt;
 gpg2 --trust-model tofu --verify ~/linux-6.6.tar.sign&lt;br /&gt;
&lt;br /&gt;
Note : la dernière commande doit vous renvoyer plusieurs lignes de résultat dont &amp;lt;code&amp;gt;gpg: Bonne signature de « Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt; » [totale]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Désarchivage des sources&lt;br /&gt;
 tar xvf ~/linux-6.6.tar&lt;br /&gt;
 cd ~/linux-6.6/&lt;br /&gt;
&lt;br /&gt;
Création d'une configuration de confection saine avec les paramètres par défaut et compilation avec 4 cœurs de processeur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
make defconfig&lt;br /&gt;
make -j4&lt;br /&gt;
# Retour dans le répertoire personnel&lt;br /&gt;
cd ~&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le noyau compilé pour notre architecture x86 64bits se trouve à l'emplacement suivant : &amp;lt;code&amp;gt;~/linux-6.6/arch/x86/boot/bzImage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Busybox=&lt;br /&gt;
Téléchargement des sources&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2&lt;br /&gt;
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2.sha256&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note : le code source est également disponible dans [https://{{SERVERNAME}}/fichiers/système/applications/busybox/busybox-1.36.1.tar.bz2 nos fichiers].&lt;br /&gt;
&lt;br /&gt;
Vérification d'intégrité&lt;br /&gt;
 sha256sum -c ~/busybox-1.36.1.tar.bz2.sha256&lt;br /&gt;
&lt;br /&gt;
Note : la vérification d'intégrité doit renvoyer &amp;lt;code&amp;gt;Réussi&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Extraction de l'archive compressée&lt;br /&gt;
 tar xvf ~/busybox-1.36.1.tar.bz2&lt;br /&gt;
 cd ~/busybox-1.36.1/&lt;br /&gt;
&lt;br /&gt;
Configuration par défaut et compilation du code avec lien statique afin d'embarquer les dépendances dans le binaire final&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
make defconfig&lt;br /&gt;
make -j4 LDFLAGS=&amp;quot;--static&amp;quot;&lt;br /&gt;
# Retour dans le répertoire personnel&lt;br /&gt;
cd ~&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Busybox'' est désormais disponible ici : &amp;lt;code&amp;gt;~/busybox-1.36.1/busybox&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Média d'amorce=&lt;br /&gt;
Nous avons dés à présent en notre possession tous les programmes de notre future système d'exploitation. Vous pouvez préparer les vôtres en vue de les intégrer dans les sections qui suivent.&lt;br /&gt;
&lt;br /&gt;
Les méthodes d'amorçages peuvent varier selon les besoins et votre convenance. Je répertorie personnellement 3 cas d'usage :&lt;br /&gt;
# mémoire morte avec système de fichier classique type ''EXT4''&lt;br /&gt;
# [https://fr.wikipedia.org/wiki/Initrd initramfs]&lt;br /&gt;
# ''PXE''&lt;br /&gt;
&lt;br /&gt;
Toute les démonstrations seront réalisées via [[Qemu]]. La mise en œuvre du réseau ne sera pas détaillée car j'utilise des scripts personnalisés avec mon système. La création d'une interface ''tap'' et son exploitation via la directive &amp;lt;code&amp;gt;-device virtio-net-pci,netdev=network0,mac=$tap_mac -netdev tap,id=network0,ifname=$int_tap,script=no,downscript=no&amp;lt;/code&amp;gt; permet de lier la machine virtuel au réseau physique via l'adjonction d'un pont réseau.&lt;br /&gt;
&lt;br /&gt;
L'étape &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; fera office de tronc commun aux autres sections afin de ne pas alourdir le document avec une redondance inutile et difficilement maintenable. Seule celle-ci nécessite l'utilisation d'un périphérique de type bloc, les deux autres peuvent êtres réalisées directement dans &amp;lt;code&amp;gt;~/rootfs&amp;lt;/code&amp;gt; si vous le désirez. La réalisation successive des trois étapes est toutefois possible. Il faudra simplement penser à remonter &amp;lt;code&amp;gt;~/rootfs&amp;lt;/code&amp;gt; afin de ne pas travailler dans un répertoire vide...&lt;br /&gt;
&lt;br /&gt;
==1. Amorçage en mémoire morte==&lt;br /&gt;
Cette façon de faire permet de modifier simplement le contenu de votre distribution après coup. Il suffit pour se faire de monter le système de fichier en écriture pour y actualiser son contenu à votre guise.&lt;br /&gt;
&lt;br /&gt;
Pour l'exemple, je créerai un fichier simulant un périphérique de type bloc du nom de &amp;lt;code&amp;gt;busybox.dd&amp;lt;/code&amp;gt; au même titre qu'une mémoire morte. En condition réelle, remplacez celui-ci par votre périphérique physique : &amp;lt;code&amp;gt;/dev/sda&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;/dev/mmcblk&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;/dev/nvme0n1&amp;lt;/code&amp;gt;...&lt;br /&gt;
&lt;br /&gt;
Création et formatage de la mémoire racine&lt;br /&gt;
 dd if=/dev/zero of=~/busybox.dd bs=1M count=1024&lt;br /&gt;
 mkfs.ext4 ~/busybox.dd&lt;br /&gt;
&lt;br /&gt;
Création et montage de l'environnement de travail&lt;br /&gt;
 mkdir -p ~/rootfs&lt;br /&gt;
 mount ~/busybox.dd ~/rootfs&lt;br /&gt;
 cd ~/busybox-1.36.1/&lt;br /&gt;
&lt;br /&gt;
Installation de l'arborescence du système ''Busybox'' dans notre système de fichiers avec [https://stackoverflow.com/questions/49369508/kernel-panic-not-syncing-requested-init-linuxrc-failed-error-2 lien statiques]&lt;br /&gt;
 make install CONFIG_PREFIX=../rootfs LDFLAGS=&amp;quot;--static&amp;quot;&lt;br /&gt;
 cd ~&lt;br /&gt;
&lt;br /&gt;
Cette étape a créée les répertoires standards permettant d’accueillir les binaires usuels du système selon la [https://fr.wikipedia.org/wiki/Filesystem_Hierarchy_Standard Filesystem Hierarchy Standard] (''FHS''). L'exécutable &amp;lt;code&amp;gt;busybox&amp;lt;/code&amp;gt; précédemment compilé a été copié dans le nouveau &amp;lt;code&amp;gt;/bin&amp;lt;/code&amp;gt; et des liens symboliques ont étés créés pointant vers celui-ci avec le nom de tous les utilitaires qu'il contient.&lt;br /&gt;
&lt;br /&gt;
Création des points montages des pseudos systèmes de fichiers usuels, de la table de montages statiques et du répertoire accueillant notre futur script d'initialisation&lt;br /&gt;
 mkdir -p ~/rootfs/proc ~/rootfs/sys ~/rootfs/dev&lt;br /&gt;
 mkdir -p ~/rootfs/etc&lt;br /&gt;
 touch ~/rootfs/etc/fstab&lt;br /&gt;
 mkdir -p ~/rootfs/etc/init.d&lt;br /&gt;
&lt;br /&gt;
Script d'initialisation du système&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash -c &amp;quot;cat &amp;gt; ~/rootfs/etc/init.d/rcS&amp;quot; &amp;lt;&amp;lt; _EOF_&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
# Message d'accueil&lt;br /&gt;
echo &amp;quot;Busybox ycharbi.fr&amp;quot;&lt;br /&gt;
# Pseudos systèmes de fichiers usuels&lt;br /&gt;
mount -t proc proc /proc&lt;br /&gt;
mount -t sysfs sysfs /sys&lt;br /&gt;
mount -t devtmpfs none /dev&lt;br /&gt;
&lt;br /&gt;
# Configuration réseau&lt;br /&gt;
ip addr add 10.0.0.1/24 dev eth0&lt;br /&gt;
ip link set dev eth0 up&lt;br /&gt;
ip route add default via 10.0.0.254 dev eth0&lt;br /&gt;
&lt;br /&gt;
# Clavier en AZERTY&lt;br /&gt;
loadkmap &amp;lt; /etc/fr.map&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Attribution du droit d'exécution au script d'initialisation&lt;br /&gt;
 chmod +x ~/rootfs/etc/init.d/rcS&lt;br /&gt;
&lt;br /&gt;
Configuration des Télétypes (''TTY'')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash -c &amp;quot;cat &amp;gt; ~/rootfs/etc/inittab&amp;quot; &amp;lt;&amp;lt; _EOF_&lt;br /&gt;
::sysinit:/etc/init.d/rcS&lt;br /&gt;
ttyS0::respawn:/bin/sh&lt;br /&gt;
tty2::askfirst:-/bin/sh&lt;br /&gt;
tty3::askfirst:-/bin/sh&lt;br /&gt;
tty4::askfirst:-/bin/sh&lt;br /&gt;
tty4::respawn:/sbin/getty 38400 tty5&lt;br /&gt;
tty5::respawn:/sbin/getty 38400 tty6&lt;br /&gt;
::ctrlaltdel:/sbin/reboot&lt;br /&gt;
::shutdown:/sbin/swapoff -a&lt;br /&gt;
::shutdown:/bin/umount -a -r&lt;br /&gt;
::restart:/sbin/init&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce fichier définit les ''TTY'' qui doivent êtres invoqués au lancement de &amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt;. Vous devrez probablement adapter ceci à votre besoin. La documentation de ces lignes ainsi que de la configuration appliquée par défaut en cas d'absence du fichier est disponible dans &amp;lt;code&amp;gt;~/busybox-1.36.1/examples/inittab&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Création du binaire de traduction clavier afin d'utiliser l{{'}}''AZERTY''&lt;br /&gt;
 busybox dumpkmap &amp;gt; ~/rootfs/etc/fr.map&lt;br /&gt;
&lt;br /&gt;
À ce stade, notre mémoire morte est prête.&lt;br /&gt;
&lt;br /&gt;
Pour permettre son amorçage, un éventail de possibilités s'offre à vous : [[Grub]]; [[Systemd-boot]]; [[Efibootmgr#Création_d'une_entrée_de_type_STUB|UEFI stub]]; [[Ipxe]]; [[Installation_slax_-_UEFI_64bits#Préparation_de_l'environnement_hôte|Syslinux]]... Pour ma part et comme précisé en introduction, j'utiliserai [[Qemu#Démarrage_de_la_machine_virtuelle|Qemu]] afin de simplifier au maximum l'exposé.&lt;br /&gt;
&lt;br /&gt;
Démontage du système de fichier&lt;br /&gt;
 umount ~/rootfs&lt;br /&gt;
&lt;br /&gt;
Note : si vous comptez poursuivre les étapes des sections suivantes, pensez à remonter ce système de fichier ou à en copier le contenu dans un autre répertoire de travail afin de ne pas recommencer à zéro.&lt;br /&gt;
&lt;br /&gt;
Test du système avec ''Qemu'' (&amp;lt;code&amp;gt;apt install --no-install-recommends qemu-system-x86&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 \&lt;br /&gt;
--enable-kvm \&lt;br /&gt;
-m 2048 \&lt;br /&gt;
-device virtio-balloon \&lt;br /&gt;
-kernel ~/linux-6.6/arch/x86/boot/bzImage \&lt;br /&gt;
-append &amp;quot;ro root=/dev/sda console=ttyS0 quiet&amp;quot; \&lt;br /&gt;
-cpu host -smp cores=2,threads=1,sockets=1 \&lt;br /&gt;
-serial mon:stdio \&lt;br /&gt;
-drive id=disk,file=&amp;quot;${HOME}&amp;quot;/busybox.dd,format=raw,if=none \&lt;br /&gt;
-device ahci,id=ahci \&lt;br /&gt;
-device ide-hd,drive=disk,bus=ahci.0 \&lt;br /&gt;
-display none&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour un affichage sans port console, il faut supprimer le paramètre &amp;lt;code&amp;gt;console=ttyS0&amp;lt;/code&amp;gt; de la directive &amp;lt;code&amp;gt;-append&amp;lt;/code&amp;gt;; supprimer la directive &amp;lt;code&amp;gt;-display none&amp;lt;/code&amp;gt; et remplacer la ligne &amp;lt;code&amp;gt;ttyS0::respawn:/bin/sh&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;tty1::respawn:/bin/sh&amp;lt;/code&amp;gt; dans le &amp;lt;code&amp;gt;inittab&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==2. Amorçage en initramfs==&lt;br /&gt;
L'utilisation d'un système de fichiers initial en mémoire à accès aléatoire apporte encore plus de légèreté à la solution. Un unique fichier compressé vient s'ajouter au noyau en cours d'exécution pour servir la racine construite précédemment. Le système est exécuté intégralement en mémoire vive et peut donc se voir distribué via des protocoles réseaux tel que ''TFTP'' ou ''HTTP''.&lt;br /&gt;
&lt;br /&gt;
Construction de l'archive compressée ''Initramfs''&lt;br /&gt;
 cd ~/rootfs &amp;amp;&amp;amp; find . -print0 | cpio --null -ov --format=newc | gzip -9 &amp;gt; ../initramfs.cpio.gz &amp;amp;&amp;amp; cd ~&lt;br /&gt;
&lt;br /&gt;
Test du système avec ''Qemu''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 \&lt;br /&gt;
--enable-kvm \&lt;br /&gt;
-m 2048 \&lt;br /&gt;
-device virtio-balloon \&lt;br /&gt;
-kernel ~/linux-6.6/arch/x86/boot/bzImage \&lt;br /&gt;
-append &amp;quot;ro rootfstype=ramfs rdinit=/sbin/init console=ttyS0 quiet&amp;quot; \&lt;br /&gt;
-initrd ~/initramfs.cpio.gz \&lt;br /&gt;
-cpu host -smp cores=2,threads=1,sockets=1 \&lt;br /&gt;
-serial mon:stdio \&lt;br /&gt;
-display none&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les différences de lancement sont :&lt;br /&gt;
* modification des paramètres noyau ([https://www.man7.org/linux/man-pages/man7/kernel-command-line.7.html cmdline]) de la directive &amp;lt;code&amp;gt;-append&amp;lt;/code&amp;gt;&lt;br /&gt;
* ajout de la directive &amp;lt;code&amp;gt;-initrd&amp;lt;/code&amp;gt;&lt;br /&gt;
* les directives concernant le disque ''SATA'' ont étés supprimées&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3. Amorçage initramfs via PXE==&lt;br /&gt;
Cette méthode d'amorçage ne varie pas beaucoup de la précédente puisque elle réutilise les mêmes éléments à savoir le noyau et l{{'}}''Initramfs''. Le delta sera sur la syntaxe du chargeur d'amorçage réseau utilisé ainsi que quelques paramètres passés au noyau. Voici la section fonctionnelle pour [[Ipxe]] :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!ipxe&lt;br /&gt;
&lt;br /&gt;
set menu-timeout 10000&lt;br /&gt;
set submenu-timeout ${menu-timeout}&lt;br /&gt;
isset ${menu-defaut} || set menu-defaut Debian_Buster&lt;br /&gt;
set serveur_ip 10.0.0.100&lt;br /&gt;
&lt;br /&gt;
menu&lt;br /&gt;
item --gap --           -------------DEMARRAGE EN RAM----------------&lt;br /&gt;
item busybox			Lancer Busybox&lt;br /&gt;
&lt;br /&gt;
choose --timeout ${menu-timeout} --default ${menu-default} target &amp;amp;&amp;amp; goto ${target}&lt;br /&gt;
&lt;br /&gt;
:busybox&lt;br /&gt;
kernel http://${serveur_ip}/systemes/noyaux/busybox/bzImage ro initrd=initramfs.cpio.gz rootfstype=ramfs rdinit=/sbin/init console=ttyS0&lt;br /&gt;
initrd http://${serveur_ip}/systemes/noyaux/busybox/initramfs.cpio.gz&lt;br /&gt;
boot&lt;br /&gt;
# https://ipxe.org/cmd/kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* https://dev.to/donaldsebleung/hello-embedded-world-booting-a-minimal-linux-with-busybox-on-risc-v-from-source-2ne9&lt;br /&gt;
* https://cs4118.github.io/dev-guides/debian-kernel-compilation.html&lt;br /&gt;
* ''POSIX Base Specifications Issue 7'' :&lt;br /&gt;
** https://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html&lt;br /&gt;
** Paramètres du shell Sh : https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Param%C3%A8tres_linux&amp;diff=1501</id>
		<title>Paramètres linux</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Param%C3%A8tres_linux&amp;diff=1501"/>
		<updated>2024-01-28T10:59:52Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout d'un lien vers la documentation officielle des paramètres Linux + remplacement des balises &amp;quot;source&amp;quot; obsolètes + corrections de typographies&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:noyau_linux]]&lt;br /&gt;
Cette page regroupe quelques paramètres que l'on peut passer au noyau ''Linux'' lors de son démarrage.&lt;br /&gt;
&lt;br /&gt;
La [https://www.kernel.org/doc/html/v6.5/admin-guide/kernel-parameters.html documentation] officielle regroupe des informations utiles à ce sujet.&lt;br /&gt;
&lt;br /&gt;
=Passer des paramètres au noyau=&lt;br /&gt;
==GRUB==&lt;br /&gt;
Pour éditer les paramètres passés au noyau lors de son démarrage, il faut éditer le fichier &amp;lt;code&amp;gt;/etc/default/grub&amp;lt;/code&amp;gt; et les ajouter dans la variable suivante : &amp;lt;code&amp;gt;GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; séparés par des espaces pour enfin mettre à jour le menu ''GRUB'' :&lt;br /&gt;
 update-grub&lt;br /&gt;
&lt;br /&gt;
==PXELinux==&lt;br /&gt;
Avec PXELinux, les paramètres s'ajoutent après la section ''APPEND'' en les séparant par des espaces.&lt;br /&gt;
&lt;br /&gt;
=Liste de paramètres=&lt;br /&gt;
==Shell sur un port série==&lt;br /&gt;
===Activer un shell sur un port série===&lt;br /&gt;
Afin de pouvoir ce connecter à une machine Linux via son port série, il faut passer l'argument suivant au noyau ([https://www.kernel.org/doc/Documentation/admin-guide/serial-console.rst source]) :&lt;br /&gt;
 console=ttyS0,115200n8 console=tty0&lt;br /&gt;
&lt;br /&gt;
{{info|Cette façon de faire semble spécifique à [[:Category:Systemd|Systemd]] comme expliqué [https://unix.stackexchange.com/questions/248287/how-can-i-stop-auto-login-console-and-getty-in-raspbian-jessie ici]. Pour [https://fr.wikipedia.org/wiki/Init init] et [https://fr.wikipedia.org/wiki/Init#%C2%AB_init_%C2%BB_de_Unix_System_V_(SysV_init) SystemV], il faut passer par le fichier &amp;lt;code&amp;gt;/etc/inittab&amp;lt;/code&amp;gt; documenté [http://tldp.org/LDP/sag/html/config-init.html ici]. Pour [https://fr.wikipedia.org/wiki/Upstart Upstart], voir [https://help.ubuntu.com/community/SerialConsoleHowto ici].}}&lt;br /&gt;
&lt;br /&gt;
===Ajuster les dimensions du shell===&lt;br /&gt;
Sur un port série, le shell a une dimension définie à 80x24 (colonnes*lignes) et ne peut être ajusté dynamiquement à la taille de votre terminal si vous jouez avec celle-ci. Il en résultera un cassage de votre prompte si votre ligne de commande dépasse 80 caractères de large ou si vous exécutez un programme en plein écran type ''Ncurse'' ; [[vim]]... (ceci est dû à un [http://lkml.iu.edu/hypermail/linux/noyau/2005.3/08168.html héritage historique]). Afin de changer les dimensions du ''TTY'', j'utilise deux méthodes. Une manuelle ou une automatique (à l'exécution du terminal lors de la connexion de l'utilisateur).&lt;br /&gt;
&lt;br /&gt;
====Ajustement manuel====&lt;br /&gt;
Afin de définir une taille au ''TTY'', il faut prendre un terminal normal, le mettre à la taille voulue (plein écran par exemple) et [https://stackoverflow.com/questions/263890/how-do-i-find-the-width-height-of-a-terminal-window récupérer ses dimensions] avec &amp;lt;code&amp;gt;tput cols &amp;amp;&amp;amp; tput lines&amp;lt;/code&amp;gt;. Il suffit ensuite de définir cette taille dans la console série via [https://superuser.com/questions/1031272/how-to-extend-vim-editor-to-full-screen-in-putty la commande] &amp;lt;code&amp;gt;stty columns 213 rows 56&amp;lt;/code&amp;gt;. Le terminal garde alors des dimensions normales après fermeture d'un programme plein écran et arrête de casser le prompt.&lt;br /&gt;
&lt;br /&gt;
====Ajustement automatique====&lt;br /&gt;
Cette méthode définit les dimensions du ''TTY'' courant selon celles du terminal qui l'exécute. Ainsi, les valeurs renseignées sont directement les bonnes. Il n'est toutefois toujours pas possible de changer la taille de son terminal avec la souris et de voir cette modification se répercuter automatiquement dans le ''TTY''.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut ajouter [https://unix.stackexchange.com/questions/16578/resizable-serial-console-window/283206 une fonction] au &amp;lt;code&amp;gt;~/.profile&amp;lt;/code&amp;gt; et demander au shell de l'exécuter (dernière ligne) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
res() {&lt;br /&gt;
&lt;br /&gt;
  old=$(stty -g)&lt;br /&gt;
  stty raw -echo min 0 time 5&lt;br /&gt;
&lt;br /&gt;
  printf '\0337\033[r\033[999;999H\033[6n\0338' &amp;gt; /dev/tty&lt;br /&gt;
  IFS='[;R' read -r _ rows cols _ &amp;lt; /dev/tty&lt;br /&gt;
&lt;br /&gt;
  stty &amp;quot;$old&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  # echo &amp;quot;cols:$cols&amp;quot;&lt;br /&gt;
  # echo &amp;quot;rows:$rows&amp;quot;&lt;br /&gt;
  stty cols &amp;quot;$cols&amp;quot; rows &amp;quot;$rows&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[ $(tty) = /dev/ttyS0 ] &amp;amp;&amp;amp; res&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ceci s'exécute à la connexion de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
==Nom des interfaces réseaux==&lt;br /&gt;
===Notion PNIN===&lt;br /&gt;
Avec la version 197 de [[:Category:Systemd|Systemd]] (qui intègre désormais [https://fr.wikipedia.org/wiki/Udev Udev]), une nouvelle méthode de nommage des interfaces réseaux a été introduite, portant le nom de ''Predictable Network Interface Names''.&lt;br /&gt;
&lt;br /&gt;
Voici la [https://access.redhat.com/documentation/fr-fr/red_hat_enterprise_linux/7/html/networking_guide/ch-consistent_network_device_naming justification] de l'introduction de cette fonctionnalité :&lt;br /&gt;
&lt;br /&gt;
''Traditionnellement, les interfaces de réseau sous Linux sont énumérées eth[0123…], mais ces noms ne correspondent pas forcément à des étiquettes sur le châssis. Les plateformes des serveurs modernes avec de multiples adaptateurs réseau peuvent rencontrer des noms d'interfaces qui ne sont pas déterminants et contre-intuitifs. Ceci affecte les adaptateurs réseau intégrés à la carte mère (Lan-on-Motherboard, or LOM) et les adaptateurs add-in (uniques et multi-ports). Dans Red Hat Enterprise Linux 7, Udev prend en charge un certain nombre de schémas d'affectation de noms. Le comportement par défaut est d'assigner des noms fixes basés sur le microprogramme, la topologie et les informations sur l'emplacement. Ceci a pour avantage d'offrir des noms complètement automatiques et prévisibles, qui resteront fixes, même lorsque du matériel est ajouté ou supprimé (il ne se produit pas de ré-énumération) et le matériel endommagé peut être remplacé de façon transparente. L'inconvénient de ce comportement est que les noms sont parfois plus difficiles à lire que les noms traditionnellement utilisés au préalable comme eth0 ou wlan0. Exemple : enp5s0.''&lt;br /&gt;
&lt;br /&gt;
Personnellement je trouve ce système merdique car en plus de rendre les noms d'interfaces incroyablement complexes (si encore il n'y avait que ça...), il les nomment différemment en fonction de la machine sur laquelle est installé le système. Ce qui rend toute tentative d'automatisation par [[script bash|script]] impossible en plus d'obliger l'administrateur à lister ses interfaces avant de commencer à les configurer pour connaître leur nom car in-devinable. Et encore, imaginez quand vous êtes forcé d'utiliser une disposition clavier ''QWERTY'' sur un clavier ''AZERTY'' et que vous avez un nom d'interface comme celui-ci : ''wlx00c0ca4034'' ou celui-là : ''enx000ec6d8bdac''...&lt;br /&gt;
&lt;br /&gt;
À mon humble avis, il est déplorable qu'une &amp;quot;fonctionnalité&amp;quot; aussi chiante et qui doit concerner le 0,00001% des administrateurs systèmes ayant déjà rencontré LE cas (en fonction de l'alignement des astres dans une galaxie lointaine) où une interface réseau, suite à sont remplacement, a un truck chelou qui se produit avec son nom soit activé de base et face chier les 99,99999% restant...&lt;br /&gt;
&lt;br /&gt;
Pour le désactiver, il faut entrer le paramètre suivant :&lt;br /&gt;
 net.ifnames=0&lt;br /&gt;
&lt;br /&gt;
De plus, je recommande de le désactiver si vous voulez renommer vous-même vos interfaces réseaux comme sur [[Hotspot_wifirst#Changement des noms d'interface|cette documentation]] car sinon cet imbécile de ''Systemd'' ne va pas les prendre en compte (vu qu'il les renommes lui-même en dernière instance - ce que veut ''Systemd'' est toujours prioritaire sur ce que vous voulez, ne l'oubliez pas...).&lt;br /&gt;
&lt;br /&gt;
De plus amples informations sont disponibles (notamment sur les 3 méthodes possibles de désactivation) sur le [https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames site officiel].&lt;br /&gt;
&lt;br /&gt;
===Renommage par Iproute2===&lt;br /&gt;
Notez qu'il est également possible de [https://serverfault.com/questions/247767/cannot-delete-gre-tunnel renommer manuellement] une interface réseau via &amp;lt;code&amp;gt;iproute2&amp;lt;/code&amp;gt; :&lt;br /&gt;
 ip link set eth0 down&lt;br /&gt;
 ip link set dev eth0 name toto0&lt;br /&gt;
 ip link set toto0 up&lt;br /&gt;
&lt;br /&gt;
''Note : Il est impératif d'éteindre l'interface avant d'effectuer la modification (sinon on se tape un &amp;quot;RTNETLINK answers: Device or resource busy&amp;quot;).''&lt;br /&gt;
&lt;br /&gt;
===Altname Iproute2===&lt;br /&gt;
Depuis [https://lwn.net/Articles/806010/ Linux 5.5], il est possible de définir des noms alternatifs dépassants la limite des 15 caractères sur les interfaces réseaux (désormais limité à [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7a56493f0620 128 caractères]). Ainsi, une interface peut se voir attribuer des noms alternatifs (lire supplémentaires) longs qui seront utilisables dans les commandes au même titre que le nom principal.&lt;br /&gt;
&lt;br /&gt;
Prenons par exemple les interfaces suivantes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
2: dummy0: &amp;lt;BROADCAST,NOARP&amp;gt; mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000&lt;br /&gt;
    link/ether ae:67:a9:67:46:86 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour ajouter un nom alternatif à l'interface ''dummy0'', il faudra faire ceci :&lt;br /&gt;
 ip link prop add dummy0 altname lesdocumentaionsdecemecsonttropdelaballe&lt;br /&gt;
&lt;br /&gt;
Ce qui donnera :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
2: dummy0: &amp;lt;BROADCAST,NOARP&amp;gt; mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000&lt;br /&gt;
    link/ether ae:67:a9:67:46:86 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    altname lesdocumentaionsdecemecsonttropdelaballe&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il donc possible d’interagir avec cette interface directement via ce nom alternatif :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip link show lesdocumentaionsdecemecsonttropdelaballe&lt;br /&gt;
2: dummy0: &amp;lt;BROADCAST,NOARP&amp;gt; mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000&lt;br /&gt;
    link/ether ae:67:a9:67:46:86 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    altname lesdocumentaionsdecemecsonttropdelaballe&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rotation de la console==&lt;br /&gt;
Si vous avez un écran monté en vertical, il est possible de préciser à la console ([https://www.noyau.org/doc/Documentation/fb/fbcon.txt fbcon]) de pivoter pour vous éviter un torticolis et avoir une plus grande surface d'affichage. La méthode utilisée est expliquée simplement [https://askubuntu.com/questions/237963/how-do-i-rotate-my-display-when-not-using-an-x-server ici].&lt;br /&gt;
&lt;br /&gt;
'''Ce qu'il faut savoir :'''&lt;br /&gt;
* '''0''' : Rotation normale&lt;br /&gt;
* '''1''' : Rotation horaire&lt;br /&gt;
* '''2''' : Rotation anti-horaire&lt;br /&gt;
* '''3''' : Inverser l'affichage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Paramètre noyau :'''&lt;br /&gt;
 fbcon=rotate:1&lt;br /&gt;
&lt;br /&gt;
''Note : S'applique à tout les TTY.''&lt;br /&gt;
&lt;br /&gt;
'''Changement dynamique'''&lt;br /&gt;
&lt;br /&gt;
Pour le TTY actif :&lt;br /&gt;
 echo 1 &amp;gt; /sys/class/graphics/fbcon/rotate&lt;br /&gt;
&lt;br /&gt;
Pour tout les TTY :&lt;br /&gt;
 echo 1 &amp;gt; /sys/class/graphics/fbcon/rotate_all&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt&lt;br /&gt;
&lt;br /&gt;
=Désactiver la journalisation dans le shell=&lt;br /&gt;
Lorsque la verbosité est passée en paramètre du noyau et que l'on branche une clé ''USB'', un câble réseau, etc... Ça crache les évènements journal directement dans le shell comme sur un équipement Cisco. Pour désactiver ça, il faut créer le fichier suivant avec ce contenu :&lt;br /&gt;
 vim /etc/sysctl.d/20-quiet-printk.conf&lt;br /&gt;
&lt;br /&gt;
 kernel.printk = 3 3 3 3&lt;br /&gt;
&lt;br /&gt;
Un simple redémarrage suffit pour prendre en compte le changement. Si vous voulez appliquer le changement immédiatement (vous êtes en plein test et redémarrer n'est pas envisageable), exécutez simplement cette commande (non testé mais ça viens de la même source donc il n'y a pas de raison que cela ne fonctionne pas) :&lt;br /&gt;
 echo &amp;quot;3 3 3 3&amp;quot; &amp;gt; /proc/sys/kernel/printk&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://wiki.archlinux.org/index.php/Silent_boot#sysctl&lt;br /&gt;
* https://unix.stackexchange.com/questions/44999/how-can-i-hide-messages-of-udev/45525#45525&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Vim&amp;diff=1500</id>
		<title>Vim</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Vim&amp;diff=1500"/>
		<updated>2024-01-27T12:01:17Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Quelque commandes */ Correction de la phrase de présentation + remplacement d'une prime inversée par une prime&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:éditeurs de texte]]&lt;br /&gt;
[[Fichier:Vim logo.svg|100px]]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Vim Vim] est un éditeur de texte, bifurcation de [https://fr.wikipedia.org/wiki/Vi_(logiciel) vi], signifiant &amp;quot;VI aMélioré&amp;quot; permettant d'éditer des documents de type texte (notamment des fichiers de configuration) dans un terminal ou une console (''shell''). Il ne nécessite pas d'interface graphique pour être exécuté, ce qui en fait un excellent outil sur un serveur, dépourvu d'[[:Category:Environnements bureau|environnements de bureau]].&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
 apt install vim&lt;br /&gt;
&lt;br /&gt;
=Comportement=&lt;br /&gt;
Vim possède 5 modes :&lt;br /&gt;
# Le mode interactif&lt;br /&gt;
# Le mode insertion&lt;br /&gt;
# Le mode commande&lt;br /&gt;
# Le mode visuel&lt;br /&gt;
# Le mode recherche&lt;br /&gt;
&lt;br /&gt;
==Mode interactif==&lt;br /&gt;
Lorsque ''Vim'' est exécuté, il est par défaut en mode interactif. Ce mode permet d'utiliser des combinaisons de touche pour interagir avec le texte du document en cours d'édition. Il est par exemple possible, en une combinaison, de couper 4 lignes de texte et de les coller dans un autre emplacement du document, voir dans un autre document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Mettre un tableau avec les touches qu'on utilise souvent avec le mode interactif&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mode insertion==&lt;br /&gt;
Le mode insertion est le mode classique d'édition de texte. C'est celui dans lequel on tape du texte comme dans n'importe quel autre éditeur.&lt;br /&gt;
&lt;br /&gt;
Pour revenir au mode interactif, il faut presser la touche &amp;lt;code&amp;gt;&amp;lt;Echap&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Mode commande==&lt;br /&gt;
Ce mode permet d’interagir avec ''Vim'' par l'intermédiaire de commandes. Ces dernières vont permettre d'enregistrer le document, quitter ''Vim'', importer un document dans un autre, passer des expressions régulières, activer des options et bien d'autres choses...&lt;br /&gt;
&lt;br /&gt;
On entre une commande en étant au préalable en mode interactif et en tapant &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Quelque commandes===&lt;br /&gt;
Activer l'affichage des numéros de lignes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se nu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
désactiver l'affichage des numéros de lignes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se nu!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activer la coloration syntaxique&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
syn on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Désactiver la coloration syntaxique&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
syn off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afficher la ligne où se trouve le curseur&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set cursorline&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Masquer le trait de soulignement&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set cursorline!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Commenter plusieurs lignes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
,+4 s/^/#/g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dé-commenter plusieurs lignes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
.,+4 s/^#//g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Plus simple, pour commenter (après une sélection des lignes à commenter en mode visuel bloc &amp;lt;code&amp;gt;&amp;lt;maj&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/code&amp;gt; et un appui sur &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
s/^/#&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dé-commenter (après sélection &amp;lt;code&amp;gt;&amp;lt;maj&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
s/#//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou &amp;lt;code&amp;gt;&amp;lt;maj&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;&amp;lt;x&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ajouter en fin de ligne (après sélection &amp;lt;code&amp;gt;&amp;lt;maj&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
s/$/\ :\ &lt;br /&gt;
s/$/;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ajouter au niveau du curseur (après sélection &amp;lt;code&amp;gt;&amp;lt;ctrl&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
s/\%V/\ :&lt;br /&gt;
s/\%V/^I&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;vim ajouter à partir du curseur (À trouver) http://andrewradev.com/2011/05/08/vim-regexes/&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Placer des curseur là ou on veut pour pouvoir utiliser les regex d'en haut de façon ultra puissante&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer un mot par un autre&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
%s/Mot_initial/Nouveau_mot/g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Changer encodage caractère&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set fileencoding=latin1&lt;br /&gt;
set fileencoding=utf-8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auto complétion ''CSS'' (une fois renseigné, faire &amp;lt;code&amp;gt;&amp;lt;ctrl&amp;gt;+&amp;lt;x&amp;gt;&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;&amp;lt;ctrl&amp;gt;+&amp;lt;o&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set omnifunc=csscomplete#CompleteCSS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécuter une [[Shell bash|commande Bash]] sans quitter ''Vim''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
!Commande_À_Exécuter&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Importer un fichier depuis ''Vim''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
r Chemin_fichier&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indentation automatique&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se ai&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permettre un copier/coller respectant l'indentation avec &amp;lt;code&amp;gt;se ai&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se paste&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activer/désactiver &amp;lt;code&amp;gt;se paste&amp;lt;/code&amp;gt; en appuyant sur &amp;lt;code&amp;gt;&amp;lt;F2&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set pastetoggle=&amp;lt;F2&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Insensibilité à la casse (utile pour le mode recherche notamment)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se ic&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activer le curseur de sélection avec la souris&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se mouse=a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Désactiver le curseur de sélection avec la souris&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se mouse=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Scinder l'écran pour ouvrir un autre fichier horizontalement&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
split [Nom_fichier] ou :sp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En vertical&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
vspli ou :vsp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{info|Le couple &amp;lt;code&amp;gt;&amp;lt;ctrl-w&amp;gt; + flèche&amp;lt;/code&amp;gt; permet de passer d'un fichier à l'autre. }}&lt;br /&gt;
&lt;br /&gt;
Redéfinir l'espace de l'indentation (pour passer de 8 espaces à 3)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set tabstop=3&lt;br /&gt;
set shiftwidth=3&lt;br /&gt;
set softtabstop=3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Convertir des indentation &amp;quot;espace&amp;quot; en indentation &amp;quot;tabulation&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
%retab!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Créer et gérer des onglets&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
tabnew [nom_fichier]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se déplacer dans les onglets&lt;br /&gt;
&lt;br /&gt;
En avant : &amp;lt;code&amp;gt;gt&amp;lt;/code&amp;gt;, en arrière : &amp;lt;code&amp;gt;gT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ouvrir plusieurs fichiers dans un onglet chacun (à exécuter dans ''Bash'') :&lt;br /&gt;
 vim -p fichier1 fichier2 fichier3&lt;br /&gt;
&lt;br /&gt;
Convertir du texte en majuscule ou en minuscule&lt;br /&gt;
* Inverser la casse : sélectionner le texte avec &amp;lt;code&amp;gt;ctrl+v&amp;lt;/code&amp;gt; et faire un &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou&lt;br /&gt;
&lt;br /&gt;
* On peut utiliser &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; pour mettre en majuscule ou &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; pour mettre en minuscule&lt;br /&gt;
&lt;br /&gt;
Masquer les commentaires d'un fichier (à ajouter dans un [[#fichiers de configuration|fichier de configuration]])&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set fdm=expr&lt;br /&gt;
set fde=getline(v:lnum)=~'^\\s*#'?1:getline(prevnonblank(v:lnum))=~'^\\s*#'?1:getline(nextnonblank(v:lnum))=~'^\\s*#'?1:0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour '''déplier''' temporairement un bloc de commentaires (un bloc correspondant dans ce cas à plusieurs lignes consécutives commençant par le caractère '''#'''), placez votre curseur sur le pli correspondant au bloc compacté et tapez &amp;lt;code&amp;gt;zo&amp;lt;/code&amp;gt; (ou pressez simplement sans sélection pour agir sur tout le document), et &amp;lt;code&amp;gt;zm&amp;lt;/code&amp;gt; pour '''le replier'''. Si vous avez déplié plusieurs blocs, vous pouvez '''tous les replier''' d'un coup avec &amp;lt;code&amp;gt;zM&amp;lt;/code&amp;gt; ; à l'inverse, vous pouvez '''déplier tous les blocs''' d'un seul coup avec &amp;lt;code&amp;gt;zi&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utiliser Vim en tant qu'éditeur hexadécimale ([http://pellelatarte.fr/2010/10/utiliser-vi-en-editeur-hexadecimal/ source])&lt;br /&gt;
 %!xxd&lt;br /&gt;
Revenir à la normal&lt;br /&gt;
 %!xxd -r&lt;br /&gt;
&lt;br /&gt;
{{attention|Un enregistrement en mode hexadécimale enregistrera le texte comme tel, il faudra alors désactiver ce mode et réenregistrer le document pour revenir à la normal.}}&lt;br /&gt;
&lt;br /&gt;
Garder la position du curseur là où il était à la [https://askubuntu.com/questions/202075/how-do-i-get-vim-to-remember-the-line-i-was-on-when-i-reopen-a-file fermeture] du fichier&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
if has(&amp;quot;autocmd&amp;quot;)&lt;br /&gt;
	au BufReadPost * if line(&amp;quot;'\&amp;quot;&amp;quot;) &amp;gt; 0 &amp;amp;&amp;amp; line(&amp;quot;'\&amp;quot;&amp;quot;) &amp;lt;= line(&amp;quot;$&amp;quot;) | exe &amp;quot;normal! g'\&amp;quot;&amp;quot; | endif&lt;br /&gt;
endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Désactiver les fonctions agaçantes===&lt;br /&gt;
Avec les mises à jour de ''Vim'', de plus en plus de fonctions inutiles et contres-productives sont installées par défaut (''Debian Stretch'', si tu m'entends...). Ce qui suit a pour but de rendre ''Vim'' de nouveau utilisable comme dans le bon vieux temps.&lt;br /&gt;
&lt;br /&gt;
Désactiver l'ajout automatique de commentaires ([https://superuser.com/questions/271023/vim-can-i-disable-continuation-of-comments-to-the-next-line source])&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set formatoptions-=cro&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Désactiver la gestion de la souris (qui empêche le copier/coller !)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set mouse=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Corrections de bogues===&lt;br /&gt;
====Corriger le problème des flèches qui affichent A B C D====&lt;br /&gt;
De façon totalement aléatoire et sur certaines configurations, l'utilisation des flèches au clavier enclenche automatiquement le monde insertion et tape les lettres A, B, C ou D en fonction de la flèche pressée. Il semble que la façon de régler ce problème diffère selon les configurations. Une liste impressionnante de palliatifs est trouvable [https://vim.fandom.com/wiki/Fix_arrow_keys_that_display_A_B_C_D_on_remote_shell ici]. La solution [https://vim.fandom.com/wiki/Fix_arrow_keys_that_display_A_B_C_D_on_remote_shell#Solution_24 n°24] a réglée celui rencontré sur une Debian 12 installée via ''PXE'' comme des centaines d'autres chaque années dans mon infrastructure (celle-là a décidée de me faire chier).&lt;br /&gt;
&lt;br /&gt;
Il faut re-cartographier les touches fléchées en ajoutant ceci dans le &amp;lt;code&amp;gt;~/.vimrc&amp;lt;/code&amp;gt; :&lt;br /&gt;
 nnoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OA &amp;lt;UP&amp;gt;&lt;br /&gt;
 nnoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OB &amp;lt;DOWN&amp;gt;&lt;br /&gt;
 nnoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OC &amp;lt;RIGHT&amp;gt;&lt;br /&gt;
 nnoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OD &amp;lt;LEFT&amp;gt;&lt;br /&gt;
 inoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OA &amp;lt;UP&amp;gt;&lt;br /&gt;
 inoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OB &amp;lt;DOWN&amp;gt;&lt;br /&gt;
 inoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OC &amp;lt;RIGHT&amp;gt;&lt;br /&gt;
 inoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OD &amp;lt;LEFT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Presses papiers=&lt;br /&gt;
''Vim'' possèdes plusieurs presses papiers appelés registres (''register'' ou ''buffers'') qui peuvent être exploités afin de maintenir plusieurs copier/coller en mémoires. Il y en a un par lettre de l'alphabet. Ils s'utilisent en '''mode interactif''' avec les touches &amp;lt;code&amp;gt;&amp;lt;&amp;quot;&amp;gt;+&amp;lt;lettre&amp;gt;+&amp;lt;raccourci&amp;gt;&amp;lt;/code&amp;gt; de cette manière :&lt;br /&gt;
&lt;br /&gt;
{{attention|Le contenu des presses papiers est sauvegardé même après avoir quitté ''Vim'' (ces informations sont stockés dans le fichier &amp;lt;code&amp;gt;~/.viminfo&amp;lt;/code&amp;gt;). Ceci peut avoir des conséquences en terme de confidentialité des informations. Au besoin, pensez à utiliser le registre poubelle ainsi que la suppression du contenu des registres expliqué plus bas.}} &lt;br /&gt;
&lt;br /&gt;
Copier des lignes dans des presses papiers différents&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;ayy&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;byy&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;cyy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Coller des lignes depuis des presses papiers différents&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;ap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;bp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;cp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pour ajouter une ligne à un presse papier, il faut préciser la lettre du presse papier voulu, en majuscule &amp;lt;code&amp;gt;&amp;quot;Byy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pour copier/coller en prenant en compte le presse papier par défaut (celui que l'on à lors d'un simple &amp;lt;code&amp;gt;yy&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;+yy&amp;lt;/code&amp;gt; copie une ligne pour le presse papier par défaut, et &amp;lt;code&amp;gt;&amp;quot;+p&amp;lt;/code&amp;gt; colle le presse papier par défaut (ceci n'a aucun intérêt...).&lt;br /&gt;
&lt;br /&gt;
Registre poubelle (équivalent du /dev/null). Permet de supprimer des lignes sans les conserver dans un registre&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;_dd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour vider le [https://stackoverflow.com/questions/19430200/how-to-clear-vim-registers-effectively contenu] d'un registre, il faut utiliser la commande &amp;lt;code&amp;gt;:let @a = ''&amp;lt;/code&amp;gt; en remplaçant la lettre par celle de votre registre ( utiliser &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; pour le registre par défaut).&lt;br /&gt;
&lt;br /&gt;
=Historique=&lt;br /&gt;
L'historique de l'éditeur est parsemé dans le fichier &amp;lt;code&amp;gt;~/.viminfo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pour [https://unix.stackexchange.com/questions/204689/how-to-clear-search-and-command-history-in-vim purger] intégralement celui des recherches, il est possible de faire &amp;lt;code&amp;gt;:call histdel('/')&amp;lt;/code&amp;gt;. Pour celui des commandes, on fera &amp;lt;code&amp;gt;:call histdel(':')&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Il est également possible de ne supprimer qu'une entrée en particulier via un motif: &amp;lt;code&amp;gt;:call histdel(&amp;quot;:&amp;quot;, &amp;quot;MOT_CLÉ_CONTENU_DANS_VOTRE_COMMANDE&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Macros=&lt;br /&gt;
Définir l'intérêt des macros...&lt;br /&gt;
&lt;br /&gt;
Créer des macros&lt;br /&gt;
&amp;lt;code&amp;gt;q+&amp;lt;lettre&amp;gt;&amp;lt;/code&amp;gt; pour passer en mode enregistrement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; pour terminer l'enregistrement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;@+&amp;lt;lettre&amp;gt;&amp;lt;/code&amp;gt; pour la jouer (ça fait comme un presse papier).&lt;br /&gt;
&lt;br /&gt;
=Fichiers de configuration=&lt;br /&gt;
Les fichiers de configuration de ''Vim'' permettent de définir des paramètres activés à chaque lancement de l'éditeur. Il en existe deux types :&lt;br /&gt;
* Un général, actif pour tout les utilisateurs du système : &amp;lt;code&amp;gt;/etc/vim/vimrc&amp;lt;/code&amp;gt;&lt;br /&gt;
* Un courant, pour chaque utilisateurs en particulier : &amp;lt;code&amp;gt;~/.vimrc&amp;lt;/code&amp;gt;&lt;br /&gt;
Il suffit de renseigner des commandes Vim (sans les ''':''') dans ces fichiers pour que leur effet soit permanent.&lt;br /&gt;
&lt;br /&gt;
Pour exécuter ''Vim'' tout en [https://evanhahn.com/ignore-vimrc-with-vim/ ignorant] les fichiers de configuration :&lt;br /&gt;
 vim -u NONE&lt;br /&gt;
&lt;br /&gt;
=Greffons=&lt;br /&gt;
Il est possible d'ajouter des fonctionnalités supplémentaires à ''Vim'' par l'intermédiaire de greffons (''plugins''). Il sont à mettre (selon le même principe que le ''vimrc'') dans le répertoire général &amp;lt;code&amp;gt;/etc/vim/&amp;lt;/code&amp;gt; ou dans &amp;lt;code&amp;gt;~/.vim/&amp;lt;/code&amp;gt; pour les rendre spécifiques à chaque utilisateur.&lt;br /&gt;
&lt;br /&gt;
==Greffons que j'utilise==&lt;br /&gt;
Pour une configuration adaptée à un développement ''WEB'', les informations de ce [https://gitea.ycharbi.fr/ycharbi/vim-dev-web dépôt] peuvent-êtres utiles.&lt;br /&gt;
&lt;br /&gt;
===Emmet===&lt;br /&gt;
Orienté programmation web, le greffon [http://emmet.io/ Emmet] (anciennement ''Zen Coding'') permet, en utilisant une syntaxe (très) raccourcie, d'écrire du code ''HTML'' et ''CSS'' de façon extrêmement efficace. De plus, il est disponible sur une [http://emmet.io/download/ multitude d'éditeurs]. Il s'installe de la façon suivante :&lt;br /&gt;
&lt;br /&gt;
# Télécharger ''Emmet'' depuis les [https://github.com/mattn/emmet-vim sources]&lt;br /&gt;
# Décompresser les répertoires '''autoload''' et '''plugin''' dans &amp;lt;code&amp;gt;~/.vim/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour utiliser ''Emmet'', il faut écrire dans un fichier les différentes [http://docs.emmet.io/cheat-sheet/ expressions possibles] et faire la combinaison de touches (en mode interactif) &amp;lt;code&amp;gt;&amp;lt;c-y&amp;gt;,&amp;lt;/code&amp;gt; (faire '''ctrl + y''' et ensuite sur ''',''').&lt;br /&gt;
&lt;br /&gt;
===IndentLine===&lt;br /&gt;
''IndentLine'' permet d'afficher une ligne verticale marquant le niveau d'indentation de votre code. Il est très utile notamment lorsque les bloques de code sont imbriqués sur énormément de niveau (rendant le repérage visuel extrêmement difficile). Il s'installe de la façon suivante :&lt;br /&gt;
&lt;br /&gt;
# Télécharger ''IndentLine'' depuis les [https://github.com/Yggdroot/indentLine sources]&lt;br /&gt;
# Décompresser le répertoire '''plugin''' dans &amp;lt;code&amp;gt;~/.vim/&amp;lt;/code&amp;gt;&lt;br /&gt;
# Ajouter dans le ''.vimrc'' ce paramètre (l'espace de fin est important) : &amp;lt;code&amp;gt;set list lcs=tab:\|\ &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Gestionnaire de greffons==&lt;br /&gt;
===Vim-plug===&lt;br /&gt;
Télécharger le greffon&lt;br /&gt;
 curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim&lt;br /&gt;
&lt;br /&gt;
Ajouter les greffons à installer et ajouter dans le ''vimrc''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
call plug#begin()&lt;br /&gt;
Plug 'junegunn/vim-easy-align'&lt;br /&gt;
Plug 'vim-airline/vim-airline'&lt;br /&gt;
Plug 'vim-airline/vim-airline-themes'&lt;br /&gt;
Plug 'hzchirs/vim-material'&lt;br /&gt;
call plug#end()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''On trouve les noms de ces greffons sur leur page GIT.''&lt;br /&gt;
&lt;br /&gt;
Installer les greffons mis dans le ''vimrc'' (aller dans &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt;)&lt;br /&gt;
 :PlugInstall&lt;br /&gt;
&lt;br /&gt;
{{info|Tout est mis dans &amp;lt;code&amp;gt;.vim&amp;lt;/code&amp;gt;. Le paquet &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; est nécessaire.}}&lt;br /&gt;
&lt;br /&gt;
Un exemple de ''.vimrc''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se nu&lt;br /&gt;
se termguicolors&lt;br /&gt;
set pastetoggle=&amp;lt;F2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;L'indentation passe à 3 caractères&lt;br /&gt;
set tabstop=3&lt;br /&gt;
set shiftwidth=3&lt;br /&gt;
set softtabstop=3&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Activer les greffons&lt;br /&gt;
call plug#begin()&lt;br /&gt;
   Plug 'junegunn/vim-easy-align'&lt;br /&gt;
   Plug 'vim-airline/vim-airline'&lt;br /&gt;
   Plug 'vim-airline/vim-airline-themes'&lt;br /&gt;
   Plug 'hzchirs/vim-material'&lt;br /&gt;
call plug#end()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Appliquer le thème vim-matérial&lt;br /&gt;
colorscheme vim-material&lt;br /&gt;
let g:airline_theme='material'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Sources de la section====&lt;br /&gt;
* https://github.com/junegunn/vim-plug&lt;br /&gt;
* http://vimcolors.com/&lt;br /&gt;
&lt;br /&gt;
=Couleurs 24bits=&lt;br /&gt;
Pour avoir des couleurs plus sympas avec ''Vim'' (remplace le ''syn on''), il faut utiliser ''se termguicolors''. Attention, il faut que le terminal utilisé soit compatible. [https://github.com/termstandard/colors Cette page Github] peut aider à déterminer si c'est le cas.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* http://cfennajoui.net/vim/traduit/html/usr_30.txt.php&lt;br /&gt;
* http://www.blogduwebdesign.com/developpement-vim/vim-astuce-pour-le-copier-coller/605&lt;br /&gt;
* http://qsdqsd.free.fr/Vim/Vim_-_Un_pas_en_avant.html&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Serveur_de_courriels&amp;diff=1499</id>
		<title>Serveur de courriels</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Serveur_de_courriels&amp;diff=1499"/>
		<updated>2024-01-27T11:48:14Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Replacement des balise de coloration syntaxique en ligne par des balises codes pour optimiser le chargement de la page + correction de fautes de frappes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:service_courriels]]&lt;br /&gt;
&lt;br /&gt;
''Postfix'' est un serveur de messagerie électronique se chargeant de la livraison de courriels sur un réseau ''IP''. Il a été conçu comme une alternative plus rapide, plus facile à administrer et plus sécurisée que l'historique ''Sendmail''.&lt;br /&gt;
&lt;br /&gt;
L'environnement gravitant autour de ce thème étant assez complexe (avec son lot de technologies et de termes spécifiques), un [[#Glossaire|glossaire des notions]] utiles a été rédigé en bas de page. Il est recommandé d'aller y jeter un œil si vous n'êtes pas très familier avec le sujet.&lt;br /&gt;
&lt;br /&gt;
Dans ce document, nous mettrons en place :&lt;br /&gt;
* Le service de courrier électronique [http://www.postfix.org/ Postfix] avec support d{{'}}''IPv4/IPv6'', négociation de chiffrement via ''TLS'' et ''STARTTLS'', utilisateurs ''Postfix'' et gestion de domaines via ''SQLite'', authentification ''SASL'', gestion des alias, des domaines secondaires, des listes noires ainsi que de ''Milter'' pour les liaisons avec ''OpenDKIM'' et ''Spamassassin''&lt;br /&gt;
* Le service ''IMAP'' [https://www.dovecot.org/ Dovecot] avec gestion d{{'}}''IPv4/IPv6'', du ''TLS'' et de ''STARTTLS'' ainsi que des filtres ''Sieve''&lt;br /&gt;
* La signature des messages via le protocole ''DKIM'' par l’intermédiaire du logiciel [http://www.opendkim.org/ OpenDKIM]&lt;br /&gt;
* Du traitement du pourriel avec [https://spamassassin.apache.org/ SpamAssassin]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il faudra vous assurer d'avoir la main sur les éléments suivants :&lt;br /&gt;
* Prérequis :&lt;br /&gt;
** ''Debian'' 11 (''Bullseye'')&lt;br /&gt;
** Un nom de domaine avec un enregistrement ''MX'' et ''A''&lt;br /&gt;
** Une adresse ''IP'' publique fixe avec possibilité d'enregistrement ''PTR''&lt;br /&gt;
&lt;br /&gt;
* Permettre la communication en écoute des ports ''TCP'' suivants :&lt;br /&gt;
** 25 (''SMTP'')&lt;br /&gt;
** 465 (''SMTP'' sur ''TLS'' aussi appelé ''Submission'')&lt;br /&gt;
** 587 (''SMTP'' ''STARTTLS'')&lt;br /&gt;
** 143 (''IMAP'')&lt;br /&gt;
** 993 (''IMAPS'')&lt;br /&gt;
&lt;br /&gt;
{{info|J'attire votre attention sur l'importance d'avoir un opérateur Internet faisant correctement son travail (ce qui commence à se faire rare en France...). Il est indispensable d'avoir une adresse ''IP'' fixe non listés par les principaux prestataires anti-pourriels (voir https://mxtoolbox.com/blacklists.aspx) ainsi que la possibilité d'ajouter un champ ''PTR'' (''DNS'' inversé ou ''reverse DNS'') dans le registre de nom de votre ''FAI''. Sans ces pré-requis, votre service sera difficilement fiable car une partie de vos messages risquent d'être bloqués par les serveurs destinataires. Si vous ne pouvez souscrire à un vrai accès Internet (avec un fournisseur sachant ce qu'est une adresse ''IP'' au lieu de vous fournir de la ''TV''...) comme ceux proposés par la [https://www.ffdn.org/ FFDN] ou [https://www.k-net.fr/ K-net] par exemple, il faudra vous tourner vers des hébergeurs en centre de données et opter pour un hébergement de votre serveur dans leurs locaux ou réaliser un tunnel afin d'utiliser leur ''IP'' chez vous (l'auto-hébergement étant la solution à privilégier dans une optique d'indépendance numérique).}}&lt;br /&gt;
&lt;br /&gt;
=Nom de domaine=&lt;br /&gt;
==Prérequis DNS==&lt;br /&gt;
La messagerie électronique étant dépendante du système de noms de domaine (''DNS''), il vous en faudra un et y définir un enregistrement de type [https://docs.gandi.net/fr/noms_domaine/faq/type_enregistrements_dns/mx_record.html MX] afin d'assurer la distribution de votre courrier.&lt;br /&gt;
&lt;br /&gt;
La façon de configurer les champs de votre zone ''DNS'' étant propre à votre fournisseur de noms, nous ne détaillerons pas cette partie. Sachez seulement que l'enregistrement associant votre nom d'hôte (le champ [https://docs.gandi.net/fr/noms_domaine/faq/type_enregistrements_dns/a_record.html A] pointant sur votre ''IP'' publique) et votre nom de domaine (à ne pas confondre avec le nom de domaine pleinement qualifié (''FQDN'')) devra être configuré pour espérer envoyer et recevoir des courriels.&lt;br /&gt;
&lt;br /&gt;
Il vous faudra donc, pour démarrer, un nom de domaine avec un champ ''A'' et ''MX'' (minimum obligatoire) auquel nous ajouterons, par la suite, un enregistrement ''TXT'' ''SPF'' et ''DKIM'' (facultatifs) afin de diminuer vos chances de finir dans les indésirables de vos destinataires.&lt;br /&gt;
&lt;br /&gt;
Enfin, et toujours dans un soucis de limiter le désagrément susmentionné, il faudra que vous adressiez une demande à votre fournisseur d'accès Internet pour ajouter votre ''FQDN'' à sa zone ''DNS'' inversée (ajout d'un champ de type ''PTR''). Ce point est le plus délicat car plus aucun &amp;quot;grands&amp;quot; ''FAI'' connus ne le permet en France (en 2021). ''Free'' ne propose plus l'option depuis 2019 (bien que toujours présente dans leur interface ''WEB'', celle-ci ne fonctionne plus depuis la migration de leur infrastructure vers ''IPv6'') et font les morts lorsqu'ils sont contactés à ce sujet ; ''SFR'' et ''Bouygues Telecom'' ne sont plus que des fournisseurs de services audiovisuels et ''Orange'' ne sais même pas ce qu'est une adresse ''IP'' fixe (même ''v6''...) alors du ''rDNS''... Internet étant réservé aux professionnels selon leur doctrine malgré leur service d'amateur...&lt;br /&gt;
&lt;br /&gt;
Installation des outils&lt;br /&gt;
 apt update &amp;amp;&amp;amp; apt install --no-install-recommends openssl dnsutils&lt;br /&gt;
&lt;br /&gt;
Test de fonctionnement du champ ''MX''&lt;br /&gt;
 dig exemple.fr MX&lt;br /&gt;
&lt;br /&gt;
La réponse doit contenir une ''ANSWER SECTION'' avec ceci :&lt;br /&gt;
 exemple.fr	10800	IN	MX	10	mail.exemple.fr&lt;br /&gt;
&lt;br /&gt;
Test de fonctionnement du champ ''A''&lt;br /&gt;
 dig mail.exemple.fr A&lt;br /&gt;
&lt;br /&gt;
La réponse doit contenir une ''ANSWER SECTION'' avec ceci :&lt;br /&gt;
 mail.exemple.fr.	&amp;lt;TTL&amp;gt;	IN	A	&amp;lt;VOTRE_IP_PUBLIQUE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Cas du NAT==&lt;br /&gt;
Si votre serveur est placé juste derrière un NAT, il faudra ajouter une entrée dans votre fichier &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt; afin de lui permettre de se résoudre lui-même. Ceci prendra la forme suivante :&lt;br /&gt;
 &amp;lt;IP_du_serveur&amp;gt;	&amp;lt;FQDN&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Éléments secrets=&lt;br /&gt;
Comme tout moyen de communication moderne, les correspondances extérieurs seront chiffrées via des algorithmes négociés au travers du traditionnel protocole de sécurité de la couche transport (''TLS''). La génération d'éléments secrets se fera par le fameux logiciel libre [[openssl|OpenSSL]] que l'on ne présente plus. Nous avons pris le parti de réutiliser ces éléments secrets dans l'ensemble des outils faisant intervenir le chiffrement du système de messagerie. Dans l'idéal, un certificat différent doit être utilisée pour chaque module en nécessitant, conformément à la [https://{{SERVERNAME}}/fichiers/messagerie/courriel/serveur_courriels/anssi/anssi-guide-recommandations_de_securite_relatives_a_tls-v1.2.pdf recommandation] numéro 30 (page 46) du guide de [https://www.ssi.gouv.fr/entreprise/guide/recommandations-de-securite-relatives-a-tls/ recommandation de sécurité relative à TLS] (v1.2) des bonnes pratiques de l{{'}}''ANSSI''.&lt;br /&gt;
&lt;br /&gt;
Création du répertoire d'accueil pour les clés et le certificat x.509&lt;br /&gt;
 mkdir -p /etc/postfix/tls&lt;br /&gt;
&lt;br /&gt;
Génération du certificat et de la clé pour ''Postfix'' et ''Dovecot''&lt;br /&gt;
 openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -out /etc/postfix/tls/courriel.pem -keyout /etc/postfix/tls/courriel.key&lt;br /&gt;
&lt;br /&gt;
Pour cette étape, [[Letsencrypt]] peut très bien être utilisé mais sachez que contrairement au ''WEB'', le monde de la messagerie ne vérifie aucunement l'authenticité des certificats (ce qui rend de fait, le chiffrement caduc en cas d'espionnage ciblé...). Il n'est donc pas dérangeant d'utiliser des certificats auto-signés avec une durée de validité démentielle... Pour une confidentialité forte des échanges (en complément de ''TLS''), tournez-vous plutôt vers le protocole [https://fr.wikipedia.org/wiki/Pretty%20Good%20Privacy PGP] qui peut notamment, en plus d'une exploitation manuelle entre deux clients, être utilisé [https://jnphilipp.org/posts/post/auto-encrypt-all-incoming-email-with-postfix/ automatiquement] avec ''Postfix'' via le module ''gpgmail''.&lt;br /&gt;
&lt;br /&gt;
Génération de la clé ''Diffie-Hellman'' (si l'on ne le fait pas, ''Postfix'' utilise la sienne)&lt;br /&gt;
 openssl dhparam -out /etc/postfix/tls/dh4096.pem 4096&lt;br /&gt;
&lt;br /&gt;
{{info|Avec l'évolution des suites cryptographiques, il devient de plus en plus rare d'utiliser ''Diffie-Hellman'' (au travers des suites ''DHE''). Avec l’avènement de la faille [https://raccoon-attack.com/ Racoon attack], ce protocole est devenu désuet et peu sûr. L'usage de la cryptographie basée sur les courbes elliptiques (''ECC'') pour l'échange de clés de sessions l'a, dans la pratique, remplacé (notamment via ''ECDHE'' et ''ed25519''). Néanmoins (et vous vous en apercevrez peut-être à vos dépends), le monde de la messagerie électronique accuse d'un lourd héritage technologique et d'installations vieillissantes administrées, ou pas, par des gens généralement peu regardants sur l'évolution des standards et dont le principe de veille informatique échappe totalement. Aussi, il n'est pas rare (coucou ''Orange'', une fois de plus...) de devoir supporter des algorithmes et protocoles complètements dépassés pour pouvoir continuer d'échanger avec certains serveurs non mis à jours depuis plusieurs décennies...}}&lt;br /&gt;
&lt;br /&gt;
=Postfix=&lt;br /&gt;
Comme présenté en début de page, ''Postfix'' est l'élément central de notre système de messagerie électronique. Il endosse le rôle de ''MTA'' tout en faisant le lien avec les autres composants de l'installation. S'il peut sembler austère à première vue, la complexité de sa configuration est à la hauteur du service qu'il rend car il n'est pas exagéré de dire que la messagerie est la pierre la plus importante d'un auto-hébergement. Logiciel fiable et très personnalisable, c'est l'un des composants qui, une fois mis en place, se fait le plus oublié dans une infrastructure numérique domestique.&lt;br /&gt;
&lt;br /&gt;
==Installation de Postfix==&lt;br /&gt;
Installation du serveur ''SMTP''&lt;br /&gt;
 apt install --no-install-recommends postfix&lt;br /&gt;
&lt;br /&gt;
''Note : Les réponses aux choix proposés n'ont guère d'importance puisque elles ne font que remplir un fichier que nous remplacerons par la suite.''&lt;br /&gt;
&lt;br /&gt;
==Configuration de Postfix==&lt;br /&gt;
La configuration principale de ''Postfix'' se fait par l'intermédiaire du fichier &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt; qui renseigne un petit sous-ensemble des paramètres contrôlant les opérations du système de messagerie. Les paramètres non explicitement renseignés sont initialisés avec leur valeur par défaut. Les paramètres appliqués explicitement par l'intermédiaire de ce fichier sont visibles après rechargement du service via la commande &amp;lt;code&amp;gt;postconf -n&amp;lt;/code&amp;gt;. La commande &amp;lt;code&amp;gt;postconf -p&amp;lt;/code&amp;gt; permet quand à elle de visualiser la totalité des paramètres appliqués, y compris ceux par défaut.&lt;br /&gt;
&lt;br /&gt;
===Main.cf===&lt;br /&gt;
Édition du fichier de configuration principal&lt;br /&gt;
 vim /etc/postfix/main.cf&lt;br /&gt;
&lt;br /&gt;
La configuration suivante sera utilisée :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# smtpd : entrant/inbound                                                                                  &lt;br /&gt;
# smtp : sortant/outbound&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------ Connexion protocole SMTP ------------------------------------ #&lt;br /&gt;
&lt;br /&gt;
# Bannière affichée après le code 220 lorsque l'on se connecte en SMTP sur le serveur&lt;br /&gt;
smtpd_banner            = $myhostname ESMTP $mail_name&lt;br /&gt;
# Désactive la commande SMTP VRFY. Ceci a pour effet d'empêcher de trouver les adresses existante sur le serveur&lt;br /&gt;
disable_vrfy_command    = yes&lt;br /&gt;
# Impose au client SMTP de démarrer la session SMTP par une commande Helo ou ehlo (cette dernière servant au listage des capacités du serveur)&lt;br /&gt;
smtpd_helo_required     = yes&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------ Gestion des messages locaux (inutile dans notre cas) ------------------------------------ #&lt;br /&gt;
&lt;br /&gt;
# Service qui envoie des notifications &amp;quot;nouveau message&amp;quot;&lt;br /&gt;
biff                    = no&lt;br /&gt;
# Avec le courrier local ça ajoute .NDD aux adresses incomplètes (seulement le nom d'hôte)&lt;br /&gt;
append_dot_mydomain     = no&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------ Nom de machine et réseaux autorisés ------------------------------------ #&lt;br /&gt;
&lt;br /&gt;
# Le nom de la machine du système de messagerie&lt;br /&gt;
# Par défaut c'est hôte.domaine.tld mais il est possible de mettre un nom de domaine inversé&lt;br /&gt;
myhostname              = mail.exemple.fr&lt;br /&gt;
# Le domaine utilisé par défaut pour poster les messages&lt;br /&gt;
myorigin                = mail.exemple.fr&lt;br /&gt;
# Liste des domaines pour lesquels le serveur doit accepter le courrier en local&lt;br /&gt;
mydestination           = mail.exemple.fr, localhost.exemple.fr, localhost&lt;br /&gt;
# Relais par lequel notre serveur doit adresser son trafic (nous n'en utilisons aucun)&lt;br /&gt;
relayhost               =&lt;br /&gt;
# Liste des réseaux locaux autorisés (leur permet d'outrepasser le SASL)&lt;br /&gt;
mynetworks              = 192.168.0.0/16, 127.0.0.0/8&lt;br /&gt;
# Activation d'IPv4 et IPv6 (valeur par défaut)&lt;br /&gt;
inet_protocols          = all&lt;br /&gt;
# Séparateur entre le nom d'utilisateur et les extensions d'adresses&lt;br /&gt;
recipient_delimiter     = +&lt;br /&gt;
# Les utilisateurs locaux ne pourront pas envoyer de messages à &amp;quot;utilisateur@nom-de-domaine-partiel&amp;quot; mais devront spécifier le nom de domaine complet&lt;br /&gt;
append_dot_mydomain     = no&lt;br /&gt;
# Interfaces réseaux à écouter (ici toutes)&lt;br /&gt;
inet_interfaces         = all&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------ Règles SMTP ------------------------------------ #&lt;br /&gt;
&lt;br /&gt;
# Restrictions d'accès appliquées dans le contexte d'une commande RCPT TO&lt;br /&gt;
# permit_mynetworks : Autorise les requêtes si l'IP du client correspond à l'un des réseaux spécifiés dans $mynetworks&lt;br /&gt;
# permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifié&lt;br /&gt;
# reject_non_fqdn_recipient : Rejette la requête lorsque l'adresse RCPT TO n'est pas de forme pleinement qualifiée (FQDN) &lt;br /&gt;
# reject_unauth_destination : Rejette la requête sauf si l'une des propositions listés dans la documentation officielle est vraie&lt;br /&gt;
# check_recipient_access : Rejette les messages à destination des adresses spécifiées dans le fichier correspondant (permet de ne pas envoyer de message à root)&lt;br /&gt;
# reject_unknown_recipient_domain : Rejette la requête lorsque le RCPT TO ne correspond à aucun champ DNS A ou MX&lt;br /&gt;
smtpd_recipient_restrictions =&lt;br /&gt;
        permit_mynetworks,&lt;br /&gt;
        permit_sasl_authenticated,&lt;br /&gt;
        reject_non_fqdn_recipient,&lt;br /&gt;
        reject_unauth_destination,&lt;br /&gt;
        check_recipient_access sqlite:/etc/postfix/sqlite-liste-noire-destinataires.cf,&lt;br /&gt;
        reject_unknown_recipient_domain,&lt;br /&gt;
&lt;br /&gt;
# Règles sur l'échange HELO qui survient avant la connexion&lt;br /&gt;
# permit_mynetworks : Autorise les requêtes si l'IP du client correspond à l'un des réseaux spécifiés dans $mynetworks&lt;br /&gt;
# reject_invalid_helo_hostname : Refuser les échanges HELO invalides&lt;br /&gt;
# reject_non_fqdn_helo_hostname : Refuser les noms d'hôte invalides (non FQDN)&lt;br /&gt;
# reject_unknown_helo_hostname : Refuser les noms d'hôte qui n'ont pas de champ DNS A ou MX dans leurs DNS &lt;br /&gt;
smtpd_helo_restrictions =&lt;br /&gt;
        permit_mynetworks,&lt;br /&gt;
        permit_sasl_authenticated,&lt;br /&gt;
        reject_invalid_helo_hostname,&lt;br /&gt;
        reject_non_fqdn_helo_hostname,&lt;br /&gt;
        # reject_unknown_helo_hostname&lt;br /&gt;
&lt;br /&gt;
# Règles de connexion des clients&lt;br /&gt;
# permit_mynetworks : Autorise les requêtes si l'IP du client correspond à l'un des réseaux spécifiés dans $mynetworks&lt;br /&gt;
# permit_inet_interfaces : Accepte les requêtes des clients entrants par les interfaces listés dans $inet_interfaces&lt;br /&gt;
# permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifié&lt;br /&gt;
# reject_rbl_client : Refuse les connexion des clients (IP) listés dans une liste RBL suite à des envois massifs de pourriels&lt;br /&gt;
# reject_plaintext_session : Refuser les connexions non chiffrés&lt;br /&gt;
# reject_unauth_pipelining : Vérifie si le drapeau de l'indicateur de session a été activé par Postfix. Si tel est le cas, cela signifierai que le client a utilisé une canalisation ESMTP incorrecte, ce qui est une justification suffisante pour le rejeter.&lt;br /&gt;
smtpd_client_restrictions =&lt;br /&gt;
        permit_mynetworks,&lt;br /&gt;
        permit_inet_interfaces,&lt;br /&gt;
        permit_sasl_authenticated,&lt;br /&gt;
        # reject_rbl_client zen.spamhaus.org&lt;br /&gt;
        # reject_plaintext_session,&lt;br /&gt;
        # reject_unauth_pipelining # L'utilisation de reject_unauth_pipelining dans les autres contextes que smtpd_data_restrictions n'est pas recommandé&lt;br /&gt;
&lt;br /&gt;
# Règles sur les expéditeurs&lt;br /&gt;
# reject_non_fqdn_sender : Refuser les expéditeurs invalides (non FQDN)&lt;br /&gt;
# reject_unknown_sender_domain : Refuser les expéditeurs qui n'ont pas de champ DNS A ou MX dans leurs DNS &lt;br /&gt;
# check_sender_access : Vérifie si l'adresse de courriel de l'expéditeur est dans notre fichier liste noire et applique la directive de celle-ci&lt;br /&gt;
smtpd_sender_restrictions =&lt;br /&gt;
        reject_non_fqdn_sender,&lt;br /&gt;
        reject_unknown_sender_domain,&lt;br /&gt;
        check_sender_access sqlite:/etc/postfix/sqlite-liste-noire-expediteurs.cf&lt;br /&gt;
&lt;br /&gt;
# Restrictions d'accès optionnelles appliquées dans le contexte d'une commande SMTP DATA&lt;br /&gt;
# reject_unauth_pipelining : Expliqué plus haut (trop long)&lt;br /&gt;
# permit : Tout est autorisé par défaut&lt;br /&gt;
smtpd_data_restrictions =&lt;br /&gt;
        reject_unauth_pipelining,&lt;br /&gt;
        permit&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------ Gestion des boites aux lettres et des messages ------------------------------------ #&lt;br /&gt;
&lt;br /&gt;
# Taille des boîtes aux lettres (0 = illimité)&lt;br /&gt;
mailbox_size_limit      = 0 &lt;br /&gt;
&lt;br /&gt;
# Fixer la taille limite des messages (ici 30Mo)&lt;br /&gt;
message_size_limit      = 31457280&lt;br /&gt;
&lt;br /&gt;
# Répertoire de destination des courriers&lt;br /&gt;
# home_mailbox            = Maildir/&lt;br /&gt;
virtual_mailbox_domains = sqlite:/etc/postfix/sqlite-domaines.cf&lt;br /&gt;
virtual_mailbox_base    = /var/mail/utilisateurs&lt;br /&gt;
virtual_mailbox_maps    = sqlite:/etc/postfix/sqlite-utilisateurs.cf&lt;br /&gt;
virtual_minimum_uid     = 3000&lt;br /&gt;
virtual_uid_maps        = static:3000&lt;br /&gt;
virtual_gid_maps        = static:3000&lt;br /&gt;
virtual_transport       = lmtp:unix:private/dovecot-lmtp&lt;br /&gt;
&lt;br /&gt;
#----------------------------------------------&lt;br /&gt;
# Gestion des alias de comptes et de domaines |&lt;br /&gt;
#----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# Emplacement du fichier des alias&lt;br /&gt;
# Alias de comptes principaux&lt;br /&gt;
alias_maps              = sqlite:/etc/postfix/sqlite-alias.cf&lt;br /&gt;
&lt;br /&gt;
# Alias de domaines&lt;br /&gt;
virtual_alias_maps      = sqlite:/etc/postfix/sqlite-alias-vituels.cf&lt;br /&gt;
# virtual_alias_domains = sqlite:/etc/postfix/sqlite-domaines.cf&lt;br /&gt;
&lt;br /&gt;
#--------------------&lt;br /&gt;
# SASL serveur SMTP |&lt;br /&gt;
#--------------------&lt;br /&gt;
&lt;br /&gt;
# Authentification SMTP (utilise les identifiants IMAP via SASL en passant par Dovecot)&lt;br /&gt;
smtpd_sasl_auth_enable  = yes&lt;br /&gt;
smtpd_sasl_type         = dovecot&lt;br /&gt;
smtpd_sasl_path         = private/auth&lt;br /&gt;
# Interdit les méthodes qui autorisent l'authentification anonyme&lt;br /&gt;
smtpd_sasl_security_options     = noanonymous&lt;br /&gt;
smtpd_sasl_tls_security_options = $smtpd_sasl_security_options&lt;br /&gt;
smtpd_sasl_local_domain         = $mydomain&lt;br /&gt;
# Reporte le nom d'utilisateur SASL authentifié dans l'en-tête de message &amp;quot;Received&amp;quot; du serveur&lt;br /&gt;
smtpd_sasl_authenticated_header = yes&lt;br /&gt;
# N'accepte pas le support de l'ancienne commande AUTH (Outlook 4 par exemple)&lt;br /&gt;
broken_sasl_auth_clients        = no&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------ Chiffrement ------------------------------------ #&lt;br /&gt;
&lt;br /&gt;
# clés et certificats pour les sessions TLS&lt;br /&gt;
smtpd_tls_cert_file             = $config_directory/tls/courriel.pem&lt;br /&gt;
smtpd_tls_key_file              = $config_directory/tls/courriel.key&lt;br /&gt;
smtpd_tls_dh1024_param_file     = $config_directory/tls/dh4096.pem&lt;br /&gt;
&lt;br /&gt;
#------------------&lt;br /&gt;
# TLS client SMTP |&lt;br /&gt;
#------------------&lt;br /&gt;
&lt;br /&gt;
# Verbosité des journaux&lt;br /&gt;
smtp_tls_loglevel               = 1&lt;br /&gt;
# Impose de se connecter à des serveurs SMTP via TLS&lt;br /&gt;
smtp_tls_security_level         = encrypt&lt;br /&gt;
# N'autoriser que le TLS version 1.2 et 1.3&lt;br /&gt;
smtp_tls_protocols              = TLSv1.2:TLSv1.3&lt;br /&gt;
# incompréhension exprimé plus haut&lt;br /&gt;
smtp_tls_mandatory_protocols    = TLSv1.2:TLSv1.3&lt;br /&gt;
# Journaliser les pairs ne gérants que STARTTLS au lieu de TLS. Probablement pour permettre de réaliser des statistiques&lt;br /&gt;
smtp_tls_note_starttls_offer    = yes&lt;br /&gt;
# N'autoriser que les chiffrements de la liste &amp;quot;medium&amp;quot; définie plus bas&lt;br /&gt;
smtp_tls_mandatory_ciphers      = medium&lt;br /&gt;
# Exclure les algorithmes cryptographiques obsolètes ou insuffisants listés ci-dessous&lt;br /&gt;
smtp_tls_exclude_ciphers        = aNULL, eNULL, EXPORT, DES, 3DES, RC2, RC4, MD5, PSK, SRP, DSS, AECDH, ADH&lt;br /&gt;
# Permet d'obliger le client à se conformer à la suite cryptographique du serveur et non l'inverse&lt;br /&gt;
tls_preempt_cipherlist          = yes&lt;br /&gt;
# Cache TLS. Permet de mémoriser les anciennes sessions TLS afin d'effectuer une poignée de mains raccourcie. Ce qui améliore considérablement les performances&lt;br /&gt;
# Inutile avec TLS 1.3 car compris dans la norme&lt;br /&gt;
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache&lt;br /&gt;
&lt;br /&gt;
#-------------------&lt;br /&gt;
# TLS serveur SMTP |&lt;br /&gt;
#-------------------&lt;br /&gt;
&lt;br /&gt;
# Verbosité des journaux&lt;br /&gt;
smtpd_tls_loglevel              = 1 &lt;br /&gt;
# Impose de se connecter à des serveurs SMTP via TLS&lt;br /&gt;
smtpd_tls_security_level        = encrypt&lt;br /&gt;
# Refuse les authentifications SASL en clair si le serveur gère TLS de façon optionnelle (ça n'a aucun sens mais c'est ce qui est écrit dans la documentation officielle)&lt;br /&gt;
smtpd_tls_auth_only             = yes&lt;br /&gt;
# Indique le chiffrement utilisé dans l'en-tête du message (ça ne sert pas à grand chose si on passe par plusieurs serveurs car les intermédiaires peuvent y mettre leur sauce donc ce n'est qu'indicatif)&lt;br /&gt;
smtpd_tls_received_header       = yes&lt;br /&gt;
# Source du générateur de nombre aléatoire pour les algorithmes de chiffrement&lt;br /&gt;
tls_random_source               = dev:/dev/urandom&lt;br /&gt;
# Versions de TLS autorisés (SSL refusé)&lt;br /&gt;
smtpd_tls_protocols             = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, TLSv1.2, TLSv1.3&lt;br /&gt;
# Toujours aucune idée de l'utilité mais c'est activé par défaut de toute façon d'après la documentation&lt;br /&gt;
smtpd_tls_mandatory_protocols   = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, TLSv1.2, TLSv1.3&lt;br /&gt;
# N'autoriser que les chiffrements de la liste &amp;quot;medium&amp;quot; définie plus bas&lt;br /&gt;
smtpd_tls_mandatory_ciphers = medium&lt;br /&gt;
# Liste de chiffrements autorisés dans la liste &amp;quot;medium&amp;quot; exploité par &amp;quot;smtp_tls_mandatory_ciphers&amp;quot; et &amp;quot;smtpd_tls_mandatory_ciphers&amp;quot;&lt;br /&gt;
tls_medium_cipherlist = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384&lt;br /&gt;
# Exclure les algorithmes obsolètes ou insufisants listés ci-dessous&lt;br /&gt;
smtpd_tls_exclude_ciphers        = aNULL, eNULL, EXPORT, DES, 3DES, RC2, RC4, MD5, PSK, SRP, DSS, AECDH, ADH&lt;br /&gt;
# Cache TLS. Permet de mémoriser les ancienne sessions TLS afin d'effectuer une poignée de mains raccourcie. Ce qui améliore considérablement les performances&lt;br /&gt;
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------ En-têtes des courriels ------------------------------------ #&lt;br /&gt;
&lt;br /&gt;
# Emplacement des fichiers de suppression de certains en-têtes à caractère privé contenus dans les messages envoyés&lt;br /&gt;
# Concrètement, cela supprime toute la section &amp;quot;Received: from&amp;quot; propre au client (contenant son IP par exemple) -&amp;gt; son SMTP. Seul le &amp;quot;Received: from&amp;quot; son SMTP -&amp;gt; SMTP distant reste&lt;br /&gt;
mime_header_checks              = regexp:/etc/postfix/header_checks&lt;br /&gt;
header_checks                   = regexp:/etc/postfix/header_checks&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------ OpenDKIM et Spamassassin ------------------------------------ #&lt;br /&gt;
&lt;br /&gt;
# Procédez comme si le filtre de courrier n'était pas présent&lt;br /&gt;
milter_default_action = accept&lt;br /&gt;
# Version du protocole mail filter&lt;br /&gt;
milter_protocol = 6&lt;br /&gt;
&lt;br /&gt;
# Chemins des sockets pour la communication avec les modules opendkim et spamass&lt;br /&gt;
smtpd_milters = unix:/var/run/opendkim/opendkim.sock unix:/spamass/spamass.sock&lt;br /&gt;
non_smtpd_milters = unix:/var/run/opendkim/opendkim.sock unix:/spamass/spamass.sock&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------ Sources de documentation ------------------------------------ #&lt;br /&gt;
&lt;br /&gt;
# http://postfix.traduc.org/index.php/postconf.5.html&lt;br /&gt;
# http://www.postfix.org/postconf.5.html&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
N'oubliez pas d'adapter les réseaux autorisés de la section &amp;lt;code&amp;gt;mynetworks&amp;lt;/code&amp;gt; ainsi que le nom de domaine à votre installation. Vous pouvez utiliser la commande &amp;lt;code&amp;gt;sed&amp;lt;/code&amp;gt; comme suit pour vous aider :&lt;br /&gt;
 sed -i 's/exemple\.fr/domaine\.fr/g' /etc/postfix/main.cf&lt;br /&gt;
&lt;br /&gt;
Si vous voulez afficher pour comparaison la [https://www.mkssoftware.com/docs/man1/openssl_ciphers.1.asp suite cryptographique] ''MEDIUM'' d{{'}}''OpenSSL'' avec le paramètre &amp;lt;code&amp;gt;tls_medium_cipherlist&amp;lt;/code&amp;gt; définit dans le fichier, vous pouvez utiliser la commande suivante :&lt;br /&gt;
 openssl ciphers MEDIUM | sed 's/:/\n/g'&lt;br /&gt;
&lt;br /&gt;
===En-têtes vie privée===&lt;br /&gt;
On va créer une liste d'expressions régulières servant à supprimer automatiquement certains en-têtes contenant des informations personnelles sur le client émetteur lors de l'envoi du courriel (diminue la quantité d'informations personnelles transmises)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/postfix/header_checks&lt;br /&gt;
/^Received:.*with ESMTPSA/  IGNORE&lt;br /&gt;
/^X-Originating-IP:/        IGNORE&lt;br /&gt;
/^X-Mailer:/                IGNORE&lt;br /&gt;
/^User-Agent:/              IGNORE&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les directives contenues dans la section &amp;quot;En-têtes des courriels&amp;quot; du fichier [[#Main.cf|main.cf]] édité ci-dessus indiquent à ''Postfix'' l'emplacement de ces règles&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mime_header_checks              = regexp:/etc/postfix/header_checks&lt;br /&gt;
header_checks                   = regexp:/etc/postfix/header_checks&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour que Postfix les utilises, il faut reconstruire la table au format hachée avec la commande&lt;br /&gt;
 postmap /etc/postfix/header_checks&lt;br /&gt;
&lt;br /&gt;
===Master.cf===&lt;br /&gt;
''Postfix'' est un outil dont le fonctionnement sous jacent est complexe et composé de multiples programmes (démons) ayants chacun leur rôle. Le fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt; permet de gérer la façon dont se comportent les différents éléments du système de courrier.&lt;br /&gt;
&lt;br /&gt;
Le [http://www.postfix.org/master.5.html fichier] se présente sous forme de tableau. ''Postfix'' va le parcourir et interpréter chaque lignes, correspondants à un démon, colonne par colonne (avec leur signification en en-tête commenté). Voici le contenu du fichier par défaut, épuré de ses commentaires pour ne pas alourdir l'exposé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
smtp      inet  n       -       y       -       -       smtpd&lt;br /&gt;
pickup    unix  n       -       y       60      1       pickup&lt;br /&gt;
cleanup   unix  n       -       y       -       0       cleanup&lt;br /&gt;
qmgr      unix  n       -       n       300     1       qmgr&lt;br /&gt;
tlsmgr    unix  -       -       y       1000?   1       tlsmgr&lt;br /&gt;
rewrite   unix  -       -       y       -       -       trivial-rewrite&lt;br /&gt;
bounce    unix  -       -       y       -       0       bounce&lt;br /&gt;
defer     unix  -       -       y       -       0       bounce&lt;br /&gt;
trace     unix  -       -       y       -       0       bounce&lt;br /&gt;
verify    unix  -       -       y       -       1       verify&lt;br /&gt;
flush     unix  n       -       y       1000?   0       flush&lt;br /&gt;
proxymap  unix  -       -       n       -       -       proxymap&lt;br /&gt;
proxywrite unix -       -       n       -       1       proxymap&lt;br /&gt;
smtp      unix  -       -       y       -       -       smtp&lt;br /&gt;
relay     unix  -       -       y       -       -       smtp&lt;br /&gt;
        -o syslog_name=postfix/$service_name&lt;br /&gt;
showq     unix  n       -       y       -       -       showq&lt;br /&gt;
error     unix  -       -       y       -       -       error&lt;br /&gt;
retry     unix  -       -       y       -       -       error&lt;br /&gt;
discard   unix  -       -       y       -       -       discard&lt;br /&gt;
local     unix  -       n       n       -       -       local&lt;br /&gt;
virtual   unix  -       n       n       -       -       virtual&lt;br /&gt;
lmtp      unix  -       -       y       -       -       lmtp&lt;br /&gt;
anvil     unix  -       -       y       -       1       anvil&lt;br /&gt;
scache    unix  -       -       y       -       1       scache&lt;br /&gt;
postlog   unix-dgram n  -       n       -       1       postlogd&lt;br /&gt;
maildrop  unix  -       n       n       -       -       pipe&lt;br /&gt;
  flags=DRXhu user=vmail argv=/usr/bin/maildrop -d ${recipient}&lt;br /&gt;
uucp      unix  -       n       n       -       -       pipe&lt;br /&gt;
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)&lt;br /&gt;
ifmail    unix  -       n       n       -       -       pipe&lt;br /&gt;
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)&lt;br /&gt;
bsmtp     unix  -       n       n       -       -       pipe&lt;br /&gt;
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient&lt;br /&gt;
scalemail-backend unix -       n       n       -       2       pipe&lt;br /&gt;
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}&lt;br /&gt;
mailman   unix  -       n       n       -       -       pipe&lt;br /&gt;
  flags=FRX user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'opération consiste à ajouter un socket ''TCP'' pour les communications ''STARTTLS'' et ''SMTPS'' ainsi qu'un socket ''UNIX'' pour la communication avec [[#Dovecot|Dovecot]]. Le chemin de l'exécutable de ce dernier sera lui aussi précisé en sous-section. Nous ajouterons donc en fin de fichier les trois sections suivantes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt;&amp;gt; /etc/postfix/master.cf&lt;br /&gt;
&lt;br /&gt;
submission inet n       -       y       -       -       smtpd&lt;br /&gt;
smtps     inet  n       -       y       -       -       smtpd&lt;br /&gt;
  -o syslog_name=postfix/smtps&lt;br /&gt;
  -o smtpd_tls_wrappermode=yes&lt;br /&gt;
  -o smtpd_sasl_auth_enable=yes&lt;br /&gt;
  -o smtpd_client_restrictions=permit_mynetworks,permit_sasl_authenticated,reject&lt;br /&gt;
  -o milter_macro_daemon_name=ORIGINATING&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est possible de spécifier des paramètres au différentes lignes via l'argument &amp;lt;code&amp;gt;-o&amp;lt;/code&amp;gt; (répétable plusieurs fois). Placés ici, ils réécrivent les paramètres correspondants du fichier [[#Main.cf|main.cf]] et leur sont donc prioritaires. Ces arguments pourraient toutefois être placés dans ce dernier (cela reviendrait au même).&lt;br /&gt;
&lt;br /&gt;
==SQLite==&lt;br /&gt;
Comme vous l'avez probablement constaté, certaines fonctionnalités utiliserons une base de données [https://fr.wikipedia.org/wiki/SQLite SQLite] (il est également possible de passer par d'autres [http://www.postfix.org/DATABASE_README.html méthode]). Cette technologie a le mérite d'être légère et de permettre la connexion d'outils tiers pour l'édition des données contenues dans la base. Avec la méthode des tables hachées utilisée auparavant, un accès ''root'' combiné à des bidouilles pas très sécurisées étaient nécessaires afin de les éditer sans devoir se connecter manuellement au serveur.&lt;br /&gt;
&lt;br /&gt;
Cette section traite de la création de la base ainsi que des fichiers d'exploitation pour ''Postfix''.&lt;br /&gt;
&lt;br /&gt;
===Installation et création de la base===&lt;br /&gt;
&lt;br /&gt;
Installation de ''SQLite''&lt;br /&gt;
 apt install --no-install-recommends sqlite3 postfix-sqlite&lt;br /&gt;
&lt;br /&gt;
Création du schéma de la base&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/postfix/postfix.sql&lt;br /&gt;
CREATE TABLE IF NOT EXISTS postfix_alias (&lt;br /&gt;
       id INTEGER PRIMARY KEY AUTOINCREMENT,&lt;br /&gt;
       alias TEXT NOT NULL UNIQUE,&lt;br /&gt;
       destination TEXT NOT NULL,&lt;br /&gt;
       active INTEGER&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE IF NOT EXISTS postfix_alias_virtuels (&lt;br /&gt;
       id INTEGER PRIMARY KEY AUTOINCREMENT,&lt;br /&gt;
       courriel TEXT NOT NULL UNIQUE,&lt;br /&gt;
       destination TEXT NOT NULL,&lt;br /&gt;
       active INTEGER&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE IF NOT EXISTS postfix_domaines (&lt;br /&gt;
       id INTEGER PRIMARY KEY AUTOINCREMENT,&lt;br /&gt;
       domaine TEXT NOT NULL UNIQUE,&lt;br /&gt;
       defaut BOOLEAN NOT NULL CHECK (defaut IN (0, 1)),&lt;br /&gt;
       active INTEGER&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE IF NOT EXISTS postfix_liste_noire_destinataires (&lt;br /&gt;
       id INTEGER PRIMARY KEY AUTOINCREMENT,&lt;br /&gt;
       courriel TEXT NOT NULL UNIQUE,&lt;br /&gt;
       action TEXT NOT NULL,&lt;br /&gt;
       active INTEGER&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE IF NOT EXISTS postfix_liste_noire_expediteurs (&lt;br /&gt;
       id INTEGER PRIMARY KEY AUTOINCREMENT,&lt;br /&gt;
       courriel TEXT NOT NULL UNIQUE,&lt;br /&gt;
       code_retour INTEGER NOT NULL,&lt;br /&gt;
       message TEXT NOT NULL,&lt;br /&gt;
       active INTEGER&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE postfix_utilisateurs (&lt;br /&gt;
       id INTEGER PRIMARY KEY AUTOINCREMENT,&lt;br /&gt;
       utilisateur TEXT NOT NULL UNIQUE,&lt;br /&gt;
       mot_de_passe TEXT NOT NULL,&lt;br /&gt;
       nom_complet TEXT,&lt;br /&gt;
       rep_perso TEXT NOT NULL,&lt;br /&gt;
       uid INTEGER NOT NULL,&lt;br /&gt;
       gid INTEGER NOT NULL,&lt;br /&gt;
       privilege TEXT NOT NULL,&lt;br /&gt;
       prefixe TEXT,&lt;br /&gt;
       active INTEGER&lt;br /&gt;
);&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Création de la base avec ce schéma&lt;br /&gt;
 mkdir /etc/postfix/bdd/&lt;br /&gt;
 # Pour un usage avec le portail WEB Courtail (voir plus bas), il faudra donner les permission de ce répertoire et de la base à www-data&lt;br /&gt;
 sqlite3 /etc/postfix/bdd/postfix.sqlite &amp;lt; /etc/postfix/postfix.sql&lt;br /&gt;
&lt;br /&gt;
===Création des fichiers d'exploitation de Postfix===&lt;br /&gt;
Ces [http://www.postfix.org/SQLITE_README.html fichiers] permettent à ''Postfix'' d'avoir les éléments lui permettant d'exploiter la base. Nous y retrouverons donc naturellement l'emplacement de celle-ci ainsi que la [http://www.postfix.org/sqlite_table.5.html requête] à lui soumettre afin d'obtenir l'information voulue.&lt;br /&gt;
&lt;br /&gt;
Liaison à la table des alias&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/postfix/sqlite-alias.cf&lt;br /&gt;
# Chemin de la base SQLite&lt;br /&gt;
dbpath = /etc/postfix/bdd/postfix.sqlite&lt;br /&gt;
# Requête passée à SQLite&lt;br /&gt;
query = SELECT destination FROM postfix_alias WHERE alias='%s' AND active='1'&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Liason à la tables alias virtuels&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/postfix/sqlite-alias-vituels.cf&lt;br /&gt;
# Chemin de la base SQLite&lt;br /&gt;
dbpath = /etc/postfix/bdd/postfix.sqlite&lt;br /&gt;
# Requête passée à SQLite&lt;br /&gt;
query = SELECT destination FROM postfix_alias_virtuels WHERE courriel='%s' AND active='1'&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les alias peuvent êtres utiles lors d'inscriptions sur des sites tiers ou d'une communication à des personnes de moyenne confiance. Le principe étant que les courriels envoyés sur ces adresses (connues uniquement des entités pour lesquelles elles ont étés créées) sont redirigés en interne vers votre vraie boite liée à l'alias. L'adresse de l'émetteur peut donc, par la stratégie que vous mettrez en place dans la diffusion de vos alias, être liée à une adresse de votre base et donc identifier une source d'émission. L'intérêt est double : lors de la réception de pourriels sur celui-ci, nous savons quelle entité l'a transmis ou utilisé puisqu'il est unique à chaque interlocuteur. Une action de désactivation de l'alias suivie d'un boycott et d'une possible plainte à la [https://www.cnil.fr/fr/plaintes CNIL] pour manquement au ''RGPD'' peut ainsi être entreprise.&lt;br /&gt;
&lt;br /&gt;
Si cette fonctionnalité est utilisé sérieusement, le risque de pourriels (''SPAM'') est quasiment nul. Couplé aux règles ''Sieve'' abordées plus loin dans la documentation, les alias vont être très utiles afin de classer les courriels reçus automatiquement dans des dossiers et ne pas se retrouver avec les éternelles boite de réception à plus de 2000 messages &amp;quot;non lus&amp;quot;. En clair, vous ne subirez plus votre messagerie comme c'est, hélas, bien trop souvent le cas.&lt;br /&gt;
&lt;br /&gt;
{{info|La différence entre les alias et les alias virtuelles réside dans l'en-tête ''Delivered-To'' du message à la réception par ''Postfix''. Avec les alias, l'en-tête est inchangé lors de la distribution du message à la boite locale (et correspond donc à l'en-tête ''to'' du même message). Avec les alias virtuels, l'en-tête est modifié par l'adresse réelle de destination (inconnue de l'expéditeur). Dans les deux cas, cela n'influence pas l'acheminement du courrier mais les alias virtuelles permettent la distribution sur des domaines secondaires quand les alias se restreignent au seul domaine par défaut. Vous pouvez utiliser l'un et l'autre ou seulement l'un des deux (cela ne change rien aux bénéfices apportés à la fonctionnalité).}}&lt;br /&gt;
&lt;br /&gt;
Le champ ''destination'' '''doit être''' l'adresse réelle de l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
Liaison à la table des domaines&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/postfix/sqlite-domaines.cf&lt;br /&gt;
# Chemin de la base SQLite&lt;br /&gt;
dbpath = /etc/postfix/bdd/postfix.sqlite&lt;br /&gt;
# Requête passée à SQLite&lt;br /&gt;
query = SELECT domaine FROM postfix_domaines WHERE domaine='%s' AND active='1'&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Liaison à la table de la liste noire des destinataires&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/postfix/sqlite-liste-noire-destinataires.cf&lt;br /&gt;
# Chemin de la base SQLite&lt;br /&gt;
dbpath = /etc/postfix/bdd/postfix.sqlite&lt;br /&gt;
# Requête passée à SQLite&lt;br /&gt;
query = SELECT action FROM postfix_liste_noire_destinataires WHERE courriel='%s' AND active='1'&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Liaison à la table de la liste noire des expéditeurs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/postfix/sqlite-liste-noire-expediteurs.cf&lt;br /&gt;
# Chemin de la base SQLite&lt;br /&gt;
dbpath = /etc/postfix/bdd/postfix.sqlite&lt;br /&gt;
# Requête passée a SQLite&lt;br /&gt;
query = SELECT code_retour || ' ' || message FROM postfix_liste_noire_expediteurs WHERE courriel='%s' AND active='1'&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Liaison à la table des utilisateurs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/postfix/sqlite-utilisateurs.cf&lt;br /&gt;
# Chemin de la base SQLite&lt;br /&gt;
dbpath = /etc/postfix/bdd/postfix.sqlite&lt;br /&gt;
# Requête passée à SQLite&lt;br /&gt;
query = SELECT rep_perso FROM postfix_utilisateurs WHERE utilisateur='%s' AND active='1'&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Administration de la base===&lt;br /&gt;
Afin d'ajouter, modifier, supprimer et lister des informations dans la base ''SQLite'', le ''shell'' intégré à l'outil est une bonne première approche. Par la suite, un logiciel plus graphique (comme une application ''WEB'' par exemple), pourra remplir le rôle d'interface d'administration.&lt;br /&gt;
&lt;br /&gt;
Le ''shell'' de &amp;lt;code&amp;gt;sqlite3&amp;lt;/code&amp;gt; se contrôle via la commande suivante :&lt;br /&gt;
 sqlite3 /etc/postfix/bdd/postfix.sqlite&lt;br /&gt;
&lt;br /&gt;
Les commandes suivantes permettent une utilisation basique de l'outil :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Commande !! Signification&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.table&amp;lt;/code&amp;gt; || Liste les tables de la base&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.shema &amp;lt;span&amp;gt;&amp;lt;&amp;lt;/span&amp;gt;table&amp;lt;span&amp;gt;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt; || Affiche la structure de la table (en-têtes et propriétés)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.mode column&amp;lt;/code&amp;gt; || Affiche le retour d'une requête sous forme de tableau&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.headers on&amp;lt;/code&amp;gt; || Affiche les entêtes (clés) des valeurs retournés&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.quit&amp;lt;/code&amp;gt; || Quitte l'outil&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Gestion des alias :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Action !! Commande&lt;br /&gt;
|-&lt;br /&gt;
| Ajout || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;INSERT INTO postfix_alias (alias,destination,active) VALUES (&amp;quot;toto&amp;quot;,&amp;quot;test&amp;quot;,1);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Désactivation || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;UPDATE postfix_alias SET active = 0 WHERE alias = &amp;quot;toto&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Activation || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;UPDATE postfix_alias SET active = 1 WHERE alias = &amp;quot;toto&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Suppression || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;DELETE FROM postfix_alias WHERE alias = &amp;quot;toto&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Listage || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;SELECT * FROM postfix_alias;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Gestion des alias virtuels :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Action !! Commande&lt;br /&gt;
|-&lt;br /&gt;
| Ajout || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;INSERT INTO postfix_alias_virtuels (courriel,destination,active) VALUES (&amp;quot;ycharbi@exemple.fr&amp;quot;,&amp;quot;test@exemple.fr&amp;quot;,1);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Désactivation || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;UPDATE postfix_alias_virtuels SET active = 0 WHERE courriel = &amp;quot;ycharbi@exemple.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Activation || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;UPDATE postfix_alias_virtuels SET active = 1 WHERE courriel = &amp;quot;ycharbi@exemple.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Suppression || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;DELETE FROM postfix_alias_virtuels WHERE courriel = &amp;quot;ycharbi@exemple.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Listage || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;SELECT * FROM postfix_alias_virtuels;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Gestion des domaines :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Action !! Commande&lt;br /&gt;
|-&lt;br /&gt;
| Ajout || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;INSERT INTO postfix_domaines (domaine,defaut,active) VALUES (&amp;quot;toto.fr&amp;quot;,1,1);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Désactivation || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;UPDATE postfix_domaines SET active = 0 WHERE domaine = &amp;quot;toto.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Activation || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;UPDATE postfix_domaines SET active = 1 WHERE domaine = &amp;quot;toto.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Suppression || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;DELETE FROM postfix_domaines WHERE domaine = &amp;quot;toto.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Listage || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;SELECT * FROM postfix_domaines;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{attention|N'oubliez pas d'ajouter votre domaine à la base (un problème de correspondance de domaine peut entrainer l'erreur ''Relai access denied''). De plus, ne positionnez le drapeau ''defaut'' à ''1'' (pour le mettre en domaine par défaut) que sur un seul domaine. Cette notion n'est utile que pour un usage avec le portail ''WEB'' [https://gitea.ycharbi.fr/YC-NM/Courtail Courtail].}}&lt;br /&gt;
&lt;br /&gt;
Gestion de la liste noire des [http://www.postfix.org/access.5.html destinataires] :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Action !! Commande&lt;br /&gt;
|-&lt;br /&gt;
| Ajout || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;INSERT INTO postfix_liste_noire_destinataires (courriel,action,active) VALUES (&amp;quot;root@mail.exemple.fr&amp;quot;,&amp;quot;REJECT&amp;quot;,1);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Désactivation || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;UPDATE postfix_liste_noire_destinataires SET active = 0 WHERE courriel = &amp;quot;root@mail.exemple.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Activation || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;UPDATE postfix_liste_noire_destinataires SET active = 1 WHERE courriel = &amp;quot;root@mail.exemple.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Suppression || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;DELETE FROM postfix_liste_noire_destinataires WHERE courriel = &amp;quot;root@mail.exemple.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Listage || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;SELECT * FROM postfix_liste_noire_destinataires;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Gestion de la liste noire des expéditeurs :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Action !! Commande&lt;br /&gt;
|-&lt;br /&gt;
| Ajout || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;INSERT INTO postfix_liste_noire_expediteurs (courriel,code_retour,message,active) VALUES (&amp;quot;tata@tata.fr&amp;quot;,554,&amp;quot;Parle à ma main, ma tête est malade.&amp;quot;,1);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Désactivation || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;UPDATE postfix_liste_noire_expediteurs SET active = 0 WHERE courriel = &amp;quot;tata@tata.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Activation || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;UPDATE postfix_liste_noire_expediteurs SET active = 1 WHERE courriel = &amp;quot;tata@tata.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Suppression || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;DELETE FROM postfix_liste_noire_expediteurs WHERE courriel = &amp;quot;tata@tata.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Listage || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;SELECT * FROM postfix_liste_noire_expediteurs;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Gestion des utilisateurs :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Action !! Commande&lt;br /&gt;
|-&lt;br /&gt;
| Ajout || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;INSERT INTO postfix_utilisateurs (utilisateur,mot_de_passe,nom_complet,rep_perso,uid,gid,privilege,prefixe,active) VALUES (&amp;quot;test@exemple.fr&amp;quot;,&amp;quot;{SHA512-CRYPT}$6$xWfisyC6fLawFcBr$zLm4hfRfs6Pn0RKArnyWcgliBy6lpnRUkDHfHMkvskShfLiv4pRIU6XC5ry0ysd.DeKhoAiZUfnNdmwIai2k50&amp;quot;,&amp;quot;Test &lt;br /&gt;
Dupont&amp;quot;,&amp;quot;exemple.fr/test/&amp;quot;,3000,3000,&amp;quot;administrateur&amp;quot;,&amp;quot;&amp;quot;,1);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Désactivation || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;UPDATE postfix_utilisateurs SET active = 0 WHERE utilisateur = &amp;quot;test@exemple.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Activation || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;UPDATE postfix_utilisateurs SET active = 1 WHERE utilisateur = &amp;quot;test@exemple.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Suppression || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;DELETE FROM postfix_utilisateurs WHERE utilisateur = &amp;quot;test@exemple.fr&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Listage || &amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; inline&amp;gt;SELECT * FROM postfix_utilisateurs;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Info|Le mot de passe est généré avec ''Dovecot'' dans la section suivante.}}&lt;br /&gt;
&lt;br /&gt;
=Dovecot=&lt;br /&gt;
''Dovecot'' est un service gérant les protocoles ''IMAP'' et ''POP''. Il endosse donc le rôle d'intermédiaire entre les utilisateurs et le serveur de messagerie.&lt;br /&gt;
&lt;br /&gt;
==Installation de Dovecot==&lt;br /&gt;
''POP'' ayant été totalement abandonné (tant dans son développement que dans l'usage), seul ''IMAP'' sera supporté.&lt;br /&gt;
 apt install --no-install-recommends dovecot-common dovecot-imapd dovecot-sqlite dovecot-lmtpd&lt;br /&gt;
&lt;br /&gt;
==Création d'un utilisateur==&lt;br /&gt;
Comme précisé en introduction, nous exploitons des utilisateurs enregistrés dans la base ''SQLite''.&lt;br /&gt;
&lt;br /&gt;
Il faut tout d'abord générer un mot de passe à la l'aide de la commande suivante (du paquet &amp;lt;code&amp;gt;dovecot-core&amp;lt;/code&amp;gt;, véritable nom de dovecot-common (paquet virtuel) installé plus haut)&lt;br /&gt;
 doveadm pw -s SHA512-CRYPT -p toto1234567890°+&lt;br /&gt;
&lt;br /&gt;
Création de l'utilisateur dans la base&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sqlite3 /etc/postfix/bdd/postfix.sqlite 'INSERT INTO postfix_utilisateurs (utilisateur,mot_de_passe,nom_complet,rep_perso,uid,gid,privilege,prefixe,active) VALUES (&amp;quot;test@exemple.fr&amp;quot;,&amp;quot;{SHA512-CRYPT}$6$xWfisyC6fLawFcBr$zLm4hfRfs6Pn0RKArnyWcgliBy6lpnRUkDHfHMkvskShfLiv4pRIU6XC5ry0ysd.DeKhoAiZUfnNdmwIai2k50&amp;quot;,&amp;quot;Test &lt;br /&gt;
Dupont&amp;quot;,&amp;quot;exemple.fr/test/&amp;quot;,3000,3000,&amp;quot;administrateur&amp;quot;,&amp;quot;&amp;quot;,1)'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{info|Le fait que l'utilisateur comporte le nom de domaine dans son nom fait qu'il faut renseigner la chaine complète (''utilisateur@domaine'') dans les clients ''IMAP''. Le champ ''privilege'' permet de définir les fonctions autorisées dans notre interface ''WEB'' [https://gitea.ycharbi.fr/YC-NM/Courtail Courtail] développé par nos soins. Si vous ne l'utilisez pas, ceci n'a pas d'importance. Les valeurs gérés sont ''administrateur'' et ''utilisateur''.}}&lt;br /&gt;
&lt;br /&gt;
Créer le répertoire utilisateurs&lt;br /&gt;
 mkdir /var/mail/utilisateurs&lt;br /&gt;
 chown 3000:3000 /var/mail/utilisateurs&lt;br /&gt;
&lt;br /&gt;
{{astuce|Dans le cadre d'une migration de serveur (monté en version de ''Debian'' par exemple), nous recommandons d'effectuer une archive ''tar.gz'' du contenu de l'ancien ''MailDir'' et de l'extraire dans le nouveau répertoire utilisateur. Ce répertoire n'existera pas (''Dovecot'' est censé le créer à la première utilisation de son propriétaire), il faudra donc le créer avec un &amp;lt;code&amp;gt;mkdir -p /var/spool/mail/utilisateurs/exemple.fr/votre_utilisateur&amp;lt;/code&amp;gt; et lui donner les bons droits avec &amp;lt;code&amp;gt;chown -R 3000:3000 /var/spool/mail/utilisateurs/exemple.fr &amp;amp;&amp;amp; chmod -R 700 /var/spool/mail/utilisateurs/exemple.fr&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
==Configuration de Dovecot==&lt;br /&gt;
Ce service utilise un fichier de configuration par fonctionnalité (ce qui en fait pas mal).&lt;br /&gt;
&lt;br /&gt;
===Gestion d'IPv6===&lt;br /&gt;
Activation du support d'IPv6 (optionnel suivant votre configuration)&lt;br /&gt;
 echo -e '\nlisten = *, [::]' &amp;gt;&amp;gt; /etc/dovecot/dovecot.conf&lt;br /&gt;
&lt;br /&gt;
===Emplacement des dossiers utilisateurs===&lt;br /&gt;
Configuration de l'[https://doc.dovecot.org/configuration_manual/mail_location/ emplacement du répertoire] des boites aux lettres des utilisateurs&lt;br /&gt;
 sed -i 's@mail_location = mbox:~/mail:INBOX=/var/mail/%u@mail_location = maildir:/var/mail/utilisateurs/%d/%n@g' /etc/dovecot/conf.d/10-mail.conf&lt;br /&gt;
&lt;br /&gt;
===Emploi du chiffrement===&lt;br /&gt;
Configuration de la [https://doc.dovecot.org/configuration_manual/dovecot_ssl_configuration/ couche de chiffrement] (qui sera rendue obligatoire)&lt;br /&gt;
 mv /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.ori&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/dovecot/conf.d/10-ssl.conf&lt;br /&gt;
ssl = required&lt;br /&gt;
ssl_cert = &amp;lt;/etc/postfix/tls/courriel.pem&lt;br /&gt;
ssl_key = &amp;lt;/etc/postfix/tls/courriel.key&lt;br /&gt;
ssl_min_protocol = TLSv1.2&lt;br /&gt;
ssl_cipher_list = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305&lt;br /&gt;
ssl_prefer_server_ciphers = yes # Oblige l'utilisation de la suite du serveur au lieu du client (Dovecot &amp;gt; 2.2.x)&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
les valeurs sont précédées d'un chevron ouvert qui ne se ferme jamais (''&amp;lt;''). C'est louche mais normal (documentation [http://wiki2.dovecot.org/SSL/DovecotConfiguration officielle de Dovecot]). Il n'y a donc pas d'erreur dans les lignes mentionnées ci-dessus.&lt;br /&gt;
&lt;br /&gt;
{{info|Il est vivement recommandé de ne plus utiliser des algorithmes de cryptographie non ''ECC''. L'usage de ''Diffie-Hellman'' est de façon générale découragé de nos jours.}}&lt;br /&gt;
&lt;br /&gt;
===Configuration de l'authentification===&lt;br /&gt;
Désactiver l'authentification en clair ainsi que ''POSIX'' et l'activer par ''SQLite''&lt;br /&gt;
 sed -i -e 's@#disable_plaintext_auth.*@disable_plaintext_auth = yes@g' -e 's@!include auth-system.conf.ext@#!include auth-system.conf.ext@g' -e 's@#!include auth-sql.conf.ext@!include auth-sql.conf.ext@g' /etc/dovecot/conf.d/10-auth.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt;&amp;gt; /etc/dovecot/dovecot-sql.conf.ext&lt;br /&gt;
driver = sqlite&lt;br /&gt;
connect = /etc/postfix/bdd/postfix.sqlite&lt;br /&gt;
&lt;br /&gt;
password_query = SELECT utilisateur AS user, mot_de_passe AS password, '/var/mail/utilisateurs/%d/%n' AS userdb_home, 'maildir:/var/mail/utilisateurs/%d/%n' AS userdb_mail, 3000 AS userdb_uid, 3000 AS userdb_gid FROM postfix_utilisateurs WHERE utilisateur = '%u' AND active = 1&lt;br /&gt;
user_query = SELECT '/var/mail/utilisateurs/%d/%n' AS home, 'maildir:/var/mail/utilisateurs/%d/%n' AS mail, 3000 AS uid, 3000 AS gid FROM postfix_utilisateurs WHERE utilisateur = '%u' AND active = 1 &lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configuration de l'authentification&lt;br /&gt;
 mv /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.ori&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/dovecot/conf.d/10-master.conf&lt;br /&gt;
service auth {                                                                       &lt;br /&gt;
  unix_listener /var/spool/postfix/private/auth {&lt;br /&gt;
    mode = 0660&lt;br /&gt;
    user = postfix&lt;br /&gt;
    group = postfix&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unix_listener auth-userdb {&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
service lmtp {&lt;br /&gt;
 unix_listener /var/spool/postfix/private/dovecot-lmtp {&lt;br /&gt;
    group = postfix&lt;br /&gt;
    mode = 0600&lt;br /&gt;
    user = postfix&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bien que le contenu proposé ne ressemble en rien à ce qui est préremplis dans celui-ci, il s'agit bien de la configuration décrite dans la [https://doc.dovecot.org/configuration_manual/howto/postfix_and_dovecot_sasl/?highlight=master documentation officielle].&lt;br /&gt;
&lt;br /&gt;
===Auto-création des répertoires utilisateurs===&lt;br /&gt;
''Dovecot'' peut créer automatiquement les répertoires présents dans une boite au lettres (''/var/mail/utilisateurs/%d/%n@g'') à la connexion des utilisateurs. Ceci leur permet d'avoir un environnement pré-configuré comportant un dossier &amp;quot;envoyé&amp;quot;, &amp;quot;brouillons&amp;quot;, &amp;quot;Indésirables&amp;quot; et &amp;quot;corbeille&amp;quot; (&amp;quot;réception&amp;quot; est créé par Postfix).&lt;br /&gt;
 mv /etc/dovecot/conf.d/15-mailboxes.conf /etc/dovecot/conf.d/15-mailboxes.conf.ori&lt;br /&gt;
&lt;br /&gt;
Il faut que les sections correspondantes aux répertoires soient présentes et que l'argument &amp;quot;auto = create&amp;quot; (création du dossier dans l'arborescence) ou &amp;quot;auto = suscribe&amp;quot; (création du dossier et inscription automatique dans le client) soient spécifiées.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/dovecot/conf.d/15-mailboxes.conf&lt;br /&gt;
namespace inbox {&lt;br /&gt;
  mailbox Sent {&lt;br /&gt;
    auto = subscribe&lt;br /&gt;
    special_use = \Sent&lt;br /&gt;
  }&lt;br /&gt;
  mailbox Drafts {&lt;br /&gt;
    auto = subscribe&lt;br /&gt;
    special_use = \Drafts&lt;br /&gt;
  }&lt;br /&gt;
  mailbox Trash {&lt;br /&gt;
    auto = subscribe&lt;br /&gt;
    special_use = \Trash&lt;br /&gt;
  }&lt;br /&gt;
  mailbox Spam {&lt;br /&gt;
    auto = subscribe&lt;br /&gt;
    special_use = \Junk&lt;br /&gt;
  }&lt;br /&gt;
  mailbox Archive {&lt;br /&gt;
    auto = subscribe&lt;br /&gt;
    special_use = \Archive&lt;br /&gt;
  }&lt;br /&gt;
  mailbox Notes {&lt;br /&gt;
    auto = create&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sieve==&lt;br /&gt;
===Installation de ManageSieve===&lt;br /&gt;
''Sieve'' est un système de filtrage du courrier coté serveur permettant l'application d'actions suivant des règles prés-établies. Sa mise en œuvre passe par le service [https://wiki1.dovecot.org/ManageSieve ManageSieve] agissant comme une extension de ''Dovecot''. Les scripts sont créables à la fois sur le serveur et sur les clients (ce sont de simples instructions dans un fichier texte synchronisés par ''IMAP'').&lt;br /&gt;
 apt install --no-install-recommends dovecot-sieve dovecot-managesieved&lt;br /&gt;
&lt;br /&gt;
Ces deux paquets vont créer les 3 fichiers &amp;lt;code&amp;gt;90-sieve.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;90-sieve-extprograms.conf&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;20-managesieve.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Configuration de ManageSieve===&lt;br /&gt;
Édition du fichier &amp;lt;code&amp;gt;20-lmtp.conf&amp;lt;/code&amp;gt; pour dire à ''Dovecot'' d'[https://wiki2.dovecot.org/HowTo/PostfixDovecotLMTP utiliser] le greffon ''Sieve'' via [https://doc.dovecot.org/configuration_manual/protocols/lmtp_server/ LMTP]&lt;br /&gt;
 mv /etc/dovecot/conf.d/20-lmtp.conf /etc/dovecot/conf.d/20-lmtp.conf.ori&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/dovecot/conf.d/20-lmtp.conf&lt;br /&gt;
protocol lmtp {&lt;br /&gt;
    postmaster_address = postmaster@exemple.fr&lt;br /&gt;
    mail_plugins = quota sieve&lt;br /&gt;
}&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Définition du répertoire de destination des scripts ''Sieve'' (par défaut c'est le ''~'') en modifiant le fichier &amp;lt;code&amp;gt;90-sieve.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
 mv /etc/dovecot/conf.d/90-sieve.conf /etc/dovecot/conf.d/90-sieve.conf.ori&lt;br /&gt;
&lt;br /&gt;
On demande à ''Dovecot'' de créer le dossier ''Sieve'' dans la boite aux lettres (''Maildir'') de l'utilisateur lors de sa première connexion. De plus, il est demandé à l'outil d'utiliser les scripts qui seront ajoutés côté client par l'intermédiaire du [[#Glossaire|MUA]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/dovecot/conf.d/90-sieve.conf&lt;br /&gt;
plugin {&lt;br /&gt;
  sieve = ~/sieve/.dovecot.sieve&lt;br /&gt;
  sieve_before = /var/mail/sieve/before/spam.sieve&lt;br /&gt;
  sieve_dir = ~/sieve&lt;br /&gt;
}&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer l’arborescence pour les scripts ''Sieve'' globaux (actifs pour tous les utilisateurs et s'exécutant avant leurs scripts personnels) et définir les bons droits pour celle-ci&lt;br /&gt;
 mkdir -p /var/mail/sieve/before &amp;amp;&amp;amp; chown -R dovecot: /var/mail/sieve&lt;br /&gt;
&lt;br /&gt;
Redémarrer le service ''Dovecot''&lt;br /&gt;
 systemctl restart dovecot.service&lt;br /&gt;
&lt;br /&gt;
===Règle globale de gestion du pourriel===&lt;br /&gt;
Mise en place d'un script ''Sieve'' global et actif pour tout les utilisateurs. Il va permettre de placer tout les courriels détectés comme du pourriel par ''SpamAssassin'' dans le dossier ''Maildir'' ''&amp;quot;Spam&amp;quot;'' :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /var/mail/sieve/before/spam.sieve&lt;br /&gt;
require &amp;quot;fileinto&amp;quot;;&lt;br /&gt;
if header :contains &amp;quot;X-Spam-Flag&amp;quot; &amp;quot;YES&amp;quot; {&lt;br /&gt;
  fileinto &amp;quot;Spam&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compiler le fichier de règle afin de ne pas avoir un message d'avertissement (non bloquant) dans les journaux concernant les droits&lt;br /&gt;
 sievec /var/mail/sieve/before/spam.sieve&lt;br /&gt;
&lt;br /&gt;
Cette commande compile le fichier de règles dans le même répertoire que la source sous le nom &amp;lt;code&amp;gt;spam.svbin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Donner les droits aux fichiers&lt;br /&gt;
 chown dovecot: /var/mail/sieve/before/spam.*&lt;br /&gt;
&lt;br /&gt;
=OpenDKIM=&lt;br /&gt;
''OpenDKIM'' est un logiciel libre implémentant le protocole [https://fr.wikipedia.org/wiki/DomainKeys_Identified_Mail DKIM] (''DomainKeys Identified Mail''). Son rôle est d'authentifier le domaine de l'expéditeur (tant en émission qu'en réception) et d'assurer l'intégrité du message. Chaque courriel est alors signé lors de sa transmission initiale et la vérification de celle-ci à la réception permet d'appliquer une politique de traitement (via l'anti pourriel notamment). Couplé à [https://fr.wikipedia.org/wiki/Sender_Policy_Framework SPF] (''Sender Policy Framework''). Il participe donc à réduire la distribution de courriels indésirables aux utilisateurs.&lt;br /&gt;
&lt;br /&gt;
{{info|La mise en œuvre de ''DKIM'' étant plus complexe et lourde à mettre en place qu'un simple enregistrement ''DNS'' ''SPF'', son absence est bien moins pénalisante que ce dernier lors du traitement de vos message par les ''MTA'' destinataires (leur politique est beaucoup plus laxiste à ce sujet).&lt;br /&gt;
&lt;br /&gt;
À titre personnel, je n'ai pas mis en place cette technologie pendant 7 ans et cela ne m'a jamais handicapé. En revanche, ''SPF'' et un enregistrement ''PTR'' ''rDNS'' sont eux, réellement utiles. ''DKIM'' peut jouer si votre message passe tout juste les critères établis par le serveur distant et qu'un point de plus vous permet de ne pas être considéré comme non désiré.}}&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes principalement inspirés de la documentation idoine de ce [https://wiki.debian-fr.xyz/Opendkim Wiki] pour réaliser cette section.&lt;br /&gt;
&lt;br /&gt;
==Installation des paquets==&lt;br /&gt;
Nous installons l'outil qui sera exploité par ''Postfix'' afin de signé/vérifier les courriels ainsi que celui permettant de générer nos clés&lt;br /&gt;
 apt install --no-install-recommends opendkim opendkim-tools&lt;br /&gt;
&lt;br /&gt;
==Création d'un couple de clés==&lt;br /&gt;
Notez que nous écrivons cette documentation afin de permettre un usage multi-domaines. Dans cette optique, nous utiliserons un script de génération des clés se basant sur un tableau listant chacun d'eux. Toutefois, nous documentons ci-après la méthode permettant la création manuelle d'un couple de clés si vous privilégiez une approche plus directe. Nous vous invitons tout de même à considérer l'usage de la méthode scripté qui s'accommode aussi bien d'un ou plusieurs domaine.&lt;br /&gt;
&lt;br /&gt;
===Méthode manuelle===&lt;br /&gt;
Le paquet ''OpenDKIM'' crée automatiquement le répertoire &amp;lt;code&amp;gt;/etc/dkimkeys&amp;lt;/code&amp;gt;. Nous allons donc l'exploiter. La génération d'un couple de clés s'effectue via la commande &amp;lt;code&amp;gt;opendkim-genkey&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p /etc/dkimkeys/clefs/exemple.fr&lt;br /&gt;
opendkim-genkey -b 4096 -D /etc/dkimkeys/clefs/exemple.fr -r -d exemple.fr -s mail&lt;br /&gt;
echo &amp;quot;mail._domainkey.exemple.fr exemple.fr:mail:/etc/dkimkeys/clefs/exemple.fr/mail.private&amp;quot; &amp;gt;&amp;gt; /etc/dkimkeys/TableClefs&lt;br /&gt;
echo &amp;quot;exemple.fr mail._domainkey.exemple.fr&amp;quot; &amp;gt;&amp;gt; /etc/dkimkeys/TableSignatures&lt;br /&gt;
echo &amp;quot;exemple.fr&amp;quot; &amp;gt;&amp;gt; /etc/dkimkeys/HotesDeConfiance&lt;br /&gt;
chown -R opendkim:opendkim /etc/dkimkeys/clefs/exemple.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Méthode scripté===&lt;br /&gt;
Le script suivant permet la création des clés de façon récursive en parcourant une liste de domaines initialisée dans le tableau &amp;lt;code&amp;gt;domaines&amp;lt;/code&amp;gt;. Il constitue automatiquement l'arborescence à raison d'un répertoire par occurrence afin d'y ranger les fichiers conçus. Bien sûr, vous pouvez réaliser ces opérations vous mêmes via la commande de la section précédente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/dkimkeys/genClefs.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Script de génération des clés DKIM pour du multi-domaine&lt;br /&gt;
&lt;br /&gt;
selecteur=mail&lt;br /&gt;
repertoire=/etc/dkimkeys&lt;br /&gt;
domaines=&amp;quot;exemple.fr toto.fr&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for domaine in $domaines; do&lt;br /&gt;
    mkdir -p $repertoire/clefs/$domaine&lt;br /&gt;
    opendkim-genkey -b 4096 -D $repertoire/clefs/$domaine -r -d $domaine -s $selecteur&lt;br /&gt;
    echo &amp;quot;$selecteur._domainkey.$domaine $domaine:$selecteur:$repertoire/clefs/$domaine/$selecteur.private&amp;quot; &amp;gt;&amp;gt; $repertoire/TableClefs&lt;br /&gt;
    echo &amp;quot;$domaine $selecteur._domainkey.$domaine&amp;quot; &amp;gt;&amp;gt; $repertoire/TableSignatures&lt;br /&gt;
    echo &amp;quot;$domaine&amp;quot; &amp;gt;&amp;gt; $repertoire/HotesDeConfiance&lt;br /&gt;
    chown -R opendkim:opendkim $repertoire/clefs/$domaine&lt;br /&gt;
done&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 chmod 740 /etc/dkimkeys/genClefs.sh&lt;br /&gt;
 /etc/dkimkeys/genClefs.sh&lt;br /&gt;
&lt;br /&gt;
===Attribution des droits===&lt;br /&gt;
 chown opendkim:opendkim /etc/dkimkeys/clefs/&lt;br /&gt;
 chown opendkim:opendkim /etc/dkimkeys/{TableClefs,TableSignatures,HotesDeConfiance}&lt;br /&gt;
 chmod 660 /etc/dkimkeys/{TableClefs,TableSignatures,HotesDeConfiance}&lt;br /&gt;
&lt;br /&gt;
==Configuration d'OpenDKIM==&lt;br /&gt;
Le fichier est assez simple et reprend les éléments abordés précédemment.&lt;br /&gt;
 mv /etc/opendkim.conf /etc/opendkim.conf.ori&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/opendkim.conf&lt;br /&gt;
Syslog                  yes&lt;br /&gt;
SyslogSuccess           yes&lt;br /&gt;
Canonicalization        relaxed/simple&lt;br /&gt;
OversignHeaders         From&lt;br /&gt;
UserID                  opendkim&lt;br /&gt;
UMask                   007&lt;br /&gt;
Socket                  local:/var/spool/postfix/var/run/opendkim/opendkim.sock&lt;br /&gt;
PidFile                 /run/opendkim/opendkim.pid&lt;br /&gt;
TrustAnchorFile         /usr/share/dns/root.key&lt;br /&gt;
# Table des clés&lt;br /&gt;
KeyTable                /etc/dkimkeys/TableClefs&lt;br /&gt;
# Liste les domaines à signer&lt;br /&gt;
SigningTable            /etc/dkimkeys/TableSignatures&lt;br /&gt;
# SigningTable = Donne la correspondance entre les domaines et les selecteurs&lt;br /&gt;
ExternalIgnoreList      /etc/dkimkeys/HotesDeConfiance&lt;br /&gt;
# Donne la correspondance entre les selecteurs et les clés à utiliser&lt;br /&gt;
InternalHosts           /etc/dkimkeys/HotesDeConfiance&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Création du répertoire d'accueil pour le socket&lt;br /&gt;
 mkdir -p /var/spool/postfix/var/run/opendkim&lt;br /&gt;
&lt;br /&gt;
''Note : ce socket permet la communication entre Postfix et OpenDKIM. Le [https://unix.stackexchange.com/questions/74477/postfix-smtpd-warning-connect-to-milter-service-unix-var-run-opendkim-opendki choix] du chemin est guidé par la [http://www.postfix.org/BASIC_CONFIGURATION_README.html#chroot_setup racine d'exécution] du MTA selon les directives du fichier &amp;lt;code&amp;gt;master.cf&amp;lt;/code&amp;gt;.''&lt;br /&gt;
&lt;br /&gt;
Don de propriété dessus&lt;br /&gt;
 chown opendkim:opendkim /var/spool/postfix/var/run/opendkim&lt;br /&gt;
&lt;br /&gt;
Ajout de l'utilisateur ''opendkim'' au groupe ''postfix'' afin de permettre la communication via le socket&lt;br /&gt;
 usermod -a -G opendkim postfix&lt;br /&gt;
&lt;br /&gt;
Si vous avez été attentif lors de l'édition du fichier [[#Main.cf|main.cf]], vous avez dû remarqué les valeurs se rapportant à cette section. Je vous invite à y lire les commentaires afin de comprendre chacune d'elles.&lt;br /&gt;
&lt;br /&gt;
Tous les éléments locaux sont prêts, nous pouvons redémarrer le service&lt;br /&gt;
 systemctl restart opendkim.service&lt;br /&gt;
&lt;br /&gt;
==Enregistrement DNS DKIM==&lt;br /&gt;
Il ne vous a pas échappé que ce protocole se base lui aussi sur le ''DNS''. Il va falloir publier votre clé publique dans un enregistrement dédié sur votre zone. Ajoutez-en un de type ''TXT'' ou ''DKIM'' comportant le contenu du fichier &amp;lt;code&amp;gt;&amp;lt;selecteur&amp;gt;.txt&amp;lt;/code&amp;gt; généré avec votre clé tout à l'heure. Du fait de la longueur de la clé (4096 bits), son contenu est tronqué en plusieurs lignes. Cet aspect ne dérange nullement les implémentations ''DNS'' que j'ai pu rencontrer. Il est donc possible d'ajouter la clé à votre zone par un simple copier/coller de celle-ci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mail._domainkey	IN	TXT	( &amp;quot;v=DKIM1; h=sha256; k=rsa; s=email; &amp;quot;&lt;br /&gt;
	  &amp;quot;p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnjMYbRgp+0a7BY5pUdQ2lgMWlnsWCL94nwMfcZ0weEHQoL+ip1s7m95L0HqIjCi3yPn5lL4Lx0wZ8ujPKVhXB3R+E/rjBOUXo26vTULCDdpqfg+IzxvyqjM+644Y8NYb+fRu4WkpBMkptMmogRhHnu3uDS+4/IyEqAH4OOy5SZHW5atwm87KCEDH8LcffLedr/nV22gXe5Wd2M&amp;quot;&lt;br /&gt;
	  &amp;quot;z3RqLPyaOgOxoIqOZKOIy5Xs5x1FCV8MNRdj8xT65GKsriN5/RSXK1NU1dvhnmTl/zuXP95F21YZPbwZEy3EXsyQuiyb1westiXy4fkWi0qV9vdYvyNZLn+wUk6tvY1mQ/OBewnrqGfHR/Tf8r+6Ku29CAYt4k6DXEmlEmZlM3d8Vg7/krlsYdlZIqDmOktxelGg3Oey5IJeqknHZh0lxxNjGm1zPjUKbF0MgMP1DZzlDgHJKIk558IyBV&amp;quot;&lt;br /&gt;
	  &amp;quot;3zNDMIvVbbWNzOyeU5513n0AOx7D8jayHvc3R9GkhyeHDH4XBExcobKPZstsGdEdLLTFnT7fDVAqur53HSuLSAum+0IK8VkC5K0QN21A6DNlzKvCbN4l4blVNg7qlnViqFB9g3ZfAsdCfgca1Dq4iFWS+Z9yuwkfWxdQbKYfcwD8Zb8sLpmTYZmjbk9CcD8jTFkJwKpLaT2Beo8YJdKh31V/Fkd6MXbI5gECAwEAAQ==&amp;quot; )  ; ----- DKIM key mail for exemple.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour vérifier la prise en compte de votre modification, vous pouvez utiliser la commande suivante pour requêter le serveur ''DNS'' :&lt;br /&gt;
 dig mail._domainkey.exemple.fr TXT&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons des [[#Outils_WEB|outils WEB]] à la fin pour tester ceci de façon plus approfondie.&lt;br /&gt;
&lt;br /&gt;
=Spamassassin=&lt;br /&gt;
''Spamassassin'' est un programme écrit en ''Perl'' et en ''C'' diffusé sous la licence libre ''Apache'' version 2.0. Il a pour rôle de filtrer le trafic des courriels transitant par un ''MTA'' (''Postfix'' dans notre cas) dans l'optique d'identifier pour traitement les messages indésirables. Celui-ci peut prendre diverses formes dans la mesure où l'outil donne la possibilité à l'administrateur de réaliser ces propres filtres. Les actions les plus courantes sont de rejeter le message ou de le marquer pour trie via ''Sieve'' (solution retenue). Gardez en tête qu'il n'est pas impossible de faire face à des faux positifs et que le rejet de tels messages peuvent avoir des conséquences pour vos utilisateurs. Il convient alors d'appliquer les mesures adéquates à votre situation selon le flux que représente les pourriels.&lt;br /&gt;
&lt;br /&gt;
Pour chaque message filtrés, une note est attribuée au courriel selon des critères arbitraires tels que ceux énoncés en prérequis et sera utilisée lors de la lecture des règles afin de déterminer le sort réservé à celui-ci. Vous comprenez alors l'importance de respecter les standards de &amp;quot;propreté&amp;quot; énoncés en début de page pour que vos propres messages ne soient pas mal-traités par vos destinataires.&lt;br /&gt;
&lt;br /&gt;
Les sources suivantes ont, entre autres, permis d'écrire cette section :&lt;br /&gt;
* https://wiki.debian.org/DebianSpamAssassin&lt;br /&gt;
* https://www.malekal.com/installer-configurer-spamassassin-debian/&lt;br /&gt;
* https://www.linuxbabe.com/redhat/spamassassin-centos-rhel-block-email-spam&lt;br /&gt;
&lt;br /&gt;
==Installation de Spamassassin==&lt;br /&gt;
Le système de gestion des indésirables fonctionne au travers de trois composantes. Un module (''spamass-milter'') lié à ''Postfix'' écoutant sur un socket via le protocole ''Milter'' les messages provenant de celui-ci; un client nommé ''spamc'' exécuté par le module et chargé de transmettre les messages à ''spamd'' via un autre socket; un démon (''spamd'') chargé de la qualification des messages ainsi que de leur traitement.&lt;br /&gt;
&lt;br /&gt;
Installation des composants&lt;br /&gt;
 apt install --no-install-recommends spamassassin spamc spamass-milter&lt;br /&gt;
&lt;br /&gt;
Création d'un utilisateur dédié au service&lt;br /&gt;
 useradd --system --home-dir /run/spamassassin --shell /usr/sbin/nologin --user-group spamassassin&lt;br /&gt;
&lt;br /&gt;
Activation du service au démarrage&lt;br /&gt;
 systemctl enable spamassassin.service&lt;br /&gt;
&lt;br /&gt;
==Configuration de spamd==&lt;br /&gt;
Par défaut, le démon ''spamd'' s'exécute avec l'utilisateur &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt; et communique au module ''spamass-milter'' via un socket ''TCP''. Dans le respect du [https://fr.wikipedia.org/wiki/Principe_de_moindre_privil%C3%A8ge principe de moindre privilège], un utilisateur dédié a été ajouté et pour des raisons d'optimisation, de sécurité ainsi que de bon sens, le socket ''TCP'' laissera sa place à un socket ''UNIX''. Ce dernier est bien plus rapide (ne se tape pas tout le modèle ''OSI'' pour réaliser une communication locale...) et plus sécurisé (pas d'écoute ni de redirection de trames réseau possible).&lt;br /&gt;
&lt;br /&gt;
''Spamassassin'' ne créant pas lui-même le répertoire d'accueil de son socket, que nous situerons, [https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s15.html conformément] au [https://fr.wikipedia.org/wiki/Filesystem_Hierarchy_Standard Filesystem Hierarchy Standard] (''FHS''), dans le  &amp;lt;code&amp;gt;/run&amp;lt;/code&amp;gt; (qui est monté en ''tmpfs'' dans ''Debian''), nous ajouterons une [https://unix.stackexchange.com/questions/74477/postfix-smtpd-warning-connect-to-milter-service-unix-var-run-opendkim-opendki configuration] pour [https://www.freedesktop.org/software/systemd/man/tmpfiles.d.html systemd-tmpfiles] afin de le fabriquer au démarrage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /usr/lib/tmpfiles.d/spamassassin.conf&lt;br /&gt;
d /run/spamassassin 0750 spamassassin spamassassin - -&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la session active, nous créerons ce répertoire manuellement afin de ne pas avoir à redémarrer tout de suite&lt;br /&gt;
 mkdir -p /var/run/spamassassin&lt;br /&gt;
 chown spamassassin:spamassassin /var/run/spamassassin&lt;br /&gt;
&lt;br /&gt;
''Note : &amp;lt;code&amp;gt;/var/run&amp;lt;/code&amp;gt; est un lien symbolique du tmpfs &amp;lt;code&amp;gt;/run&amp;lt;/code&amp;gt; présent de base dans le système.''&lt;br /&gt;
&lt;br /&gt;
Configuration du service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Commenter toutes les lignes existantes&lt;br /&gt;
sed -i '/^$/!s/^/#/g' /etc/default/spamassassin&lt;br /&gt;
&lt;br /&gt;
# Configuration du démon pour utiliser l'utilisateur spamassassin, un PID à un emplacement donné et un socket personnalisé du type UNIX&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt;&amp;gt; /etc/default/spamassassin&lt;br /&gt;
&lt;br /&gt;
OPTIONS=&amp;quot;--username spamassassin --create-prefs --max-children 5 --helper-home-dir --socketpath=/run/spamassassin/spamassassin.sock --socketowner=spamassassin --socketgroup=spamassassin --socketmode=0660&amp;quot;&lt;br /&gt;
PIDFILE=&amp;quot;/var/run/spamassassin/spamd.pid&amp;quot;&lt;br /&gt;
CRON=0&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ajout d'une action en cas de détection de pourriel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt;&amp;gt; /etc/spamassassin/local.cf&lt;br /&gt;
&lt;br /&gt;
rewrite_header Subject *****SPAM*****&lt;br /&gt;
report_safe 0&lt;br /&gt;
whitelist_from *@exemple.fr&lt;br /&gt;
&lt;br /&gt;
add_header all Report _REPORT_&lt;br /&gt;
add_header spam Flag _YESNOCAPS_&lt;br /&gt;
add_header all Status _YESNO_, score=_SCORE_ required=_REQD_ tests=_TESTS_ autolearn=_AUTOLEARN_ version=_VERSION_&lt;br /&gt;
add_header all Level _STARS(*)_&lt;br /&gt;
add_header all Checker-Version SpamAssassin _VERSION_ (_SUBVERSION_) on _HOSTNAME_&lt;br /&gt;
&lt;br /&gt;
skip_rbl_checks 1&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette action ajoutera le préfixe ''*****SPAM*****'' au sujet du message considéré comme indésirable ainsi que des en-têtes de marquage (notamment ''X-Spam-Flag: YES''). Ceci aura pour effet de déclencher l'action de la règle ''Sieve'' globale écrite plus haut et de placer le message dans le dossier approprié. La dernière ligne désactive quant à elle la vérification des adresses ''IP'' émétrices via les [https://www.altospam.com/glossaire/listes-noires.php RBL] intégrées au logiciel (vous pouvez l'enlever si vous en voulez mais je ne sais pas ce qu'ils font des traces que vous laissez).&lt;br /&gt;
&lt;br /&gt;
==Configuration de spamass-milter==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Commenter toutes les lignes existantes&lt;br /&gt;
sed -i '/^$/!s/^/#/g' /etc/default/spamass-milter&lt;br /&gt;
&lt;br /&gt;
# Configuration du démon pour utiliser l'utilisateur spamassassin, un PID à un emplacement donné et un socket personnalisé du type UNIX&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt;&amp;gt; /etc/default/spamass-milter&lt;br /&gt;
&lt;br /&gt;
OPTIONS=&amp;quot;-u spamass-milter -i 127.0.0.1 -- -s 10485760 --socket=/run/spamassassin/spamassassin.sock&amp;quot;&lt;br /&gt;
SOCKET=&amp;quot;/var/spool/postfix/spamass/spamass.sock&amp;quot;&lt;br /&gt;
SOCKETOWNER=&amp;quot;spamass-milter:spamass-milter&amp;quot;&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{info|Si vous désirez rejeter les messages identifiés comme indésirables, vous pouvez ajouter le paramètre &amp;lt;code&amp;gt;-r &amp;lt;note&amp;gt;&amp;lt;/code&amp;gt; à la suite de l'adresse ''IP'' de lien local où ''&amp;lt;note&amp;gt;'' correspond à la note attribué au message par ''Spamassassin'' que vous considérez comme étant le seuil d'acceptabilité. Tout courriel ayant une note égale ou supérieur à ce seuil sera alors rejeté avec un code 550 à l'expéditeur.}}&lt;br /&gt;
&lt;br /&gt;
Ajout des utilisateurs &amp;lt;code&amp;gt;spamassassin&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;postfix&amp;lt;/code&amp;gt; au groupe &amp;lt;code&amp;gt;spamass-milter&amp;lt;/code&amp;gt; pour permettre la communication inter-socket&lt;br /&gt;
 usermod -a -G spamassassin spamass-milter&lt;br /&gt;
 usermod -a -G spamass-milter postfix&lt;br /&gt;
&lt;br /&gt;
''Note : la communication entre Postfix et Spamass-milter se fait à la fin du fichier [[#Main.cf|main.cf]] sur la même ligne que pour le socket d'OpenDKIM.''&lt;br /&gt;
&lt;br /&gt;
==Automatisation de l'apprentissage==&lt;br /&gt;
L'outil dispose d'une fonctionnalité d'apprentissage basée sur l'[https://fr.wikipedia.org/wiki/Inf%C3%A9rence_bay%C3%A9sienne inférence bayésienne]. Afin d'entraîner le moteur sur les messages reçus, vous pouvez utiliser la tâche planifiée suivante (nécessite le logiciel [[Cron]]) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; '_EOF_' &amp;gt; /etc/cron.daily/Spamassassin-bayés&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Script de mise à jour automatique de la base bayésienne de Spamassassin&lt;br /&gt;
&lt;br /&gt;
# Mise à jour des règles de spamassassin&lt;br /&gt;
# Pour utiliser cette fonctionnalité, il faut importer la clé GPG d'un canal de règles anti-pourriels.&lt;br /&gt;
# Dans la mesure où, comme expliqué, nous ne recevons pas de messages non désirés, nous n'avons pas explorer cette piste.&lt;br /&gt;
# /usr/bin/sa-update&lt;br /&gt;
&lt;br /&gt;
# Auto-apprentissage de Spamassassin sur les messages existants dans les boites aux lettres&lt;br /&gt;
/usr/bin/sa-learn --ham /var/spool/mail/utilisateurs/*/*/cur/*&lt;br /&gt;
/usr/bin/sa-learn --spam /var/spool/mail/utilisateurs/*/*/.Spam/cur/*&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 chmod +x /etc/cron.daily/Spamassassin-bayés&lt;br /&gt;
&lt;br /&gt;
{{info|La [https://cwiki.apache.org/confluence/display/SPAMASSASSIN/SiteWideBayesSetup documentation officielle] conseille de ne réaliser cette tâche que manuellement après vérification des messages présents dans votre boite aux lettres. Ceci dans une optique de ne pas apprendre de fausses données. Vous pouvez par exemple effectuer manuellement les commandes de cette section après un épisode de réception non désiré afin d'améliorer la détection. Si vous souhaitez suivre cette recommandation, pensez à ne pas le laisser dans ce répertoire afin que ''Cron'' ne l'exécute pas quotidiennement.}}&lt;br /&gt;
&lt;br /&gt;
=Tests de fonctionnement=&lt;br /&gt;
Nous voici arrivé au grand moment : celui du test !&lt;br /&gt;
&lt;br /&gt;
Il va falloir redémarrer tous les services configurés précédemment afin de valider leur bon fonctionnement. Habituellement, j'aurai procédé par étape au file des sections mais l'écosystème abordé ayant la particularité de faire appel à des composants inter-dépendants, il est difficile de réaliser des tests d'intégration continue sans devoir revenir modifier des configurations tout au long du cheminement, ce qui aurai rendu la lecture exécrable. Ayant conscience de la difficulté de suivre une procédure aussi conséquente (et en vous assurant de la tâche encore plus importante qu'a été sa rédaction), j'ai préféré faire le choix d'une configuration en une traite, quitte à devoir vous faire corriger les quelques erreurs d'inattentions dans la lecture par la suite en vous appuyant sur les journaux du système. Soyez sûr que l'idée d'user au maximum de copier/coller pour l'application de ce document a été la trame directrice de sa rédaction afin de faciliter la mise en place de votre propre messagerie électronique.&lt;br /&gt;
&lt;br /&gt;
==Redémarrage des services==&lt;br /&gt;
&lt;br /&gt;
{{astuce|Il peut être judicieux d'afficher les journaux concernant la messagerie dans un second terminal pendant que vous redémarrez les services via un &amp;lt;code&amp;gt;tail -f /var/log/mail.log&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
 systemctl restart spamass-milter.service&lt;br /&gt;
 systemctl restart spamassassin.service&lt;br /&gt;
 systemctl restart opendkim.service&lt;br /&gt;
 systemctl restart dovecot.service&lt;br /&gt;
 systemctl restart postfix.service&lt;br /&gt;
&lt;br /&gt;
Vous pouvez naturellement afficher le statut de chacun des services via la commande &amp;lt;code&amp;gt;systemctl status &amp;lt;service&amp;gt;&amp;lt;/code&amp;gt; afin de vérifier l'état de leur exécution ainsi que la commande &amp;lt;code&amp;gt;journalctl -feu &amp;lt;service&amp;gt;&amp;lt;/code&amp;gt; pour en afficher les journaux propres dans leur intégralité.&lt;br /&gt;
&lt;br /&gt;
==Tests de communication==&lt;br /&gt;
Quoi de mieux pour tester le fonctionnement que l'envoi d'un message ? Utilisez un client ''IMAP'' comme [[Rainloop]] ou [https://www.thunderbird.net/fr/ Thunderbird] (vous pouvez également configurer l'[[Thunderbird#Auto-configuration|auto-configuration]] pour celui-ci) et pensez à regarder le code source des messages sur la boite de destination afin de regarder leurs en-têtes. Vous y verrez la suite cryptographique utilisée pour la transmission, la note attribuée par ''Spamassassin'' ainsi que la signature ''DKIM''.&lt;br /&gt;
&lt;br /&gt;
==Outils WEB==&lt;br /&gt;
Après avoir validé l'aspect fonctionnel de votre installation, il peut être judicieux de s'attarder sur l'aspect qualitatif au regard des standards de l'époque.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, vous pouvez utiliser les outils ''WEB'' suivant qui vous attribueront des notes et vous détailleront les divers points examinés dans le but de vous améliorer :&lt;br /&gt;
* https://mxtoolbox.com pour vérifier vos résolutions DNS ainsi que la présence de votre adresse ''IP'' dans une liste noire d'indésirable&lt;br /&gt;
* https://www.mail-tester.com afin de visualiser les points attrayants à l'acceptabilité de vos messages (cela peut être l'occasion d'utiliser un alias...)&lt;br /&gt;
* https://cryptcheck.fr pour lister les suites cryptographiques ayant pu être négocier par le serveur distant&lt;br /&gt;
&lt;br /&gt;
{{astuce|Vous pouvez [https://rtcamp.com/tutorials/mail/server/testing/smtp/ vérifier] si votre serveur [https://fr.wikipedia.org/wiki/Open_relay relaie ouvertement] les courriels sur Internet (il ne doit pas le faire) via l'outil &amp;lt;code&amp;gt;swaks&amp;lt;/code&amp;gt; utilisée comme suit depuis un client :&lt;br /&gt;
 swaks --server mail.exemple.fr --to toto@tutu.org&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Test de détection de pourriels==&lt;br /&gt;
Il est possible de simuler un courriel frauduleux en envoyant un message contenant la chaîne de caractère suivante :&lt;br /&gt;
 XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X&lt;br /&gt;
&lt;br /&gt;
Vous verrez dans le journal &amp;lt;code&amp;gt;/var/log/mail.log&amp;lt;/code&amp;gt; la phrase &amp;lt;code&amp;gt;stored mail into mailbox 'Spam'&amp;lt;/code&amp;gt; informant de l'application de la règle ''Sieve'' de rangement.&lt;br /&gt;
&lt;br /&gt;
Depuis votre client de messagerie, vous verrez le message précédemment envoyé placé dans la boite &amp;quot;indésirables&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=Débogage=&lt;br /&gt;
==Messages d'erreurs connus==&lt;br /&gt;
Cette section regroupe quelques erreurs qui ont déjà étés rencontrés et observables dans le fichier &amp;lt;code&amp;gt;/var/log/mail.log&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Message !! Signification&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mail for exemple.fr loops back to myself&amp;lt;/code&amp;gt; || Le nom de domaine du champ MX n'est pas renseigné au paramètre &amp;quot;mydestination&amp;quot; dans le main.cf&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;postfix warning: SASL: Connect to private/auth failed: No such file or directory&amp;lt;/code&amp;gt; || Indique un problème avec ''Dovecot'' (gérant l'authentification). Il faut repasser dans les fichiers de configuration de celui-ci&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Commandes utiles=&lt;br /&gt;
==Affichage des configurations==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Commande !! Signification&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;postconf -d&amp;lt;/code&amp;gt; || Renvoie le contenu du fichier [[#Main.cf|main.cf]] par défaut&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;postconf -n&amp;lt;/code&amp;gt; || Renvoie le contenu actuel du fichier [[#Main.cf|main.cf]] sans les commentaires&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;postconf -p&amp;lt;/code&amp;gt; || Renvoie la configuration totale de ''Postfix'', valeurs par défaut comprises&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;doveconf -n&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;dovecot -n&amp;lt;/code&amp;gt; || Renvoie l'ensemble de la configuration de ''Dovecot''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Requêter la base de donnée==&lt;br /&gt;
Afin de tester les différents fichiers de liaison de la base de données ''SQLite'' à ''Postfix'', il est possible d'utiliser la commande &amp;lt;code&amp;gt;postmap&amp;lt;/code&amp;gt; sous cette forme&lt;br /&gt;
 postmap -q chaine_à_tester sqlite:/etc/postfix/sqlite-FONCTION.cf&lt;br /&gt;
&lt;br /&gt;
Pour vérifier l'existance d'un utilisateur ou d'un domaine, nous utiliserons la commande de cette façon&lt;br /&gt;
 postmap -q test@exemple sqlite:/etc/postfix/sqlite-utilisateurs.cf&lt;br /&gt;
 postmap -q jmador.yo sqlite:/etc/postfix/sqlite-domaines.cf&lt;br /&gt;
&lt;br /&gt;
==Gestion de la file d'attente de courrier==&lt;br /&gt;
La file d'attente des messages de ''Postfix'' (''mail queue'') est l'endroit où sont stockés les courriels en cours d'envoi/réception ou qui sont revenus au serveur suite à un [[#Glossaire|message de non-délivrance]]. Les commandes utiles permettant de la gérer sont les suivantes (tirées de [https://www.system-linux.eu/index.php?post/2009/01/27/Traitement-de-Queue-mail-Postfix ce document]) :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Commande !! Signification&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;postqueue -p&amp;lt;/code&amp;gt; || Liste les messages en queue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;postsuper -d DBB3F1A7&amp;lt;/code&amp;gt; || Supprime un message en queue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;postsuper -d ALL&amp;lt;/code&amp;gt; || Supprime tous les messages en queue&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;postsuper -h DBA3F1A7&amp;lt;/code&amp;gt; || Mettre un messages en attente&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;postsuper -H DBA3F1A7&amp;lt;/code&amp;gt; || Remettre un messages en mode normale&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;postsuper -r DBA3F1A7&amp;lt;/code&amp;gt; || Remettre en queue un message&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;postsuper -r ALL&amp;lt;/code&amp;gt; || Remettre en queue tous les messages&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;postcat -q DBA3F1A9&amp;lt;/code&amp;gt; || Afficher le contenu d'un message&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;postqueue -f&amp;lt;/code&amp;gt; || Forcer l'envoi des messages en queue &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Glossaire=&lt;br /&gt;
Le lexique entourant le domaine de la messagerie électronique est assez singulier. Voici quelques éléments de vocabulaire.&lt;br /&gt;
&lt;br /&gt;
==Rôles de messageries==&lt;br /&gt;
* Agent de Transport du Courriel ou ''MTA'' (''Mail Transport Agent'') : service chargé d'acheminer les courriels vers un service de distribution du courrier (''MDA''). Ce service est assuré par le protocole ''SMTP'' (utilisé par ''Postfix'' dans notre cas)&lt;br /&gt;
* Agent de Distribution du Courriel ou ''MDA'' (''Mail Delivery Agent'') : service chargé de déposer le courriel dans la boite aux lettres d'un utilisateur. Il s'occupe également des contraintes d'espace disque (quota, disque plein..) ou de corruption et prévient le ''MTA'' des erreurs de distribution. Cette tâche est assurée par les protocoles ''POP'', ''IMAP'' et ''JMAP'' (utilisés par ''Dovecot dans notre cas)&lt;br /&gt;
* Agent Utilisateur du Courriel ou ''MUA'' (''Mail User Agent'') : logiciel client de messagerie électronique (''Rainloop'', ''Roundcube'', ''Thenderbird'', ''Outlook''...) chargé de présenter les courriels aux utilisateurs et de permettre leur rédaction. Il parle directement au ''MDA'' pour les requêtes de réception et au ''MTA'' pour l'envoi de ses messages&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Protocoles mis en œuvre==&lt;br /&gt;
* ''Simple Mail Transfer Protocol'' ([https://fr.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol SMTP]) : protocole de communication utilisé pour transférer le courriel vers les serveurs de messagerie électronique&lt;br /&gt;
* ''Internet Message Access Protocol'' ([https://fr.wikipedia.org/wiki/Internet_Message_Access_Protocol IMAP]) : protocole permettant à un client d'accéder à ses courriels directement sur les serveurs de messagerie via un logiciel de consultation&lt;br /&gt;
* ''Transport Layer Security'' ([https://fr.wikipedia.org/wiki/Transport_Layer_Security TLS]) : protocole de négociation d'éléments secrets entre deux correspondant. Son objectif est de permettre l'établissement d'une communication sécurisée&lt;br /&gt;
* ''DomainKeys Identified Mail'' ([https://fr.wikipedia.org/wiki/DomainKeys_Identified_Mail DKIM]) : norme d'authentification fiable du nom de domaine de l'expéditeur d'un courriel. Permet également de garantir l'intégrité d'un message. Plus de détails sur ces balises [https://help.returnpath.com/hc/fr/articles/222481088-Aper%C3%A7u-du-DNS-record-pour-la-signature-DKIM ici]&lt;br /&gt;
** Selecteur : élément de l'en-tête ''DKIM'' indiquant l'emplacement de la clé dans la zone ''DNS'' du domaine. Cet élément est concaténé avec le domaine pour effectuer une requête de résolution comme vu [[#Enregistrement_DNS_DKIM|précédemment]]&lt;br /&gt;
* ''GNU Privacy Guard'' ([https://fr.wikipedia.org/wiki/GNU_Privacy_Guard GPG]) : implémentation libre du standard [https://fr.wikipedia.org/wiki/OpenPGP OpenPGP] permettant d'assurer la confidentialité et l'intégrité d'un message par un secret connu des seuls correspondants&lt;br /&gt;
* Milter : [http://www.postfix.org/MILTER_README.html extension] présente sous forme d'[https://fr.wikipedia.org/wiki/Interface_de_programmation interface de programmation] du ''MTA'' permettant d'intégrer un programme dans la file de traitement des courriels. C'est le mécanisme qui nous permet de traiter les pourriels ainsi que les signatures ''DKIM'' mais peut aussi servir à l'analyse [https://www.clamav.net/ anti-virale]&lt;br /&gt;
* ''Domain Name System'' ([https://fr.wikipedia.org/wiki/Domain_Name_System DNS]) : service d'annuaire distribué stockant des informations textuelles dans des enregistrements de différents types&lt;br /&gt;
** Enregistrement de type ''A'' et ''AAAA'' : fournit la correspondance entre un nom d'hôte et une adresse ''IP'' (respectivement version 4 et version 6)&lt;br /&gt;
** Enregistrement de type ''MX'' : fournit la correspondance entre le nom d'hôte du serveur de messagerie et un domaine. La concaténation de ces deux informations donne le nom pleinement qualifié (''FQDN'') et permet aux ''MTA'' distants de résoudre l'adresse ''IP'' du serveur de destination d'un messsage avec comme seule information le domaine de destination contenu dans le champ ''X-Original-to'' d'un courriel&lt;br /&gt;
** Enregistrement de type ''TXT'' : champ de texte libre destiné principalement à rendre le ''DNS'' fléxible aux nouveaux usages. Un autre protocole n'a alors qu'à lire le contenu du champ pour obtenir l'information à traiter selon un formatage qu'aura respecté son rédacteur&lt;br /&gt;
* ''Local Mail Transfer Protocol'' ([https://fr.wikipedia.org/wiki/Local_Mail_Transfer_Protocol LMTP]) : protocole ''SMTP'' simplifié destiné aux seuls échange de courriels entre utilisateurs d'un même ''MTA''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Divers==&lt;br /&gt;
* Pourriel ou ''SPAM'' : message non désiré et souvent nuisible (hameçonnage, virus, arnaque...). Ils viennent rarement seuls car leurs expéditeurs ont pour habitude d'en envoyer massivement. les pourriels représentaient tout de même entre [https://fr.wikipedia.org/wiki/Spam#Spam_publicitaire 90 et 97%] du trafic total des courriels fin des années 2000. L'[https://fr.wikipedia.org/wiki/Spam#Origine_du_terme_%C2%AB_spam_%C2%BB origine du mot] ''SPAM'' provient d'une marque de viande dont les pratiques publicitaires se rapprochaient de la pratique moderne. Sur un serveur personnel, il reste tout de même assez simple de s'en prémunir en respectant une politique stricte de transmission de vos adresses ([[#Cr.C3.A9ation_des_fichiers_d.27exploitation_de_Postfix|alias]]).&lt;br /&gt;
* ''HAM'' : désigne les courriels désirés. Cette notion est utilisée par le logiciel anti-pourriels ''Spamassassin'' lors de son usage de l'[https://fr.wikipedia.org/wiki/Inf%C3%A9rence_bay%C3%A9sienne inférence bayésienne]. Le terme est issue d'une partie du jambon en référence aux origines du mot ''SPAM'' et représente son opposé&lt;br /&gt;
* Boites aux lettres (BAL) : répertoire de messagerie personnelle d'un utilisateur destinée à accueillir ses correspondances (répertoire &amp;lt;code&amp;gt;~/Maildir&amp;lt;/code&amp;gt; de la documentation)&lt;br /&gt;
* Message de non-délivrance ([https://www.altospam.com/glossaire/bounce.php bounce]) : courrier émis par un ''MTA'' à l'émetteur d'un message lorsque celui-ci n'a pu être délivré afin de l'en informer&lt;br /&gt;
* Relais de courrier ouvert : serveur ''SMTP'' permettant à n'importe qui sur Internet d'envoyer un courriel par son intermédiaire&lt;br /&gt;
* Liste noire en temps réel ([https://www.altospam.com/glossaire/listes-noires.php Realtime Blackhole List] ou ''RBL'') : listes de serveurs ou de réseaux IP connus pour aider, accueillir, produire ou retransmettre des pourriels ou fournir un service pouvant en émettre (relais ouverts)&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Vim&amp;diff=1498</id>
		<title>Vim</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Vim&amp;diff=1498"/>
		<updated>2024-01-27T11:17:29Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Replacement des balise de coloration syntaxique en ligne par des balises codes pour optimiser le chargement de la page + correction de fautes de Français + actualisation du lien pour les couleurs 24 bits + ajout d'un lien vers le dépôt Gitea vim-dev-web&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:éditeurs de texte]]&lt;br /&gt;
[[Fichier:Vim logo.svg|100px]]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Vim Vim] est un éditeur de texte, bifurcation de [https://fr.wikipedia.org/wiki/Vi_(logiciel) vi], signifiant &amp;quot;VI aMélioré&amp;quot; permettant d'éditer des documents de type texte (notamment des fichiers de configuration) dans un terminal ou une console (''shell''). Il ne nécessite pas d'interface graphique pour être exécuté, ce qui en fait un excellent outil sur un serveur, dépourvu d'[[:Category:Environnements bureau|environnements de bureau]].&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
 apt install vim&lt;br /&gt;
&lt;br /&gt;
=Comportement=&lt;br /&gt;
Vim possède 5 modes :&lt;br /&gt;
# Le mode interactif&lt;br /&gt;
# Le mode insertion&lt;br /&gt;
# Le mode commande&lt;br /&gt;
# Le mode visuel&lt;br /&gt;
# Le mode recherche&lt;br /&gt;
&lt;br /&gt;
==Mode interactif==&lt;br /&gt;
Lorsque ''Vim'' est exécuté, il est par défaut en mode interactif. Ce mode permet d'utiliser des combinaisons de touche pour interagir avec le texte du document en cours d'édition. Il est par exemple possible, en une combinaison, de couper 4 lignes de texte et de les coller dans un autre emplacement du document, voir dans un autre document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Mettre un tableau avec les touches qu'on utilise souvent avec le mode interactif&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mode insertion==&lt;br /&gt;
Le mode insertion est le mode classique d'édition de texte. C'est celui dans lequel on tape du texte comme dans n'importe quel autre éditeur.&lt;br /&gt;
&lt;br /&gt;
Pour revenir au mode interactif, il faut presser la touche &amp;lt;code&amp;gt;&amp;lt;Echap&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Mode commande==&lt;br /&gt;
Ce mode permet d’interagir avec ''Vim'' par l'intermédiaire de commandes. Ces dernières vont permettre d'enregistrer le document, quitter ''Vim'', importer un document dans un autre, passer des expressions régulières, activer des options et bien d'autres choses...&lt;br /&gt;
&lt;br /&gt;
On entre une commande en étant au préalable en mode interactif et en tapant &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Quelque commandes===&lt;br /&gt;
Activer l'affichage des numéros de lignes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se nu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
désactiver l'affichage des numéros de lignes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se nu!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activer la coloration syntaxique&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
syn on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Désactiver la coloration syntaxique&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
syn off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afficher la ligne où se trouve le curseur&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set cursorline&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Masquer le trait de soulignement&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set cursorline!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Commenter plusieurs lignes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
,+4 s/^/#/g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dé-commenter plusieurs lignes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
.,+4 s/^#//g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Plus simple, pour commenter (après une sélection des lignes à commenter en mode visuel bloc &amp;lt;code&amp;gt;&amp;lt;maj&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/code&amp;gt; et un appui sur &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
s/^/#&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dé-commenter (après sélection &amp;lt;code&amp;gt;&amp;lt;maj&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
s/#//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou &amp;lt;code&amp;gt;&amp;lt;maj&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;&amp;lt;x&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ajouter en fin de ligne (après sélection &amp;lt;code&amp;gt;&amp;lt;maj&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
s/$/\ :\ &lt;br /&gt;
s/$/;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ajouter au niveau du curseur (après sélection &amp;lt;code&amp;gt;&amp;lt;ctrl&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
s/\%V/\ :&lt;br /&gt;
s/\%V/^I&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;vim ajouter à partir du curseur (À trouver) http://andrewradev.com/2011/05/08/vim-regexes/&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Placer des curseur là ou on veut pour pouvoir utiliser les regex d'en haut de façon ultra puissante&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer un mot par un autre&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
%s/Mot_initial/Nouveau_mot/g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Changer encodage caractère&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set fileencoding=latin1&lt;br /&gt;
set fileencoding=utf-8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auto complétion ''CSS'' (une fois renseigné, faire &amp;lt;code&amp;gt;&amp;lt;ctrl&amp;gt;+&amp;lt;x&amp;gt;&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;&amp;lt;ctrl&amp;gt;+&amp;lt;o&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set omnifunc=csscomplete#CompleteCSS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécuter une [[Shell bash|commande Bash]] sans quitter ''Vim''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
!Commande_À_Exécuter&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Importer un fichier depuis ''Vim''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
r Chemin_fichier&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indentation automatique&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se ai&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permettre un copier/coller respectant l'indentation avec &amp;lt;code&amp;gt;se ai&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se paste&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activer/désactiver &amp;lt;code&amp;gt;se paste&amp;lt;/code&amp;gt; en appuyant sur &amp;lt;code&amp;gt;&amp;lt;F2&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set pastetoggle=&amp;lt;F2&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Insensibilité à la casse (utile pour le mode recherche notamment)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se ic&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activer le curseur de sélection avec la souris&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se mouse=a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Désactiver le curseur de sélection avec la souris&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se mouse=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Scinder l'écran pour ouvrir un autre fichier horizontalement&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
split [Nom_fichier] ou :sp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En vertical&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
vspli ou :vsp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{info|Le couple &amp;lt;code&amp;gt;&amp;lt;ctrl-w&amp;gt; + flèche&amp;lt;/code&amp;gt; permet de passer d'un fichier à l'autre. }}&lt;br /&gt;
&lt;br /&gt;
Redéfinir l'espace de l'indentation (pour passer de 8 espaces à 3)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set tabstop=3&lt;br /&gt;
set shiftwidth=3&lt;br /&gt;
set softtabstop=3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Convertir des indentation &amp;quot;espace&amp;quot; en indentation &amp;quot;tabulation&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
%retab!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Créer et gérer des onglets&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
tabnew [nom_fichier]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se déplacer dans les onglets&lt;br /&gt;
&lt;br /&gt;
En avant : &amp;lt;code&amp;gt;gt&amp;lt;/code&amp;gt;, en arrière : &amp;lt;code&amp;gt;gT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ouvrir plusieurs fichiers dans un onglet chacun (à exécuter dans ''Bash'') :&lt;br /&gt;
 vim -p fichier1 fichier2 fichier3&lt;br /&gt;
&lt;br /&gt;
Convertir du texte en majuscule ou en minuscule&lt;br /&gt;
* Inverser la casse : sélectionner le texte avec &amp;lt;code&amp;gt;ctrl+v&amp;lt;/code&amp;gt; et faire un &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou&lt;br /&gt;
&lt;br /&gt;
* On peut utiliser &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; pour mettre en majuscule ou &amp;lt;code&amp;gt;u&amp;lt;/code&amp;gt; pour mettre en minuscule&lt;br /&gt;
&lt;br /&gt;
Masquer les commentaires d'un fichier (à ajouter dans un [[#fichiers de configuration|fichier de configuration]])&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set fdm=expr&lt;br /&gt;
set fde=getline(v:lnum)=~'^\\s*#'?1:getline(prevnonblank(v:lnum))=~'^\\s*#'?1:getline(nextnonblank(v:lnum))=~'^\\s*#'?1:0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour '''déplier''' temporairement un bloc de commentaires (un bloc correspondant dans ce cas à plusieurs lignes consécutives commençant par le caractère '''#'''), placez votre curseur sur le pli correspondant au bloc compacté et tapez &amp;lt;code&amp;gt;zo&amp;lt;/code&amp;gt; (ou pressez simplement sans sélection pour agir sur tout le document), et &amp;lt;code&amp;gt;zm&amp;lt;/code&amp;gt; pour '''le replier'''. Si vous avez déplié plusieurs blocs, vous pouvez '''tous les replier''' d'un coup avec &amp;lt;code&amp;gt;zM&amp;lt;/code&amp;gt; ; à l'inverse, vous pouvez '''déplier tous les blocs''' d'un seul coup avec &amp;lt;code&amp;gt;zi&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utiliser Vim en tant qu'éditeur hexadécimale ([http://pellelatarte.fr/2010/10/utiliser-vi-en-editeur-hexadecimal/ source])&lt;br /&gt;
 %!xxd&lt;br /&gt;
Revenir à la normal&lt;br /&gt;
 %!xxd -r&lt;br /&gt;
&lt;br /&gt;
{{attention|Un enregistrement en mode hexadécimale enregistrera le texte comme tel, il faudra alors désactiver ce mode et réenregistrer le document pour revenir à la normal.}}&lt;br /&gt;
&lt;br /&gt;
Garder la position du curseur là où il était à la [https://askubuntu.com/questions/202075/how-do-i-get-vim-to-remember-the-line-i-was-on-when-i-reopen-a-file réouverture] du fichier&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
if has(&amp;quot;autocmd&amp;quot;)&lt;br /&gt;
	au BufReadPost * if line(&amp;quot;'\&amp;quot;&amp;quot;) &amp;gt; 0 &amp;amp;&amp;amp; line(&amp;quot;'\&amp;quot;&amp;quot;) &amp;lt;= line(&amp;quot;$&amp;quot;) | exe &amp;quot;normal! g`\&amp;quot;&amp;quot; | endif&lt;br /&gt;
endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Désactiver les fonctions agaçantes===&lt;br /&gt;
Avec les mises à jour de ''Vim'', de plus en plus de fonctions inutiles et contres-productives sont installées par défaut (''Debian Stretch'', si tu m'entends...). Ce qui suit a pour but de rendre ''Vim'' de nouveau utilisable comme dans le bon vieux temps.&lt;br /&gt;
&lt;br /&gt;
Désactiver l'ajout automatique de commentaires ([https://superuser.com/questions/271023/vim-can-i-disable-continuation-of-comments-to-the-next-line source])&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set formatoptions-=cro&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Désactiver la gestion de la souris (qui empêche le copier/coller !)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set mouse=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Corrections de bogues===&lt;br /&gt;
====Corriger le problème des flèches qui affichent A B C D====&lt;br /&gt;
De façon totalement aléatoire et sur certaines configurations, l'utilisation des flèches au clavier enclenche automatiquement le monde insertion et tape les lettres A, B, C ou D en fonction de la flèche pressée. Il semble que la façon de régler ce problème diffère selon les configurations. Une liste impressionnante de palliatifs est trouvable [https://vim.fandom.com/wiki/Fix_arrow_keys_that_display_A_B_C_D_on_remote_shell ici]. La solution [https://vim.fandom.com/wiki/Fix_arrow_keys_that_display_A_B_C_D_on_remote_shell#Solution_24 n°24] a réglée celui rencontré sur une Debian 12 installée via ''PXE'' comme des centaines d'autres chaque années dans mon infrastructure (celle-là a décidée de me faire chier).&lt;br /&gt;
&lt;br /&gt;
Il faut re-cartographier les touches fléchées en ajoutant ceci dans le &amp;lt;code&amp;gt;~/.vimrc&amp;lt;/code&amp;gt; :&lt;br /&gt;
 nnoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OA &amp;lt;UP&amp;gt;&lt;br /&gt;
 nnoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OB &amp;lt;DOWN&amp;gt;&lt;br /&gt;
 nnoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OC &amp;lt;RIGHT&amp;gt;&lt;br /&gt;
 nnoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OD &amp;lt;LEFT&amp;gt;&lt;br /&gt;
 inoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OA &amp;lt;UP&amp;gt;&lt;br /&gt;
 inoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OB &amp;lt;DOWN&amp;gt;&lt;br /&gt;
 inoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OC &amp;lt;RIGHT&amp;gt;&lt;br /&gt;
 inoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OD &amp;lt;LEFT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Presses papiers=&lt;br /&gt;
''Vim'' possèdes plusieurs presses papiers appelés registres (''register'' ou ''buffers'') qui peuvent être exploités afin de maintenir plusieurs copier/coller en mémoires. Il y en a un par lettre de l'alphabet. Ils s'utilisent en '''mode interactif''' avec les touches &amp;lt;code&amp;gt;&amp;lt;&amp;quot;&amp;gt;+&amp;lt;lettre&amp;gt;+&amp;lt;raccourci&amp;gt;&amp;lt;/code&amp;gt; de cette manière :&lt;br /&gt;
&lt;br /&gt;
{{attention|Le contenu des presses papiers est sauvegardé même après avoir quitté ''Vim'' (ces informations sont stockés dans le fichier &amp;lt;code&amp;gt;~/.viminfo&amp;lt;/code&amp;gt;). Ceci peut avoir des conséquences en terme de confidentialité des informations. Au besoin, pensez à utiliser le registre poubelle ainsi que la suppression du contenu des registres expliqué plus bas.}} &lt;br /&gt;
&lt;br /&gt;
Copier des lignes dans des presses papiers différents&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;ayy&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;byy&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;cyy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Coller des lignes depuis des presses papiers différents&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;ap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;bp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;cp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pour ajouter une ligne à un presse papier, il faut préciser la lettre du presse papier voulu, en majuscule &amp;lt;code&amp;gt;&amp;quot;Byy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pour copier/coller en prenant en compte le presse papier par défaut (celui que l'on à lors d'un simple &amp;lt;code&amp;gt;yy&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;+yy&amp;lt;/code&amp;gt; copie une ligne pour le presse papier par défaut, et &amp;lt;code&amp;gt;&amp;quot;+p&amp;lt;/code&amp;gt; colle le presse papier par défaut (ceci n'a aucun intérêt...).&lt;br /&gt;
&lt;br /&gt;
Registre poubelle (équivalent du /dev/null). Permet de supprimer des lignes sans les conserver dans un registre&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;_dd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour vider le [https://stackoverflow.com/questions/19430200/how-to-clear-vim-registers-effectively contenu] d'un registre, il faut utiliser la commande &amp;lt;code&amp;gt;:let @a = ''&amp;lt;/code&amp;gt; en remplaçant la lettre par celle de votre registre ( utiliser &amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; pour le registre par défaut).&lt;br /&gt;
&lt;br /&gt;
=Historique=&lt;br /&gt;
L'historique de l'éditeur est parsemé dans le fichier &amp;lt;code&amp;gt;~/.viminfo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pour [https://unix.stackexchange.com/questions/204689/how-to-clear-search-and-command-history-in-vim purger] intégralement celui des recherches, il est possible de faire &amp;lt;code&amp;gt;:call histdel('/')&amp;lt;/code&amp;gt;. Pour celui des commandes, on fera &amp;lt;code&amp;gt;:call histdel(':')&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Il est également possible de ne supprimer qu'une entrée en particulier via un motif: &amp;lt;code&amp;gt;:call histdel(&amp;quot;:&amp;quot;, &amp;quot;MOT_CLÉ_CONTENU_DANS_VOTRE_COMMANDE&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Macros=&lt;br /&gt;
Définir l'intérêt des macros...&lt;br /&gt;
&lt;br /&gt;
Créer des macros&lt;br /&gt;
&amp;lt;code&amp;gt;q+&amp;lt;lettre&amp;gt;&amp;lt;/code&amp;gt; pour passer en mode enregistrement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; pour terminer l'enregistrement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;@+&amp;lt;lettre&amp;gt;&amp;lt;/code&amp;gt; pour la jouer (ça fait comme un presse papier).&lt;br /&gt;
&lt;br /&gt;
=Fichiers de configuration=&lt;br /&gt;
Les fichiers de configuration de ''Vim'' permettent de définir des paramètres activés à chaque lancement de l'éditeur. Il en existe deux types :&lt;br /&gt;
* Un général, actif pour tout les utilisateurs du système : &amp;lt;code&amp;gt;/etc/vim/vimrc&amp;lt;/code&amp;gt;&lt;br /&gt;
* Un courant, pour chaque utilisateurs en particulier : &amp;lt;code&amp;gt;~/.vimrc&amp;lt;/code&amp;gt;&lt;br /&gt;
Il suffit de renseigner des commandes Vim (sans les ''':''') dans ces fichiers pour que leur effet soit permanent.&lt;br /&gt;
&lt;br /&gt;
Pour exécuter ''Vim'' tout en [https://evanhahn.com/ignore-vimrc-with-vim/ ignorant] les fichiers de configuration :&lt;br /&gt;
 vim -u NONE&lt;br /&gt;
&lt;br /&gt;
=Greffons=&lt;br /&gt;
Il est possible d'ajouter des fonctionnalités supplémentaires à ''Vim'' par l'intermédiaire de greffons (''plugins''). Il sont à mettre (selon le même principe que le ''vimrc'') dans le répertoire général &amp;lt;code&amp;gt;/etc/vim/&amp;lt;/code&amp;gt; ou dans &amp;lt;code&amp;gt;~/.vim/&amp;lt;/code&amp;gt; pour les rendre spécifiques à chaque utilisateur.&lt;br /&gt;
&lt;br /&gt;
==Greffons que j'utilise==&lt;br /&gt;
Pour une configuration adaptée à un développement ''WEB'', les informations de ce [https://gitea.ycharbi.fr/ycharbi/vim-dev-web dépôt] peuvent-êtres utiles.&lt;br /&gt;
&lt;br /&gt;
===Emmet===&lt;br /&gt;
Orienté programmation web, le greffon [http://emmet.io/ Emmet] (anciennement ''Zen Coding'') permet, en utilisant une syntaxe (très) raccourcie, d'écrire du code ''HTML'' et ''CSS'' de façon extrêmement efficace. De plus, il est disponible sur une [http://emmet.io/download/ multitude d'éditeurs]. Il s'installe de la façon suivante :&lt;br /&gt;
&lt;br /&gt;
# Télécharger ''Emmet'' depuis les [https://github.com/mattn/emmet-vim sources]&lt;br /&gt;
# Décompresser les répertoires '''autoload''' et '''plugin''' dans &amp;lt;code&amp;gt;~/.vim/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour utiliser ''Emmet'', il faut écrire dans un fichier les différentes [http://docs.emmet.io/cheat-sheet/ expressions possibles] et faire la combinaison de touches (en mode interactif) &amp;lt;code&amp;gt;&amp;lt;c-y&amp;gt;,&amp;lt;/code&amp;gt; (faire '''ctrl + y''' et ensuite sur ''',''').&lt;br /&gt;
&lt;br /&gt;
===IndentLine===&lt;br /&gt;
''IndentLine'' permet d'afficher une ligne verticale marquant le niveau d'indentation de votre code. Il est très utile notamment lorsque les bloques de code sont imbriqués sur énormément de niveau (rendant le repérage visuel extrêmement difficile). Il s'installe de la façon suivante :&lt;br /&gt;
&lt;br /&gt;
# Télécharger ''IndentLine'' depuis les [https://github.com/Yggdroot/indentLine sources]&lt;br /&gt;
# Décompresser le répertoire '''plugin''' dans &amp;lt;code&amp;gt;~/.vim/&amp;lt;/code&amp;gt;&lt;br /&gt;
# Ajouter dans le ''.vimrc'' ce paramètre (l'espace de fin est important) : &amp;lt;code&amp;gt;set list lcs=tab:\|\ &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Gestionnaire de greffons==&lt;br /&gt;
===Vim-plug===&lt;br /&gt;
Télécharger le greffon&lt;br /&gt;
 curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim&lt;br /&gt;
&lt;br /&gt;
Ajouter les greffons à installer et ajouter dans le ''vimrc''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
call plug#begin()&lt;br /&gt;
Plug 'junegunn/vim-easy-align'&lt;br /&gt;
Plug 'vim-airline/vim-airline'&lt;br /&gt;
Plug 'vim-airline/vim-airline-themes'&lt;br /&gt;
Plug 'hzchirs/vim-material'&lt;br /&gt;
call plug#end()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''On trouve les noms de ces greffons sur leur page GIT.''&lt;br /&gt;
&lt;br /&gt;
Installer les greffons mis dans le ''vimrc'' (aller dans &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt;)&lt;br /&gt;
 :PlugInstall&lt;br /&gt;
&lt;br /&gt;
{{info|Tout est mis dans &amp;lt;code&amp;gt;.vim&amp;lt;/code&amp;gt;. Le paquet &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; est nécessaire.}}&lt;br /&gt;
&lt;br /&gt;
Un exemple de ''.vimrc''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se nu&lt;br /&gt;
se termguicolors&lt;br /&gt;
set pastetoggle=&amp;lt;F2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;L'indentation passe à 3 caractères&lt;br /&gt;
set tabstop=3&lt;br /&gt;
set shiftwidth=3&lt;br /&gt;
set softtabstop=3&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Activer les greffons&lt;br /&gt;
call plug#begin()&lt;br /&gt;
   Plug 'junegunn/vim-easy-align'&lt;br /&gt;
   Plug 'vim-airline/vim-airline'&lt;br /&gt;
   Plug 'vim-airline/vim-airline-themes'&lt;br /&gt;
   Plug 'hzchirs/vim-material'&lt;br /&gt;
call plug#end()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Appliquer le thème vim-matérial&lt;br /&gt;
colorscheme vim-material&lt;br /&gt;
let g:airline_theme='material'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Sources de la section====&lt;br /&gt;
* https://github.com/junegunn/vim-plug&lt;br /&gt;
* http://vimcolors.com/&lt;br /&gt;
&lt;br /&gt;
=Couleurs 24bits=&lt;br /&gt;
Pour avoir des couleurs plus sympas avec ''Vim'' (remplace le ''syn on''), il faut utiliser ''se termguicolors''. Attention, il faut que le terminal utilisé soit compatible. [https://github.com/termstandard/colors Cette page Github] peut aider à déterminer si c'est le cas.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* http://cfennajoui.net/vim/traduit/html/usr_30.txt.php&lt;br /&gt;
* http://www.blogduwebdesign.com/developpement-vim/vim-astuce-pour-le-copier-coller/605&lt;br /&gt;
* http://qsdqsd.free.fr/Vim/Vim_-_Un_pas_en_avant.html&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Vim&amp;diff=1497</id>
		<title>Vim</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Vim&amp;diff=1497"/>
		<updated>2024-01-27T10:52:49Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout de la section &amp;quot;Corrections de bogues&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:éditeurs de texte]]&lt;br /&gt;
[[Fichier:Vim logo.svg|100px]]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Vim Vim] est un éditeur de texte, bifurcation de [https://fr.wikipedia.org/wiki/Vi_(logiciel) vi], signifiant &amp;quot;VI aMélioré&amp;quot; permettant d'éditer des documents de type texte (notamment des fichiers de configuration) dans un terminal ou une console (''shell''). Il ne nécessite pas d'interface graphique pour être exécuté, ce qui en fait un excellent outil sur un serveur, dépourvu d'[[:Category:Environnements bureau|environnements de bureau]].&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
 apt install vim&lt;br /&gt;
&lt;br /&gt;
=Comportement=&lt;br /&gt;
Vim possède 5 modes :&lt;br /&gt;
# Le mode interactif&lt;br /&gt;
# Le mode insertion&lt;br /&gt;
# Le mode commande&lt;br /&gt;
# Le mode visuel&lt;br /&gt;
# Le mode recherche&lt;br /&gt;
&lt;br /&gt;
==Mode interactif==&lt;br /&gt;
Lorsque ''Vim'' est exécuté, il est par défaut en mode interactif. Ce mode permet d'utiliser des combinaisons de touche pour interagir avec le texte du document en cours d'édition. Il est par exemple possible, en une combinaison, de couper 4 lignes de texte et de les coller dans un autre emplacement du document, voir dans un autre document.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Mettre un tableau avec les touches qu'on utilise souvent avec le mode interactif&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mode insertion==&lt;br /&gt;
Le mode insertion est le mode classique d'édition de texte. C'est celui dans lequel on tape du texte comme dans n'importe quel autre éditeur.&lt;br /&gt;
&lt;br /&gt;
Pour revenir au mode interactif, il faut presser la touche &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;Echap&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Mode commande==&lt;br /&gt;
Ce mode permet d’interagir avec ''Vim'' par l'intermédiaire de commandes. Ces dernières vont permettre d'enregistrer le document, quitter ''Vim'', importer un document dans un autre, passer des expressions régulières, activer des options et bien d'autres choses...&lt;br /&gt;
&lt;br /&gt;
On entre une commande en étant au préalable en mode interactif et en tapant &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;:&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Quelque commandes===&lt;br /&gt;
Activer l'affichage des numéros de lignes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se nu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
désactiver l'affichage des numéros de lignes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se nu!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activer la coloration syntaxique&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
syn on&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Désactiver la coloration syntaxique&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
syn off&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afficher la ligne où se trouve le curseur&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set cursorline&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Masquer le trait de soulignement&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set cursorline!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Commenter plusieurs lignes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
,+4 s/^/#/g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dé-commenter plusieurs lignes&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
.,+4 s/^#//g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Plus simple, pour commenter (après une sélection des lignes à commenter en mode visuel bloc &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;maj&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; et un appui sur &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;:&amp;lt;/syntaxhighlight&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
s/^/#&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dé-commenter (après sélection &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;maj&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; + &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;:&amp;lt;/syntaxhighlight&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
s/#//&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;maj&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; puis &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;x&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ajouter en fin de ligne (après sélection &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;maj&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; + &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;:&amp;lt;/syntaxhighlight&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
s/$/\ :\ &lt;br /&gt;
s/$/;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ajouter au niveau du curseur (après sélection &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;ctrl&amp;gt;+&amp;lt;v&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; + &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;:&amp;lt;/syntaxhighlight&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
s/\%V/\ :&lt;br /&gt;
s/\%V/^I&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;vim ajouter à partir du curseur (À trouver) http://andrewradev.com/2011/05/08/vim-regexes/&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Placer des curseur là ou on veut pour pouvoir utiliser les regex d'en haut de façon ultra puissante&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remplacer un mot par un autre&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
%s/Mot_initial/Nouveau_mot/g&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Changer encodage caractère&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set fileencoding=latin1&lt;br /&gt;
set fileencoding=utf-8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auto complétion ''CSS'' (une fois renseigné, faire &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;ctrl&amp;gt;+&amp;lt;x&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; + &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;ctrl&amp;gt;+&amp;lt;o&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set omnifunc=csscomplete#CompleteCSS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécuter une [[Shell bash|commande Bash]] sans quitter ''Vim''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
!Commande_À_Exécuter&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Importer un fichier depuis ''Vim''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
r Chemin_fichier&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indentation automatique&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se ai&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permettre un copier/coller respectant l'indentation avec &amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot; inline&amp;gt;se ai&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se paste&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activer/désactiver &amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot; inline&amp;gt;se paste&amp;lt;/syntaxhighlight&amp;gt; en appuyant sur &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;F2&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set pastetoggle=&amp;lt;F2&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Insensibilité à la casse (utile pour le mode recherche notamment)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se ic&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Activer le curseur de sélection avec la souris&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se mouse=a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Désactiver le curseur de sélection avec la souris&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se mouse=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Scinder l'écran pour ouvrir un autre fichier horizontalement&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
split [Nom_fichier] ou :sp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En vertical&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
vspli ou :vsp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{info|Le couple &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;ctrl-w&amp;gt; + flèche&amp;lt;/syntaxhighlight&amp;gt; permet de passer d'un fichier à l'autre. }}&lt;br /&gt;
&lt;br /&gt;
Redéfinir l'espace de l'indentation (pour passer de 8 espaces à 3)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set tabstop=3&lt;br /&gt;
set shiftwidth=3&lt;br /&gt;
set softtabstop=3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Convertir des indentation &amp;quot;espace&amp;quot; en indentation &amp;quot;tabulation&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
%retab!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Créer et gérer des onglets&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
tabnew [nom_fichier]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se déplacer dans les onglets&lt;br /&gt;
&lt;br /&gt;
En avant : &amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot; inline&amp;gt;gt&amp;lt;/syntaxhighlight&amp;gt;, en arrière : &amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot; inline&amp;gt;gT&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ouvrir plusieurs fichiers dans un onglet chacun (à exécuter dans ''Bash'') :&lt;br /&gt;
 vim -p fichier1 fichier2 fichier3&lt;br /&gt;
&lt;br /&gt;
Convertir du texte en majuscule ou en minuscule&lt;br /&gt;
* Inverser la casse : sélectionner le texte avec &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;ctrl+v&amp;lt;/syntaxhighlight&amp;gt; et faire un &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;~&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou&lt;br /&gt;
&lt;br /&gt;
* On peut utiliser &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;U&amp;lt;/syntaxhighlight&amp;gt; pour mettre en majuscule ou &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;u&amp;lt;/syntaxhighlight&amp;gt; pour mettre en minuscule&lt;br /&gt;
&lt;br /&gt;
Masquer les commentaires d'un fichier (à ajouter dans un [[#fichiers de configuration|fichier de configuration]])&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set fdm=expr&lt;br /&gt;
set fde=getline(v:lnum)=~'^\\s*#'?1:getline(prevnonblank(v:lnum))=~'^\\s*#'?1:getline(nextnonblank(v:lnum))=~'^\\s*#'?1:0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour '''déplier''' temporairement un bloc de commentaires (un bloc correspondant dans ce cas à plusieurs lignes consécutives commençant par le caractère '''#'''), placez votre curseur sur le pli correspondant au bloc compacté et tapez &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;zo&amp;lt;/syntaxhighlight&amp;gt; (ou pressez simplement sans sélection pour agir sur tout le document), et &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;zm&amp;lt;/syntaxhighlight&amp;gt; pour '''le replier'''. Si vous avez déplié plusieurs blocs, vous pouvez '''tous les replier''' d'un coup avec &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;zM&amp;lt;/syntaxhighlight&amp;gt; ; à l'inverse, vous pouvez '''déplier tous les blocs''' d'un seul coup avec &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;zi&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Utiliser Vim en tant qu'éditeur hexadécimale ([http://pellelatarte.fr/2010/10/utiliser-vi-en-editeur-hexadecimal/ source])&lt;br /&gt;
 %!xxd&lt;br /&gt;
Revenir à la normal&lt;br /&gt;
 %!xxd -r&lt;br /&gt;
&lt;br /&gt;
{{attention|Un enregistrement en mode hexadécimale enregistrera le texte comme tel, il faudra alors désactiver ce mode et réenregistrer le document pour revenir à la normal.}}&lt;br /&gt;
&lt;br /&gt;
Garder la position du curseur là où il était à la [https://askubuntu.com/questions/202075/how-do-i-get-vim-to-remember-the-line-i-was-on-when-i-reopen-a-file réouverture] du fichier&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
if has(&amp;quot;autocmd&amp;quot;)&lt;br /&gt;
	au BufReadPost * if line(&amp;quot;'\&amp;quot;&amp;quot;) &amp;gt; 0 &amp;amp;&amp;amp; line(&amp;quot;'\&amp;quot;&amp;quot;) &amp;lt;= line(&amp;quot;$&amp;quot;) | exe &amp;quot;normal! g`\&amp;quot;&amp;quot; | endif&lt;br /&gt;
endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Désactiver les fonctions agaçantes===&lt;br /&gt;
Avec les mises à jour de ''Vim'', de plus en plus de fonctions inutiles et contres-productives sont installées par défaut (''Debian Stretch'', si tu m'entends...). Ce qui suit a pour but de rendre ''Vim'' de nouveau utilisable comme dans le bon vieux temps.&lt;br /&gt;
&lt;br /&gt;
Désactiver l'ajout automatique de commentaires ([https://superuser.com/questions/271023/vim-can-i-disable-continuation-of-comments-to-the-next-line source])&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set formatoptions-=cro&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Désactiver la gestion de la souris (qui empêche le copier/coller !)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
set mouse=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Corrections de bogues===&lt;br /&gt;
====Corriger le problème des flêches qui affichent A B C D====&lt;br /&gt;
De façon totalement aléatoire et sur certaines configurations, l'utilisation des flèches au clavier enclenche automatiquement le monde insertion et tape les lettres A, B, C ou D en fonction de la flèche préssée. Il semble que la façon de régler ce problème diffère selon les configurations. Une liste impressionnante de paliatifs est trouvable [https://vim.fandom.com/wiki/Fix_arrow_keys_that_display_A_B_C_D_on_remote_shell ici]. La solution [https://vim.fandom.com/wiki/Fix_arrow_keys_that_display_A_B_C_D_on_remote_shell#Solution_24 n°24] a réglée celui rencontré sur une Débian 12 installée via ''PXE'' comme des centaines d'autres chaque années dans mon infrastructure (celle-là a décidée de me faire chier).&lt;br /&gt;
&lt;br /&gt;
Il faut recartographier les touches flèchées en ajoutant ceci dans le &amp;lt;code&amp;gt;~/.vimrc&amp;lt;/code&amp;gt; :&lt;br /&gt;
 nnoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OA &amp;lt;UP&amp;gt;&lt;br /&gt;
 nnoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OB &amp;lt;DOWN&amp;gt;&lt;br /&gt;
 nnoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OC &amp;lt;RIGHT&amp;gt;&lt;br /&gt;
 nnoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OD &amp;lt;LEFT&amp;gt;&lt;br /&gt;
 inoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OA &amp;lt;UP&amp;gt;&lt;br /&gt;
 inoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OB &amp;lt;DOWN&amp;gt;&lt;br /&gt;
 inoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OC &amp;lt;RIGHT&amp;gt;&lt;br /&gt;
 inoremap &amp;lt;silent&amp;gt; &amp;lt;ESC&amp;gt;OD &amp;lt;LEFT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Presses papiers=&lt;br /&gt;
''Vim'' possèdes plusieurs presses papiers appelés registres (''register'' ou ''buffers'') qui peuvent être exploités afin de maintenir plusieurs copier/coller en mémoires. Il y en a un par lettre de l'alphabet. Ils s'utilisent en '''mode interactif''' avec les touches &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;&amp;quot;&amp;gt;+&amp;lt;lettre&amp;gt;+&amp;lt;raccourci&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; de cette manière :&lt;br /&gt;
&lt;br /&gt;
{{attention|Le contenu des presses papiers est sauvegardé même après avoir quitté ''Vim'' (ces informations sont stockés dans le fichier &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;~/.viminfo&amp;lt;/syntaxhighlight&amp;gt;). Ceci peut avoir des conséquences en terme de confidentialité des informations. Au besoin, pensez à utiliser le registre poubelle ainsi que la suppression du contenu des registres expliqué plus bas.}} &lt;br /&gt;
&lt;br /&gt;
Copier des lignes dans des presses papiers différents&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;quot;ayy&amp;lt;/syntaxhighlight&amp;gt;, &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;quot;byy&amp;lt;/syntaxhighlight&amp;gt;, &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;quot;cyy&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Coller des lignes depuis des presses papiers différents&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;quot;ap&amp;lt;/syntaxhighlight&amp;gt;, &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;quot;bp&amp;lt;/syntaxhighlight&amp;gt;, &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;quot;cp&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pour ajouter une ligne à un presse papier, il faut préciser la lettre du presse papier voulu, en majuscule &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;quot;Byy&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pour copier/coller en prenant en compte le presse papier par défaut (celui que l'on à lors d'un simple &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;yy&amp;lt;/syntaxhighlight&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;quot;+yy&amp;lt;/syntaxhighlight&amp;gt; copie une ligne pour le presse papier par défaut, et &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;quot;+p&amp;lt;/syntaxhighlight&amp;gt; colle le presse papier par défaut (ceci n'a aucun intérêt...).&lt;br /&gt;
&lt;br /&gt;
Registre poubelle (équivalent du /dev/null). Permet de supprimer des lignes sans les conserver dans un registre&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;quot;_dd&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour vider le [https://stackoverflow.com/questions/19430200/how-to-clear-vim-registers-effectively contenu] d'un registre, il faut utiliser la commande &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;:let @a = ''&amp;lt;/syntaxhighlight&amp;gt; en remplaçant la lettre par celle de votre registre ( utiliser &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; pour le registre par défaut).&lt;br /&gt;
&lt;br /&gt;
=Historique=&lt;br /&gt;
L'historique de l'éditeur est parsemé dans le fichier &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;~/.viminfo&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pour [https://unix.stackexchange.com/questions/204689/how-to-clear-search-and-command-history-in-vim purger] intégralement celui des recherches, il est possible de faire &amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot; inline&amp;gt;:call histdel('/')&amp;lt;/syntaxhighlight&amp;gt;. Pour celui des commandes, on fera &amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot; inline&amp;gt;:call histdel(':')&amp;lt;/syntaxhighlight&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Il est également possible de ne supprimer qu'une entrée en particulier via un motif: &amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot; inline&amp;gt;:call histdel(&amp;quot;:&amp;quot;, &amp;quot;MOT_CLÉ_CONTENU_DANS_VOTRE_COMMANDE&amp;quot;)&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Macros=&lt;br /&gt;
Définir l'intérêt des macros...&lt;br /&gt;
&lt;br /&gt;
Créer des macros&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;q+&amp;lt;lettre&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; pour passer en mode enregistrement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;q&amp;lt;/syntaxhighlight&amp;gt; pour terminer l'enregistrement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;@+&amp;lt;lettre&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; pour la jouer (ça fait comme un presse papier).&lt;br /&gt;
&lt;br /&gt;
=Fichiers de configuration=&lt;br /&gt;
Les fichiers de configuration de ''Vim'' permettent de définir des paramètres activés à chaque lancement de l'éditeur. Il en existe deux types :&lt;br /&gt;
* Un général, actif pour tout les utilisateurs du système : &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;/etc/vim/vimrc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Un courant, pour chaque utilisateurs en particulier : &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;~/.vimrc&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Il suffit de renseigner des commandes Vim (sans les ''':''') dans ces fichiers pour que leur effet soit permanent.&lt;br /&gt;
&lt;br /&gt;
Pour exécuter ''Vim'' tout en [https://evanhahn.com/ignore-vimrc-with-vim/ ignorant] les fichiers de configuration :&lt;br /&gt;
 vim -u NONE&lt;br /&gt;
&lt;br /&gt;
=Greffons=&lt;br /&gt;
Il est possible d'ajouter des fonctionnalités supplémentaires à ''Vim'' par l'intermédiaire de greffons (''plugins''). Il sont à mettre (selon le même principe que le ''vimrc'') dans le répertoire général &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;/etc/vim/&amp;lt;/syntaxhighlight&amp;gt; ou dans &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;~/.vim/&amp;lt;/syntaxhighlight&amp;gt; pour les rendre spécifiques à chaque utilisateur.&lt;br /&gt;
&lt;br /&gt;
==Greffons que j'utilise==&lt;br /&gt;
===Emmet===&lt;br /&gt;
Orienté programmation web, le greffon [http://emmet.io/ Emmet] (anciennement ''Zen Coding'') permet, en utilisant une syntaxe (très) raccourcie, d'écrire du code ''HTML'' et ''CSS'' de façon extrêmement efficace. De plus, il est disponible sur une [http://emmet.io/download/ multitude d'éditeurs]. Il s'installe de la façon suivante :&lt;br /&gt;
&lt;br /&gt;
# Télécharger ''Emmet'' depuis les [https://github.com/mattn/emmet-vim sources]&lt;br /&gt;
# Décompresser les répertoires '''autoload''' et '''plugin''' dans &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;~/.vim/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour utiliser ''Emmet'', il faut écrire dans un fichier les différentes [http://docs.emmet.io/cheat-sheet/ expressions possibles] et faire la combinaison de touches (en mode interactif) &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;c-y&amp;gt;,&amp;lt;/syntaxhighlight&amp;gt; (faire '''ctrl + y''' et ensuite sur ''',''').&lt;br /&gt;
&lt;br /&gt;
===IndentLine===&lt;br /&gt;
''IndentLine'' permet d'afficher une ligne verticale marquant le niveau d'indentation de votre code. Il est très utile notamment lorsque les bloques de code sont imbriqués sur énormément de niveau (rendant le repérage visuel extrêmement difficile). Il s'installe de la façon suivante :&lt;br /&gt;
&lt;br /&gt;
# Télécharger ''IndentLine'' depuis les [https://github.com/Yggdroot/indentLine sources]&lt;br /&gt;
# Décompresser le répertoire '''plugin''' dans &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;~/.vim/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Ajouter dans le ''.vimrc'' ce paramètre (l'espace de fin est important) : &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;set list lcs=tab:\|\ &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Gestionnaire de greffons==&lt;br /&gt;
===Vim-plug===&lt;br /&gt;
Télécharger le greffon&lt;br /&gt;
 curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim&lt;br /&gt;
&lt;br /&gt;
Ajouter les greffons à installer et ajouter dans le ''vimrc''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
call plug#begin()&lt;br /&gt;
Plug 'junegunn/vim-easy-align'&lt;br /&gt;
Plug 'vim-airline/vim-airline'&lt;br /&gt;
Plug 'vim-airline/vim-airline-themes'&lt;br /&gt;
Plug 'hzchirs/vim-material'&lt;br /&gt;
call plug#end()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''On trouve les noms de ces greffons sur leur page GIT.''&lt;br /&gt;
&lt;br /&gt;
Installer les greffons mis dans le ''vimrc'' (aller dans &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;vim&amp;lt;/syntaxhighlight&amp;gt;)&lt;br /&gt;
 :PlugInstall&lt;br /&gt;
&lt;br /&gt;
{{info|Tout est mis dans &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;.vim&amp;lt;/syntaxhighlight&amp;gt;. Le paquet &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;git&amp;lt;/syntaxhighlight&amp;gt; est nécessaire.}}&lt;br /&gt;
&lt;br /&gt;
Un exemple de ''.vimrc''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vim&amp;quot;&amp;gt;&lt;br /&gt;
se nu&lt;br /&gt;
se termguicolors&lt;br /&gt;
set pastetoggle=&amp;lt;F2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;L'indentation passe à 3 caractères&lt;br /&gt;
set tabstop=3&lt;br /&gt;
set shiftwidth=3&lt;br /&gt;
set softtabstop=3&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Activer les greffons&lt;br /&gt;
call plug#begin()&lt;br /&gt;
   Plug 'junegunn/vim-easy-align'&lt;br /&gt;
   Plug 'vim-airline/vim-airline'&lt;br /&gt;
   Plug 'vim-airline/vim-airline-themes'&lt;br /&gt;
   Plug 'hzchirs/vim-material'&lt;br /&gt;
call plug#end()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Appliquer le thème vim-matérial&lt;br /&gt;
colorscheme vim-material&lt;br /&gt;
let g:airline_theme='material'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Sources de la section====&lt;br /&gt;
* https://github.com/junegunn/vim-plug&lt;br /&gt;
* http://vimcolors.com/&lt;br /&gt;
&lt;br /&gt;
=Couleurs 24bits=&lt;br /&gt;
Pour avoir des couleurs plus sympas avec ''Vim'' (remplace le ''syn on''), il faut utiliser ''se termguicolors''. Attention, il faut que le terminal utilisé soit compatible. [https://gist.github.com/XVilka/8346728 Cette page Github] peut aider à déterminer si c'est le cas.&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* http://cfennajoui.net/vim/traduit/html/usr_30.txt.php&lt;br /&gt;
* http://www.blogduwebdesign.com/developpement-vim/vim-astuce-pour-le-copier-coller/605&lt;br /&gt;
* http://qsdqsd.free.fr/Vim/Vim_-_Un_pas_en_avant.html&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Base_de_registre_-_windows&amp;diff=1496</id>
		<title>Base de registre - windows</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Base_de_registre_-_windows&amp;diff=1496"/>
		<updated>2024-01-16T19:49:23Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout de la section &amp;quot;Activer la visionneuse Windows&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:windows]]&lt;br /&gt;
&lt;br /&gt;
La [https://www.malekal.com/registre-windows/ base de registre Windows] ou registre ''Windows'' est une base de données structurées où sont stockées un grand nombre d’informations sous la forme de clé et de valeur.&lt;br /&gt;
Elles sont utilisées par le système d'exploitation et ses composants ainsi que les programmes installés par l’utilisateur pour sauvegarder des données utiles à leurs fonctionnements.&lt;br /&gt;
&lt;br /&gt;
=Heure UTC=&lt;br /&gt;
''Windows'' étant un système d'exploitation produit par une PME peu au fait de ce qui se fait en informatique, celui-ci ne gère pas son horloge en ''UTC''... Ceci a pour effet de faire perde 2h à l'horloge à chaque démarrage après un ''Linux''. Comble de malchance, il n'effectue qu'une seule requête ''NTP'' par jour (et non ce n'est pas au démarrage)... Ce qui ne permet pas au système de se caler correctement si on ne le laisse pas allumé 24h... Et il reperdra 2h au prochain démarrage succédant à un ''Linux'' de toute façon...&lt;br /&gt;
&lt;br /&gt;
Ce comportement n'est pas configurable dans les paramètres mais est modifiable au niveau de la base de registre en y ajoutant  [https://{{SERVERNAME}}/fichiers/windows/base_registre/RealTimeIsUniversal.reg la clé suivante] et en redémarrant.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;reg&amp;quot;&amp;gt;&lt;br /&gt;
Windows Registry Editor Version 5.00&lt;br /&gt;
&lt;br /&gt;
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation]&lt;br /&gt;
     &amp;quot;RealTimeIsUniversal&amp;quot;=hex(b):01,00,00,00,00,00,00,00&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://superuser.com/questions/975717/does-windows-10-support-utc-as-bios-time#975764&lt;br /&gt;
&lt;br /&gt;
=Activer la visionneuse Windows=&lt;br /&gt;
Pour une raison inconnue, la visionneuse d'images intégrée à ''Windows''  n'est plus présente depuis la version 10 du [https://www.gnu.org/proprietary/malware-microsoft.html maliciel] de ''Microsoft'', ces derniers estimant que ''Paint'' remplit plus efficacement ce rôle... Cette estimation n'étant pas du goût des gens &amp;quot;normaux&amp;quot; (normaux étant à pondérer au vu du système d'exploitation qu'ils utilisent...), nous allons la réactiver (car oui elle est toujours livrée de base...).&lt;br /&gt;
&lt;br /&gt;
Télécharger l'archive [https://{{SERVERNAME}}/fichiers/windows/base_registre/Activer_Visionneuse_de_photos_Windows_sur_Windows_11_et_10-616e74209fd5d.zip suivante] et exécuter le fichier de registre &amp;lt;code&amp;gt;Activer_Visionneuse_de_photos_Windows.reg&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
La visionneuse d'image est de nouveau opérationnelle.&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://lecrabeinfo.net/restaurer-la-visionneuse-de-photos-windows-sur-windows-11-et-10.html&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Firefox&amp;diff=1495</id>
		<title>Firefox</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Firefox&amp;diff=1495"/>
		<updated>2024-01-14T16:50:27Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout de la section &amp;quot;Désactiver le rafraîchissement automatique&amp;quot; + remplacement des balises de coloration syntaxique&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:navigateurs web]]&lt;br /&gt;
&lt;br /&gt;
=Activer la gestion du tactile=&lt;br /&gt;
Comme beaucoup de fonctions dans Firefox, la gestion des écrans tactile n'est pas activée par défaut dans nombre d’environnements (c'est le cas de Debian). Pour l'activer, il faut définir une variable d'environnement et activer l'option dans la section dédiée de Firefox.&lt;br /&gt;
&lt;br /&gt;
==Définir la variable d'environnement==&lt;br /&gt;
 echo 'MOZ_USE_XINPUT2=1' &amp;gt;&amp;gt; /etc/environment&lt;br /&gt;
&lt;br /&gt;
La modification prend effet au redémarrage. Il est possible de lancer Firefox avec la définition de cette variable manuellement via le terminal en attendant: &amp;lt;code&amp;gt;MOZ_USE_XINPUT2=1 firefox&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Activation de l'option dans Firefox==&lt;br /&gt;
&lt;br /&gt;
Il faut se rendre dans &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt; et mettre le paramètre '''dom.w3c_touch_events.enabled''' à '''1'''. La modification est active instantanément. Vous pouvez profiter du défilement, de la sélection et du zoom au doigt.&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://support.mozilla.org/es/questions/1091627&lt;br /&gt;
&lt;br /&gt;
=Utiliser Wayland=&lt;br /&gt;
Il est possible d'utiliser ''Firefox'' avec [[Wayland]] en définissant la [https://www.reddit.com/r/firefox/comments/c8itj2/enabling_wayland_on_linux/ variable d'environnement] &amp;lt;code&amp;gt;MOZ_ENABLE_WAYLAND=1&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;/etc/environment&amp;lt;/code&amp;gt;. Un redémarrage du programme est nécessaire et il faut s'assurer que la variable est bien définie lors de son lancement (le plus simple est de redémarrer le système).&lt;br /&gt;
&lt;br /&gt;
=Désactiver le détachement d'un onglet=&lt;br /&gt;
Une fonctionne ultra casse couilles avec Firefox c'est bien le [https://www.askvg.com/firefox-tip-disable-tabs-drag-n-drop-feature-to-move-to-new-window/ glisser/déposer d'un onglet] qui en fait une nouvelle fenêtre. Juste insupportable. Pour désactiver cette merde, il faut passer la valeur &amp;lt;code&amp;gt;browser.tabs.allowTabDetach&amp;lt;/code&amp;gt; à '''false'''.&lt;br /&gt;
&lt;br /&gt;
=Restaurer la fenêtre de téléchargement=&lt;br /&gt;
Avec Firefox 98 (et comme avec chaque nouvelle version), une fonctionnalité indispensable a été supprimée : la possibilité d'ouvrir un fichier sans l'enregistrer quelque part sur le disque (il va simplement dans le &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;). Pour restaurer ce comportement, il faut passer la valeur &amp;lt;code&amp;gt;browser.download.improvements_to_download_panel&amp;lt;/code&amp;gt; à &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; dans le &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Forcer l'usage du presse papier=&lt;br /&gt;
Certains sites ''WEB'' se croient malins en interdisant l'utilisation du copier/coller dans les formulaires (réinitialisation de mots de passe par exemple). Cette pratique, en plus d'être une atteinte à notre liberté d'utiliser nos outils informatiques comme nous l'entendons, nous empêche de gérer nos [[Génération de mots de passe|mots de passe]] à notre guise (la meilleur clé est celle que vous ne connaissez pas et donc que vous ne pouvez pas taper dans un champ de formulaire...). Comme souvent, sous couvert de sécurité, le résultat est l'exact opposé. Aux développeurs ''WEB'' : laissez-nous gérer nos outils informatiques comme nous l'entendons, nous sommes bien plus à même de savoir ce qui est bon pour nous que vous !&lt;br /&gt;
&lt;br /&gt;
Pour dire à ''Firefox'' de ne pas respecter le ''Javascript'' qui lui dit d'adopter un comportement aussi débile, il faut passer la [https://www.howtogeek.com/251807/how-to-enable-pasting-text-on-sites-that-block-it/ valeur] &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt;dom.event.clipboardevents.enabled&amp;lt;/code&amp;gt; à '''false'''.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez alors de nouveau de vous prendre pour un [https://fr.wikipedia.org/wiki/Pasteur_(christianisme) pasteur] en usant de ''copy/paste'' !&lt;br /&gt;
&lt;br /&gt;
{{attention|La désactivation de cette fonction empêche le [https://github.com/element-hq/element-web/issues/25695 collage de textes] dans le champ de discutions de [[Matrix_synapse#Client_WEB_Element|element-web]] (un &amp;lt;code&amp;gt;ctrl+v&amp;lt;/code&amp;gt; n'a donc plus aucun effet).}}&lt;br /&gt;
&lt;br /&gt;
=Désactiver le rafraîchissement automatique=&lt;br /&gt;
Certains sites non respectueux de leurs utilisateurs (les sites de presse en tête), utilisent du ''Javascript'' pour rafraîchir automatiquement les pages de leur site (probablement pour générer du revenu avec la publicité).&lt;br /&gt;
Cette pratique, outre le fait de consommer de la bande passante et du ''CPU'' (donc de l'électricité), engendre un comportement non désiré et inattendu de l'utilisateur (seul maître légitime de son ordinateur).&lt;br /&gt;
&lt;br /&gt;
Pour faire cesser ça, il faut initier la clé &amp;lt;code&amp;gt;accessibility.blockautorefresh&amp;lt;/code&amp;gt; à ''true'' dans &amp;lt;code&amp;gt;about:config&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Infiniband_-_linux&amp;diff=1494</id>
		<title>Infiniband - linux</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Infiniband_-_linux&amp;diff=1494"/>
		<updated>2024-01-14T16:15:16Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Partie PC-1 */ Ajout de détails concernant le module noyau &amp;quot;ib_ipoib&amp;quot; + don de méthodes pour afficher des informations sur la carte IB&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:réseaux linux]]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Bus_InfiniBand Infiniband] est un bus haut débit permettant le transfert de données entre machines. Il agit au niveau 1 et 2 du modèle OSI et permet une communication à faible latence via le protocole Infiniband ou via l'une des 3 surcouches supportés:&lt;br /&gt;
* IP sur InfiniBand (IPoIB): présente une couche IP au-dessus de l'Infiniband&lt;br /&gt;
* Sockets Direct Protocol (SDP): présente une couche socket au-dessus de l'Infiniband avec transferts zéro-copie par RDMA&lt;br /&gt;
* SCSI RDMA Protocol (SRP): encapsulation de SCSI dans de l'Infiniband&lt;br /&gt;
&lt;br /&gt;
Pour chacune de ces surcouches, il faudra que la couche Infiniband (1 et 2) soit montée correctement pour qu'elle fonctionne. Infiniband est un protocole prévu pour fonctionner avec des commutateurs spécifiques agissant comme des gestionnaires de sous-réseau. Toute connexion entre machine doit en avoir au moins un (si plusieurs, une relation maitre/esclave se définit entre eux). En cas de connexion directe de PC à PC sans commutateur, il faudra utiliser un gestionnaire de sous-réseau virtuel (''opensm'' dans notre cas).&lt;br /&gt;
&lt;br /&gt;
{{Info|Cette documentation a été testé sous Debian Buster via deux cartes Infiniband Mellanox ConnectX. Une 1 port et l'autre 2 ports. Leur référence exacte est introuvable (même avec &amp;lt;source lang=&amp;quot;bash&amp;quot; inline&amp;gt;lspci&amp;lt;/source&amp;gt; - les deux cartes affichent les mêmes informations alors qu'elles sont différentes) mais je crois que c'est des ConnectX première génération.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Visualisation=&lt;br /&gt;
Il est possible de visualiser l'état des connexions Infiniband via les commandes contenus dans le paquet &amp;lt;source lang=&amp;quot;bash&amp;quot; inline&amp;gt;opensm&amp;lt;/source&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 ibstat&lt;br /&gt;
 ibstatus&lt;br /&gt;
 ibhosts et ibnodes&lt;br /&gt;
 ibnetdiscover&lt;br /&gt;
&lt;br /&gt;
Il est possible de réaliser un PING entre deux machines via les commandes suivantes:&lt;br /&gt;
&lt;br /&gt;
'''Sur un PC'''&lt;br /&gt;
 ibping -S&lt;br /&gt;
&lt;br /&gt;
'''Sur l'autre'''&lt;br /&gt;
 ibping 2&lt;br /&gt;
&lt;br /&gt;
''Le numéro correspond à celui de l'interface en partant de 1.''&lt;br /&gt;
&lt;br /&gt;
=IP sur Infiniband=&lt;br /&gt;
l'IPoIB (Internet Protocol over Infiniband) est une surcouche permettant l’utilisation des protocoles IPv4 et IPv6 sur un lien Infiniband.&lt;br /&gt;
&lt;br /&gt;
Cette section va être divisé en deux partie étant donnée que le gestionnaire de sous-réseau n'a besoin d'être installé que sur une des deux machines. Nous les nommerons PC-1 et PC-2 (PC-1 étant le gestionnaire de sous-réseau).&lt;br /&gt;
&lt;br /&gt;
==Partie PC-1==&lt;br /&gt;
'''Activation des modules noyau'''&lt;br /&gt;
 modprobe ib_ipoib&lt;br /&gt;
 modprobe ib_umad&lt;br /&gt;
&lt;br /&gt;
{{info|le module &amp;lt;code&amp;gt;ib_ipoib&amp;lt;/code&amp;gt; peut être chargé pour utiliser le mode &lt;br /&gt;
[https://docs.nvidia.com/networking/display/mlnxofedv551032/ip+over+infiniband+(ipoib) IPoIB amélioré] via le paramètre &amp;lt;code&amp;gt;ipoib_enhanced{{=}}1&amp;lt;/code&amp;gt;. On chargera alors le module comme suit : &amp;lt;code&amp;gt;modprobe ib_ipoib ipoib_enhanced{{=}}1&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Les interfaces Infiniband sont désormais visibles via un &amp;lt;code&amp;gt;ip link&amp;lt;/code&amp;gt;. Il est à noter que le module &amp;lt;code&amp;gt;ib_umad&amp;lt;/code&amp;gt; n'est utile que sur le gestionnaire de sous-réseau (''OpenSM'').&lt;br /&gt;
&lt;br /&gt;
Des détails sur les interfaces sont visibles via la commande &amp;lt;code&amp;gt;ibstat&amp;lt;/code&amp;gt; des pilotes [https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/ Mellanox OFED] disponible via l'archive de leur site ou via le paquet ''Debian'' &amp;lt;code&amp;gt;mstflint&amp;lt;/code&amp;gt;. Cette commande met simplement en [https://wiki.archlinux.org/title/InfiniBand#Software_subnet_manager forme] les informations contenues dans &amp;lt;code&amp;gt;/sys/class/infiniband/''&amp;lt;pilote&amp;gt;''/ports/''&amp;lt;num_iface&amp;gt;''/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Instalaltion d'OpenSM'''&lt;br /&gt;
 apt install opensm&lt;br /&gt;
&lt;br /&gt;
''Par défaut, le service ne se lance ni automatiquement, ni au démarrage.''&lt;br /&gt;
&lt;br /&gt;
'''Définir une adresse IP sur l'interface'''&lt;br /&gt;
 ip a a 192.168.151.1/24 dev ibp4s0d1&lt;br /&gt;
&lt;br /&gt;
'''L'allumée administrativement'''&lt;br /&gt;
 ip l set ibp4s0d1 up&lt;br /&gt;
&lt;br /&gt;
'''Démarrer le gestionnaire de sous-réseau'''&lt;br /&gt;
 systemctl start opensm&lt;br /&gt;
&lt;br /&gt;
''L'interface montera lorsque PC-2 sera prêt.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Amélioration des performances'''&lt;br /&gt;
&lt;br /&gt;
Il est possible d'augmenter significativement les performances en mettant l'interface en mode &amp;quot;connecté&amp;quot; en lieu et place de &amp;quot;datagram&amp;quot;. Ceci a pour effet de débrider la MTU maximale attribuable à cette dernière (passant de 2044 à 65520). Personnellement, je passe de 1,29 Go/s à 2,39 Go/s sur [[Iperf]] avec ce mode. Je n'ai trouvé aucun aspect négatif à ce changement (c'est à ce demander pourquoi il n'est pas activé par défaut... d'autant plus que le protocole se démerde pour fonctionner si ce n'est mis que d'un côté).&lt;br /&gt;
 echo connected &amp;gt; /sys/class/net/ibp4s0d1/mode&lt;br /&gt;
&lt;br /&gt;
Pour repasser en mode ''datagram'':&lt;br /&gt;
 echo datagram &amp;gt; /sys/class/net/ibp4s0d1/mode&lt;br /&gt;
&lt;br /&gt;
''La MTU se change d'elle même.''&lt;br /&gt;
&lt;br /&gt;
===Automatisation===&lt;br /&gt;
Il est possible de faire en sorte que ces étapes soient automatiques au démarrage de la machine en activant le service (''enable''), ajoutant les module à l'image de mémoire initiale (''initrd'') et en configurant l'adresse IP dans le fichier idoine (''/etc/network/interfaces'').&lt;br /&gt;
&lt;br /&gt;
'''Activer le service au démarrage'''&lt;br /&gt;
 systemctl enable opensm&lt;br /&gt;
&lt;br /&gt;
'''Ajouter les modules à l'image de mémoire initiale'''&lt;br /&gt;
 echo -e &amp;quot;ip_ipoib\nib_umad&amp;quot; &amp;gt;&amp;gt; /etc/modules&lt;br /&gt;
 update-initramfs -u&lt;br /&gt;
et mettre à jour votre chargeur d'amorçage ([[Grub|GRUB]] dans l'exemple suivant):&lt;br /&gt;
 update-grub&lt;br /&gt;
&lt;br /&gt;
'''Figer la configuration réseau'''&lt;br /&gt;
 echo -e &amp;quot;\nauto ibp4s0d1\niface ibp4s0d1 inet static\n\taddress 192.168.151.1/24&amp;quot; &amp;gt;&amp;gt; /etc/network/interfaces&lt;br /&gt;
&lt;br /&gt;
==Partie PC-2==&lt;br /&gt;
Cette partie est similaire à la première, les étapes nécessaires au gestionnaire de sous-réseau en moins.&lt;br /&gt;
&lt;br /&gt;
 modprob ip_ipoib&lt;br /&gt;
 ip a a 192.168.151.1/24 dev ibp1s0&lt;br /&gt;
 ip l set ibp1s0 up&lt;br /&gt;
 echo connected &amp;gt; /sys/class/net/ibp4s0d1/mode&lt;br /&gt;
&lt;br /&gt;
Les machines sont opérationnelles.&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://serverfault.com/questions/678532/connect-two-infiniband-cards-to-each-other-without-a-switch&lt;br /&gt;
* https://www.servethehome.com/configure-ipoib-mellanox-hcas-ubuntu-12041-lts/&lt;br /&gt;
Voir aussi:&lt;br /&gt;
* https://www.kernel.org/doc/html/latest/infiniband/ipoib.html&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* http://serveur.ipgirl.com/rseau-infiniband-entre-3-serveurs-ferm.html&lt;br /&gt;
* https://access.redhat.com/documentation/fr-fr/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_the_subnet_manager&lt;br /&gt;
* https://helios.himmelbauer-it.at/blogs/general/infiniband-mellanox-40gbit-link-on-debian-7/&lt;br /&gt;
* https://www.slideshare.net/FarkhandaKiran/infini-band-and-ethernet&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Infiniband_-_linux&amp;diff=1493</id>
		<title>Infiniband - linux</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Infiniband_-_linux&amp;diff=1493"/>
		<updated>2024-01-14T11:40:04Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Partie PC-1 */ correction de fautes de frappe sur l'activation des modules noyaux + changement de la balise code &amp;quot;ip link&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:réseaux linux]]&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Bus_InfiniBand Infiniband] est un bus haut débit permettant le transfert de données entre machines. Il agit au niveau 1 et 2 du modèle OSI et permet une communication à faible latence via le protocole Infiniband ou via l'une des 3 surcouches supportés:&lt;br /&gt;
* IP sur InfiniBand (IPoIB): présente une couche IP au-dessus de l'Infiniband&lt;br /&gt;
* Sockets Direct Protocol (SDP): présente une couche socket au-dessus de l'Infiniband avec transferts zéro-copie par RDMA&lt;br /&gt;
* SCSI RDMA Protocol (SRP): encapsulation de SCSI dans de l'Infiniband&lt;br /&gt;
&lt;br /&gt;
Pour chacune de ces surcouches, il faudra que la couche Infiniband (1 et 2) soit montée correctement pour qu'elle fonctionne. Infiniband est un protocole prévu pour fonctionner avec des commutateurs spécifiques agissant comme des gestionnaires de sous-réseau. Toute connexion entre machine doit en avoir au moins un (si plusieurs, une relation maitre/esclave se définit entre eux). En cas de connexion directe de PC à PC sans commutateur, il faudra utiliser un gestionnaire de sous-réseau virtuel (''opensm'' dans notre cas).&lt;br /&gt;
&lt;br /&gt;
{{Info|Cette documentation a été testé sous Debian Buster via deux cartes Infiniband Mellanox ConnectX. Une 1 port et l'autre 2 ports. Leur référence exacte est introuvable (même avec &amp;lt;source lang=&amp;quot;bash&amp;quot; inline&amp;gt;lspci&amp;lt;/source&amp;gt; - les deux cartes affichent les mêmes informations alors qu'elles sont différentes) mais je crois que c'est des ConnectX première génération.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Visualisation=&lt;br /&gt;
Il est possible de visualiser l'état des connexions Infiniband via les commandes contenus dans le paquet &amp;lt;source lang=&amp;quot;bash&amp;quot; inline&amp;gt;opensm&amp;lt;/source&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 ibstat&lt;br /&gt;
 ibstatus&lt;br /&gt;
 ibhosts et ibnodes&lt;br /&gt;
 ibnetdiscover&lt;br /&gt;
&lt;br /&gt;
Il est possible de réaliser un PING entre deux machines via les commandes suivantes:&lt;br /&gt;
&lt;br /&gt;
'''Sur un PC'''&lt;br /&gt;
 ibping -S&lt;br /&gt;
&lt;br /&gt;
'''Sur l'autre'''&lt;br /&gt;
 ibping 2&lt;br /&gt;
&lt;br /&gt;
''Le numéro correspond à celui de l'interface en partant de 1.''&lt;br /&gt;
&lt;br /&gt;
=IP sur Infiniband=&lt;br /&gt;
l'IPoIB (Internet Protocol over Infiniband) est une surcouche permettant l’utilisation des protocoles IPv4 et IPv6 sur un lien Infiniband.&lt;br /&gt;
&lt;br /&gt;
Cette section va être divisé en deux partie étant donnée que le gestionnaire de sous-réseau n'a besoin d'être installé que sur une des deux machines. Nous les nommerons PC-1 et PC-2 (PC-1 étant le gestionnaire de sous-réseau).&lt;br /&gt;
&lt;br /&gt;
==Partie PC-1==&lt;br /&gt;
'''Activation des modules noyau'''&lt;br /&gt;
 modprobe ib_ipoib&lt;br /&gt;
 modprobe ib_umad&lt;br /&gt;
&lt;br /&gt;
''Les interfaces Infiniband sont désormais visibles via un &amp;lt;code&amp;gt;ip link&amp;lt;/code&amp;gt;. Il est à noter que le module &amp;quot;ib_umad&amp;quot; n'est utile que sur le gestionnaire de sous-réseau.''&lt;br /&gt;
&lt;br /&gt;
'''Instalaltion d'OpenSM'''&lt;br /&gt;
 apt install opensm&lt;br /&gt;
&lt;br /&gt;
''Par défaut, le service ne se lance ni automatiquement, ni au démarrage.''&lt;br /&gt;
&lt;br /&gt;
'''Définir une adresse IP sur l'interface'''&lt;br /&gt;
 ip a a 192.168.151.1/24 dev ibp4s0d1&lt;br /&gt;
&lt;br /&gt;
'''L'allumée administrativement'''&lt;br /&gt;
 ip l set ibp4s0d1 up&lt;br /&gt;
&lt;br /&gt;
'''Démarrer le gestionnaire de sous-réseau'''&lt;br /&gt;
 systemctl start opensm&lt;br /&gt;
&lt;br /&gt;
''L'interface montera lorsque PC-2 sera prêt.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Amélioration des performances'''&lt;br /&gt;
&lt;br /&gt;
Il est possible d'augmenter significativement les performances en mettant l'interface en mode &amp;quot;connecté&amp;quot; en lieu et place de &amp;quot;datagram&amp;quot;. Ceci a pour effet de débrider la MTU maximale attribuable à cette dernière (passant de 2044 à 65520). Personnellement, je passe de 1,29 Go/s à 2,39 Go/s sur [[Iperf]] avec ce mode. Je n'ai trouvé aucun aspect négatif à ce changement (c'est à ce demander pourquoi il n'est pas activé par défaut... d'autant plus que le protocole se démerde pour fonctionner si ce n'est mis que d'un côté).&lt;br /&gt;
 echo connected &amp;gt; /sys/class/net/ibp4s0d1/mode&lt;br /&gt;
&lt;br /&gt;
Pour repasser en mode ''datagram'':&lt;br /&gt;
 echo datagram &amp;gt; /sys/class/net/ibp4s0d1/mode&lt;br /&gt;
&lt;br /&gt;
''La MTU se change d'elle même.''&lt;br /&gt;
&lt;br /&gt;
===Automatisation===&lt;br /&gt;
Il est possible de faire en sorte que ces étapes soient automatiques au démarrage de la machine en activant le service (''enable''), ajoutant les module à l'image de mémoire initiale (''initrd'') et en configurant l'adresse IP dans le fichier idoine (''/etc/network/interfaces'').&lt;br /&gt;
&lt;br /&gt;
'''Activer le service au démarrage'''&lt;br /&gt;
 systemctl enable opensm&lt;br /&gt;
&lt;br /&gt;
'''Ajouter les modules à l'image de mémoire initiale'''&lt;br /&gt;
 echo -e &amp;quot;ip_ipoib\nib_umad&amp;quot; &amp;gt;&amp;gt; /etc/modules&lt;br /&gt;
 update-initramfs -u&lt;br /&gt;
et mettre à jour votre chargeur d'amorçage ([[Grub|GRUB]] dans l'exemple suivant):&lt;br /&gt;
 update-grub&lt;br /&gt;
&lt;br /&gt;
'''Figer la configuration réseau'''&lt;br /&gt;
 echo -e &amp;quot;\nauto ibp4s0d1\niface ibp4s0d1 inet static\n\taddress 192.168.151.1/24&amp;quot; &amp;gt;&amp;gt; /etc/network/interfaces&lt;br /&gt;
&lt;br /&gt;
==Partie PC-2==&lt;br /&gt;
Cette partie est similaire à la première, les étapes nécessaires au gestionnaire de sous-réseau en moins.&lt;br /&gt;
&lt;br /&gt;
 modprob ip_ipoib&lt;br /&gt;
 ip a a 192.168.151.1/24 dev ibp1s0&lt;br /&gt;
 ip l set ibp1s0 up&lt;br /&gt;
 echo connected &amp;gt; /sys/class/net/ibp4s0d1/mode&lt;br /&gt;
&lt;br /&gt;
Les machines sont opérationnelles.&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://serverfault.com/questions/678532/connect-two-infiniband-cards-to-each-other-without-a-switch&lt;br /&gt;
* https://www.servethehome.com/configure-ipoib-mellanox-hcas-ubuntu-12041-lts/&lt;br /&gt;
Voir aussi:&lt;br /&gt;
* https://www.kernel.org/doc/html/latest/infiniband/ipoib.html&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* http://serveur.ipgirl.com/rseau-infiniband-entre-3-serveurs-ferm.html&lt;br /&gt;
* https://access.redhat.com/documentation/fr-fr/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_the_subnet_manager&lt;br /&gt;
* https://helios.himmelbauer-it.at/blogs/general/infiniband-mellanox-40gbit-link-on-debian-7/&lt;br /&gt;
* https://www.slideshare.net/FarkhandaKiran/infini-band-and-ethernet&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Firefox&amp;diff=1492</id>
		<title>Firefox</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Firefox&amp;diff=1492"/>
		<updated>2023-12-19T19:25:16Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Forcer l'usage du presse papier */ Ajout d'une bannière attention concernant le dysfonctionnement du collage dans element-web&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:navigateurs web]]&lt;br /&gt;
&lt;br /&gt;
=Activer la gestion du tactile=&lt;br /&gt;
Comme beaucoup de fonctions dans Firefox, la gestion des écrans tactile n'est pas activée par défaut dans nombre d’environnements (c'est le cas de Debian). Pour l'activer, il faut définir une variable d'environnement et activer l'option dans la section dédiée de Firefox.&lt;br /&gt;
&lt;br /&gt;
==Définir la variable d'environnement==&lt;br /&gt;
 echo 'MOZ_USE_XINPUT2=1' &amp;gt;&amp;gt; /etc/environment&lt;br /&gt;
&lt;br /&gt;
La modification prend effet au redémarrage. Il est possible de lancer Firefox avec la définition de cette variable manuellement via le terminal en attendant: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;MOZ_USE_XINPUT2=1 firefox&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Activation de l'option dans Firefox==&lt;br /&gt;
&lt;br /&gt;
Il faut se rendre dans &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;about:config&amp;lt;/syntaxhighlight&amp;gt; et mettre le paramètre '''dom.w3c_touch_events.enabled''' à '''1'''. La modification est active instantanément. Vous pouvez profiter du défilement, de la sélection et du zoom au doigt.&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://support.mozilla.org/es/questions/1091627&lt;br /&gt;
&lt;br /&gt;
=Utiliser Wayland=&lt;br /&gt;
Il est possible d'utiliser ''Firefox'' avec [[Wayland]] en définissant la [https://www.reddit.com/r/firefox/comments/c8itj2/enabling_wayland_on_linux/ variable d'environnement] &amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot; inline&amp;gt;MOZ_ENABLE_WAYLAND=1&amp;lt;/syntaxhighlight&amp;gt; dans &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;/etc/environment&amp;lt;/syntaxhighlight&amp;gt;. Un redémarrage du programme est nécessaire et il faut s'assurer que la variable est bien définie lors de son lancement (le plus simple est de redémarrer le système).&lt;br /&gt;
&lt;br /&gt;
=Désactiver le détachement d'un onglet=&lt;br /&gt;
Une fonctionne ultra casse couilles avec Firefox c'est bien le [https://www.askvg.com/firefox-tip-disable-tabs-drag-n-drop-feature-to-move-to-new-window/ glisser/déposer d'un onglet] qui en fait une nouvelle fenêtre. Juste insupportable. Pour désactiver cette merde, il faut passer la valeur &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;browser.tabs.allowTabDetach&amp;lt;/syntaxhighlight&amp;gt; à '''false'''.&lt;br /&gt;
&lt;br /&gt;
=Restaurer la fenêtre de téléchargement=&lt;br /&gt;
Avec Firefox 98 (et comme avec chaque nouvelle version), une fonctionnalité indispensable a été supprimée : la possibilité d'ouvrir un fichier sans l'enregistrer quelque part sur le disque (il va simplement dans le &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;/tmp&amp;lt;/syntaxhighlight&amp;gt;). Pour restaurer ce comportement, il faut passer la valeur &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;browser.download.improvements_to_download_panel&amp;lt;/syntaxhighlight&amp;gt; à &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;false&amp;lt;/syntaxhighlight&amp;gt; dans le &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;about:config&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Forcer l'usage du presse papier=&lt;br /&gt;
Certains sites ''WEB'' se croient malins en interdisant l'utilisation du copier/coller dans les formulaires (réinitialisation de mots de passe par exemple). Cette pratique, en plus d'être une atteinte à notre liberté d'utiliser nos outils informatiques comme nous l'entendons, nous empêche de gérer nos [[Génération de mots de passe|mots de passe]] à notre guise (la meilleur clé est celle que vous ne connaissez pas et donc que vous ne pouvez pas taper dans un champ de formulaire...). Comme souvent, sous couvert de sécurité, le résultat est l'exact opposé. Aux développeurs ''WEB'' : laissez-nous gérer nos outils informatiques comme nous l'entendons, nous sommes bien plus à même de savoir ce qui est bon pour nous que vous !&lt;br /&gt;
&lt;br /&gt;
Pour dire à ''Firefox'' de ne pas respecter le ''Javascript'' qui lui dit d'adopter un comportement aussi débile, il faut passer la [https://www.howtogeek.com/251807/how-to-enable-pasting-text-on-sites-that-block-it/ valeur] &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;about:config&amp;lt;/syntaxhighlight&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;dom.event.clipboardevents.enabled&amp;lt;/syntaxhighlight&amp;gt; à '''false'''.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez alors de nouveau de vous prendre pour un [https://fr.wikipedia.org/wiki/Pasteur_(christianisme) pasteur] en usant de ''copy/paste'' !&lt;br /&gt;
&lt;br /&gt;
{{attention|La désactivation de cette fonction empêche le [https://github.com/element-hq/element-web/issues/25695 collage de textes] dans le champ de discutions de [[Matrix_synapse#Client_WEB_Element|element-web]] (un &amp;lt;code&amp;gt;ctrl+v&amp;lt;/code&amp;gt; n'a donc plus aucun effet).}}&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Installation_automatique_d%27un_paquet_Debian&amp;diff=1491</id>
		<title>Installation automatique d'un paquet Debian</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Installation_automatique_d%27un_paquet_Debian&amp;diff=1491"/>
		<updated>2023-11-18T19:09:11Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : /* Usage pratique */ Ajout d'une bannière d'information listant les valeurs possibles de DEBIAN_FRONTEND&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:apt]]&lt;br /&gt;
Lors de l'installation de paquets avec [[:Category:apt|APT]], certain d'entre eux posent des questions via une interface ''ncurses'', ce qui gène leur installation via des scripts (et ceux, même avec l'option '''-y'''). Pour y remédier, il faut soit désactiver complètement cette interaction ''ncurses'' afin d'utiliser les valeurs par défaut ou soit configurer ''debconf'' afin de préciser nous même les paramètres à appliquer par défaut pour un paquet.&lt;br /&gt;
&lt;br /&gt;
=Désactivation de l’interaction=&lt;br /&gt;
Il faut définir la variable ''DEBIAN_FRONTEND'' comme suit&lt;br /&gt;
 export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
&lt;br /&gt;
et la réactiver quand on en a plus besoin&lt;br /&gt;
 unset DEBIAN_FRONTEND&lt;br /&gt;
&lt;br /&gt;
==Usage pratique==&lt;br /&gt;
 export DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
 apt -y install foopackage&lt;br /&gt;
 apt -y install barpackage&lt;br /&gt;
 unset DEBIAN_FRONTEND&lt;br /&gt;
&lt;br /&gt;
{{info|La variable [https://fr.linux-console.net/?p{{=}}17177 DEBIAN_FRONTEND] supporte les valeurs &amp;lt;code&amp;gt;noninteractive&amp;lt;/code&amp;gt; : ne pose aucune questions et utilise les valeurs par défaut ; &amp;lt;code&amp;gt;dialogue&amp;lt;/code&amp;gt; : pose les questions via une interface ''ncurses'' (valeur par défaut) ; &amp;lt;code&amp;gt;texte&amp;lt;/code&amp;gt; : pose les questions via une interface teste simple ; &amp;lt;code&amp;gt;gtk&amp;lt;/code&amp;gt; : pose les questions via une interface graphique ''GTK'' (nécessite les paquets cdebconf-gtk et gkdebconf).}}&lt;br /&gt;
&lt;br /&gt;
=Configuration de debconf=&lt;br /&gt;
Pour cette partie, il va falloir passer des arguments au programme debconf (qui définit les variables à passer à DPKG lors des installations). Afin de connaître les valeurs possibles, il faut installer le paquet debconf-utils (inutile si vous connaissez les valeurs à l'avance)&lt;br /&gt;
 apt install debconf-utils&lt;br /&gt;
&lt;br /&gt;
La commande ''debconf-get-selection'' permet de lister l'ensemble des variables possibles. On peut l'utiliser avec un pipe pour filtrer ce qui nous intéresse. Personnellement, je l'utilise avec ''less'' et sa fonction de recherche '''/''' afin de trouver ce qui m'intéresse.&lt;br /&gt;
 debconf-get-selection | less&lt;br /&gt;
&lt;br /&gt;
Pour définir une valeur personnalisé, on l'utilise comme suit (exemple avec Wireshark)&lt;br /&gt;
 echo &amp;quot;wireshark-common wireshark-common/install-setuid boolean true&amp;quot; | debconf-set-selections&lt;br /&gt;
&lt;br /&gt;
Il suffit ensuite d'installer le paquet (ici ''wireshark'') et constater que le paquet ne pose plus la question qui faisait chier&lt;br /&gt;
 apt install -y wireshark&lt;br /&gt;
&lt;br /&gt;
=Source=&lt;br /&gt;
* http://languor.us/disable-pop-ups-unattended-non-interactive-apt-get-install-ubuntu-debian&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Openssh&amp;diff=1490</id>
		<title>Openssh</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Openssh&amp;diff=1490"/>
		<updated>2023-11-11T15:09:59Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Ajout de la section &amp;quot;SSH inversé&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:service_ssh]]&lt;br /&gt;
[[Category:shell]]&lt;br /&gt;
&lt;br /&gt;
=Authentification par clef SSH=&lt;br /&gt;
Au lieu de s'authentifier par mot de passe, les utilisateurs peuvent s'authentifier grâce à la cryptographie asymétrique et son couple de clefs privée/publique, comme le fait le serveur ''SSH'' auprès du client ''SSH''.&lt;br /&gt;
&lt;br /&gt;
==Générer ses clefs==&lt;br /&gt;
Pour générer un couple de clefs, tapez sur le client :&lt;br /&gt;
 ssh-keygen -t ed25519&lt;br /&gt;
&lt;br /&gt;
ou avec plus de paramètres :&lt;br /&gt;
&lt;br /&gt;
 ssh-keygen -a 100 -t ed25519 -f ~/.ssh/id_ed25519&lt;br /&gt;
&lt;br /&gt;
Paramètres :&lt;br /&gt;
* -a : nombre d'itérations de la [https://fr.wikipedia.org/wiki/Fonction_de_d%C3%A9rivation_de_cl%C3%A9 fonction de dérivation de clé]. Permet de rendre la clé plus résistante aux attaques par force brut. La valeur par défaut est définie à 16&lt;br /&gt;
* -t : type de clé. La taille d'une clé ''ed25519'' est fixée dans le code d{{'}}''OpenSSH''. Le paramètre &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;-b&amp;lt;/syntaxhighlight&amp;gt; permet de la spécifier pour les autres formats&lt;br /&gt;
* -f : fichier de destination&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faut envoyer le fichier '''~/.ssh/id_ed25519.pub''' du client sur le serveur, tapez sur le client :&lt;br /&gt;
 scp /home/user/.ssh/id_ed25519.pub UTILISATEUR@SERVEUR:/home/user/.ssh/authorized_keys&lt;br /&gt;
&lt;br /&gt;
ou&lt;br /&gt;
&lt;br /&gt;
 ssh-copy-id -i ~/.ssh/id_ed25519.pub UTILISATEUR@SERVEUR&lt;br /&gt;
&lt;br /&gt;
''Note: le même paramètre &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;-i&amp;lt;/syntaxhighlight&amp;gt; peut être utilisé avec la commande &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;ssh&amp;lt;/syntaxhighlight&amp;gt; afin de spécifier la clé à utiliser si plusieurs sont présentes.''&lt;br /&gt;
&lt;br /&gt;
{{astuce|Pour [https://www.phcomp.co.uk/Tutorials/Unix-And-Linux/ssh-check-server-fingerprint.html vérifier l'empreinte] d'une clef, il faut utiliser la [https://linux.die.net/man/1/ssh-keygen commande] &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;ssh-keygen -lf /chemin/de/la/clef&amp;lt;/syntaxhighlight&amp;gt;. Le hachis résultant est à comparer avec celui de la clef qui est présenté lors de la première connexion à un serveur (les deux doivent bien sûr être identiques).}}&lt;br /&gt;
&lt;br /&gt;
==Restreindre l'usage d'une clef==&lt;br /&gt;
Il est possible de limiter le périmètre d'usage d'une clef ''SSH'' via quelques paramètres dans le fichier ''authorized_keys'' du client. Il est ainsi possible de permettre la connexion d'un client avec une clef spécifique seulement depuis une liste d'''IP'' tout en forçant une commande précise. Par exemple:&lt;br /&gt;
 vim ~/.ssh/authorized_keys&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
from=&amp;quot;192.168.1.4,192.168.1.10&amp;quot;,command=&amp;quot;ls -al --color /&amp;quot; ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKWbjAEe0X+NFr0WjEgdJ2vKAIYwYSW6WkJvP2Zg/M4q root@toto&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le client n'effectuera alors automatiquement la commande définie par le paramètre ''command'' avant que la connexion ne se ferme d'elle même. De plus, la clef ne sera utilisable que depuis les adresses ''IP'' listés.&lt;br /&gt;
&lt;br /&gt;
===Sources de la section===&lt;br /&gt;
* https://stackoverflow.com/questions/402615/how-to-restrict-ssh-users-to-a-predefined-set-of-commands-after-login&lt;br /&gt;
* https://www.linuxjournal.com/article/8257&lt;br /&gt;
* http://man.openbsd.org/OpenBSD-current/man5/sshd_config.5#ForceCommand&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Déactiver l'authentification par mot de passe==&lt;br /&gt;
Si nous voulons déactiver l'accès par mot de passe, il faut ajouter la ligne suivante au fichier '''/etc/ssh/sshd_config''':&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:#808080&amp;quot;&amp;gt;[...]&amp;lt;/span&amp;gt;&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
&lt;br /&gt;
Vous pouvez vous référer à la section traitant du fichier de configuration d{{'}}''OpenSSH'' [[#Fichier sshd_config|plus bas]].&lt;br /&gt;
&lt;br /&gt;
=Déactiver known hosts de SSH=&lt;br /&gt;
==Problème==&lt;br /&gt;
&lt;br /&gt;
Lors d'une exécution d'un script contenant du ''SSH'', et lorsque vous avez changé une de vos machines sur la quelle vous vous connectez, ssh demande une intervention humaine:&lt;br /&gt;
&lt;br /&gt;
 The authenticity of host '192.168.1.2 (192.168.1.2)' can't be established.&lt;br /&gt;
 ECDSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.&lt;br /&gt;
 Are you sure you want to continue connecting (yes/no)?&lt;br /&gt;
&lt;br /&gt;
Lorsque vous avez change l'ordinateur en gardant la même ''IP'' :&lt;br /&gt;
&lt;br /&gt;
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;br /&gt;
 @       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @&lt;br /&gt;
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;br /&gt;
 The RSA host key for foo-bar.net has changed,&lt;br /&gt;
 and the key for the corresponding IP address 127.0.0.1&lt;br /&gt;
 is unchanged. This could either mean that&lt;br /&gt;
 DNS SPOOFING is happening or the IP address for the host&lt;br /&gt;
 and its host key have changed at the same time.&lt;br /&gt;
 Offending key for IP in /home/user/.ssh/known_hosts:6&lt;br /&gt;
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;br /&gt;
 @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @&lt;br /&gt;
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&lt;br /&gt;
 IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette intervention est que le script n'avance pas sans vous.&lt;br /&gt;
Pour ma part, j'ai un script qui se lance lors d'une coupure électrique, sans mon intervention mon script qui permet l'extinction de mes machines virtuelles ne ce termine pas... c'est pas cool.&lt;br /&gt;
&lt;br /&gt;
==Résolution==&lt;br /&gt;
&lt;br /&gt;
Voici une solution que j'ai trouvé: il faut passer des paramètres a notre commande ''SSH'':&lt;br /&gt;
&lt;br /&gt;
 ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@192.168.1.2&lt;br /&gt;
&lt;br /&gt;
{{attention|Ceci désactive la vérification de la somme de contrôle des clés ''SSH''. Ne faîtes ceci que si vous savez ce que vous faîtes car cela rend votre connexion plus sensible à des attaques [https://fr.wikipedia.org/wiki/Attaque_de_l'homme_du_milieu man in the middle].}}&lt;br /&gt;
&lt;br /&gt;
=Séquences d'échappement=&lt;br /&gt;
Parfois lors de la perte d'une session ''SSH'' (problème de connexion ou bug coté serveur) le SHELL ne renvoi pas de ''broken pipe'', ce qui fait que l'on se retrouve avec un terminal bloqué (hyper casse couille) et la seule façon de s'en sortir est d'user de la commande &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;kill&amp;lt;/syntaxhighlight&amp;gt;. La seule ? Pas tout à fait.&lt;br /&gt;
&lt;br /&gt;
Il existe un truc qui déchire et qu'on ne trouve nul par (c'est toujours les meilleurs choses les mieux gardées) : les séquences d'échappement.&lt;br /&gt;
&lt;br /&gt;
Ces séquences permettent d'interagir avec le SHELL se trouvant en dessous de la session ''SSH'' via le client ''OpenSSH'' lui même. Ainsi, on peu demander à ce cher client de tuer lui même la session au lieu de devoir le faire à sa place quand rien ne va plus (sympa non ?).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
Voici la liste exhaustive de ces merveilles (à précéder par la touche &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;&amp;lt;Entrer&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;):&lt;br /&gt;
* '''~.''' : Termine la connexion (et toute les sessions multiplexées)&lt;br /&gt;
* '''~B''' : Envoi un ''BREAK'' au système distant&lt;br /&gt;
* '''~C''' : Ouvre un prompt ''ssh'' (la commande &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;?&amp;lt;/syntaxhighlight&amp;gt; permet de lister ce que l'on peut y faire)&lt;br /&gt;
* '''~R''' : Renégocie la clé de session (SSH version 2 uniquement)&lt;br /&gt;
* '''~V/v''' : Augmente/diminue le degré de verbosity (LogLevel)&lt;br /&gt;
* '''~^Z''' : Met ''SSH'' en pause&lt;br /&gt;
* '''~#''' : Liste toute les connexions redirigées&lt;br /&gt;
* '''~&amp;amp;''' : Quitte la session ''SSH'' sans la fermer. On ne peut pas revenir dessus, ça ne sert donc complètement à rien (je ne vois pas pourquoi quelqu'un à développer ça ?!)&lt;br /&gt;
*  '''~?''' : Écrit cette liste en anglais avec le vrai texte&lt;br /&gt;
* '''~~''' : Dans le cas ou le tild (''~'') entre en conflit avec quelque chose, il est possible de le taper 2 fois avant une séquence d'échappement pour l'envoyer.&lt;br /&gt;
&lt;br /&gt;
{{info|Ceci ne fonctionne que lorsque le SHELL ne nous donne pas la main. Vous pouvez tester sur une page de &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;man&amp;lt;/syntaxhighlight&amp;gt; pour tester par exemple.}}&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://askubuntu.com/questions/29942/how-can-i-break-out-of-ssh-when-it-locks&lt;br /&gt;
* https://lonesysadmin.net/2011/11/08/ssh-escape-sequences-aka-kill-dead-ssh-sessions/amp/&lt;br /&gt;
&lt;br /&gt;
=Absence de broken pipe après un redémarrage=&lt;br /&gt;
Sur une Debian 8 (Jessie), le fait de redémarrer une machine alors que l'on est connecté en ''SSH'' sur celle-ci ne renvoi pas de broken pipe (la session n'est pas clôturée à l'extinction). Ceci est très énervant car on se retrouve avec un terminal bloqué sur un prompt inactif et l'arrivé du fameux broken pipe se fait, dans le meilleur des cas, attendre une bonne minute, dans le pire, pour toujours... Pour régler cette merde il suffit d'installer la librairie systemd qui gère se comportement et de redémarrer la machine.&lt;br /&gt;
 apt install libpam-systemd&lt;br /&gt;
 reboot&lt;br /&gt;
&lt;br /&gt;
=Tunnel SSH=&lt;br /&gt;
Faire un tunnel ''SSH'' :&lt;br /&gt;
 ssh -L 5232:localhost:5232 root@192.168.180.32&lt;br /&gt;
* -L : Rediriger un flux TCP ou un socket UNIX sur le client local&lt;br /&gt;
* Format : ''&amp;lt;port local que l'on utilisera sur notre machine&amp;gt;''''':'''''&amp;lt;adresse de l'hôte distant&amp;gt;''''':'''''&amp;lt;port du service distant&amp;gt;''&lt;br /&gt;
Ceci mérite une explication pour être clair. Parfois, on installe un programme ([http://radicale.org Radicale] pour mon exemple) qui écoute exclusivement sur son localhost (127.0.0.1) via le port 5232. Quand le serveur n'a pas d'interface graphique (ce qui est normalement le cas si on est pas Windobien), on a pas de navigateur internet. Il peut être utile d'accéder quand même à l'interface d'admin du service (en fait on en a absolument besoin). Il faut donc rediriger le trafic du localhost de l'hôte distant sur notre machine pour l'administration. On prend donc le trafic localhost:5232 du serveur et on le balance sur le localhost:5232 de notre PC local d'admin.&lt;br /&gt;
&lt;br /&gt;
=Relai SSH=&lt;br /&gt;
Dans le cas d'une machine accessible seulement depuis une autre (cas d'un PC derrière un routeur ''NAT'' par exemple) embarquant un serveur ''SSH'', il est possible de l'utiliser comme ''Proxy SSH'' afin de joindre celle-ci. Ceci m'est utile pour administrer des machines virtuelles opérants dans un ''VLAN NATté'' par l'hyperviseur avec ma [[#Authentification_par_clef_SSH|clé SSH]]. Pour ce faire, depuis le client:&lt;br /&gt;
 ssh -J titi@relai toto@destination&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://tuxicoman.jesuislibre.net/2017/02/connexion-ssh-a-travers-un-ordinateur-relai-avec-proxyjump.html&lt;br /&gt;
&lt;br /&gt;
=SSH inversé=&lt;br /&gt;
Il est possible de se connecter au client ayant initié une session ''SSH'' via la création d'un socket spécifique. Cette technique se nomme le ''reverse SSH''. Cela peut-être utile dans le cas d'un dépannage ou pour transférer des fichiers à une machine ne disposant pas d'un accès publique à Internet (cas d'un ''NAT'' par exemple). Cette méthode permet alors la prise en main d'un client sans redirection de port au niveau de son accès ''WAN''.&lt;br /&gt;
&lt;br /&gt;
Depuis le client vers le dépanneur :&lt;br /&gt;
 ssh -NR 12345:localhost:22 utilisateur-dépanneur@ip-dépanneur&lt;br /&gt;
&lt;br /&gt;
Paramètres :&lt;br /&gt;
* -N : n'exécute ni aucune commande ni aucun shell. Cela permet de n'utiliser la session ''SSH'' que pour ouvrir un socket distant et non pour administrer la destination. Dans notre cas, la session sert juste à créer le socket sur lequel nous allons nous connecter&lt;br /&gt;
* -R : redirige le socket local vers le socket distant. C'est ce paramètre qui permettra au dépanneur de se connecter au client via un socket local créé pour l'occasion&lt;br /&gt;
* 12345:localhost:22 : socket-sur-dépanneur:adresse-d'écoute-du-socket:socket-à-rediriger-vers-12345&lt;br /&gt;
&lt;br /&gt;
Depuis le dépanneur vers le client en passant par le socket redirigé :&lt;br /&gt;
 ssh -p 12345 utilisateur-client@localhost&lt;br /&gt;
&lt;br /&gt;
Il est aussi possible d'y transférer des fichiers :&lt;br /&gt;
 scp -P 12345 /chemin/fichier/dépanneur utilisateur-client@localhost:/destination/fichier/pour/le/client&lt;br /&gt;
&lt;br /&gt;
==Source de la section==&lt;br /&gt;
* https://doc.ubuntu-fr.org/tutoriel/reverse_ssh#connexion_directe&lt;br /&gt;
&lt;br /&gt;
=Agent SSH=&lt;br /&gt;
Le serveur ''OpenSSH'' embarque un agent capable d'enregistrer le mot de passe de vos clés ''SSH''. Vous pouvez donc initier des connexion sans avoir à renseigner cette information à chaque fois.&lt;br /&gt;
&lt;br /&gt;
Initialiser l'agent pour le [[Shell bash|shell]] courant&lt;br /&gt;
 eval &amp;quot;$(ssh-agent -s)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Enregistrer le mot de passe de votre clé&lt;br /&gt;
 ssh-add /root/.ssh/id_ed25519&lt;br /&gt;
&lt;br /&gt;
{{Info|Utilisée sans argument, la commande &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;ssh-add&amp;lt;/syntaxhighlight&amp;gt; va chercher les clés dans le répertoire personnel de votre utilisateur local courant.}}&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://rabexc.org/posts/using-ssh-agent&lt;br /&gt;
* https://mytrashcode.com/open-connection-authentication-agent&lt;br /&gt;
&lt;br /&gt;
=Fichier sshd_config=&lt;br /&gt;
Voici quelques paramètres qu'il peut être utile d'appliquer sur un serveur ''SSH'' (&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;/etc/ssh/sshd_config&amp;lt;/syntaxhighlight&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
==Généralités==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
PasswordAuthentication no&lt;br /&gt;
&lt;br /&gt;
AllowUsers toto sauvegardes&lt;br /&gt;
ClientAliveInterval 1800&lt;br /&gt;
&lt;br /&gt;
UseDNS no&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Description des paramètres :&lt;br /&gt;
* '''PermitRootLogin''' : ''{no|yes|prohibit-password}'': définit si l'utilisateur ''root'' peut se connecter. La directive '''prohibit-password''' permet de n'autoriser que l'utilisation de [[#Authentification par clef SSH|clés SSH]] avec ce dernier&lt;br /&gt;
* '''PasswordAuthentication''' : ''{no|yes}'': définit si la connexion par mot de passe est autorisé pour tous les utilisateurs (''root'' à part) ou si seulement les clés SSH sont permises&lt;br /&gt;
* '''AllowUsers''' : liste blanche des utilisateurs autorisés à ce connecter&lt;br /&gt;
* '''ClientAliveInterval''' : si le paramètre est définit, ''OpenSSH'' compte le temps (en secondes) depuis le dernier paquet reçu du client et envoi une demande de réponse à celui-ci. Couplé au paramètre '''ClientAliveCountMax''' (valeur par défaut à ''3''), le serveur fermera automatiquement la session en cas de non réponse prolongée de ce dernier (nombre de fois compté depuis la dernière réponse). Ceci n'est utile que si la connexion entre les deux paires est interrompu (plus de réseau)&lt;br /&gt;
* '''UseDNS''' : ''{no|yes}'' : définit si ''OpenSSH'' doit résoudre les noms de domaine. Ce paramètre, non content d'être inutile, ralenti CONSIDÉRABLEMENT l'établissement de la connexion dans le cas ou le serveur DNS est injoignable (fréquent dans des LAB de tests)&lt;br /&gt;
&lt;br /&gt;
==Chiffrement==&lt;br /&gt;
N'utiliser que des [https://cipherli.st/ chiffrements sérieux] :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256&lt;br /&gt;
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr&lt;br /&gt;
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je vous conseil également d'utiliser que des clés ''RSA'' et ''ed25519'' en commentant les lignes &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;HostKey /etc/ssh/ssh_host_dsa_key&amp;lt;/syntaxhighlight&amp;gt; et &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;HostKey /etc/ssh/ssh_host_ecdsa_key&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Vérifiez également que la version de ''SSH'' utilisée est la 2 via le paramètre &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;Protocol 2&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
N'oubliez pas de recharger le service :&lt;br /&gt;
 systemctl reload ssh&lt;br /&gt;
&lt;br /&gt;
=Fichier ssh_config=&lt;br /&gt;
Le client ''SSH'' peut aussi être configuré par utilisateur du système. Il sera alors possible de définir des paramètres personnalisés en fonction de celui se connectant à une machine. Le fichier est ) créer dans le répertoire personnel de chaque utilisateur le nécessitant (&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; inline&amp;gt;~/.ssh/config&amp;lt;/syntaxhighlight&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Pour utiliser une clé spécifique pour la connexion à une machine :&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Host nomMachine&lt;br /&gt;
	Hostname	fc00:0:0:1::2&lt;br /&gt;
	User		root&lt;br /&gt;
	Port		22&lt;br /&gt;
	IdentityFile	~/.ssh/id_ed25519-sauv&lt;br /&gt;
	IdentitiesOnly	yes&lt;br /&gt;
	IgnoreUnknown	UseKeychain,AddKeysToAgent&lt;br /&gt;
	AddKeysToAgent	yes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Description des paramètres :&lt;br /&gt;
* '''Host nomMachine''' : Ouvre une section concernant un hôte en particulier. La valeur ''nomMachine'' vient créer un nom d'hôte utilisable par ''OpenSSH'' au même titre que si l'on avait rentré une ligne dans le fichier ''hosts''&lt;br /&gt;
* '''Hostname''' : adresse de la machine distante&lt;br /&gt;
* '''User''' : utilisateur de la machine distante&lt;br /&gt;
* '''Port''' : port ''SSH'' de la machine distante&lt;br /&gt;
* '''IdentityFile''' : clé ''SSH'' à utiliser (par défaut, seul les noms de clés par défaut sont recherchés)&lt;br /&gt;
* '''IdentitiesOnly''' : n'utilise que la clé spécifiée dans le paramètre précédent. Si omis, le client ''SSH'' va tester une connexion distante avec toute les clés qu'il trouvera (occasionnant autant d'échec de connexion sur la machine distante)&lt;br /&gt;
* '''IgnoreUnknown''' : permet d'ignorer les paramètres inexistants. Les deux valeurs sont des paramètres faisant la même chose mais sur deux systèmes différents. La première est pour MacOSX et la deuxième pour Linux. Cela permet de faire des copier/coller de configuration sans réfléchir&lt;br /&gt;
* '''AddKeysToAgent''' : si la clé ''SSH'' utilisée contient une phrase de passe, elle ne sera demandée que la première fois et stockée dans l'agent ''SSH''&lt;br /&gt;
&lt;br /&gt;
==Sources de la section==&lt;br /&gt;
* https://www.man7.org/linux/man-pages/man5/ssh_config.5.html&lt;br /&gt;
* https://computingforgeeks.com/managing-ssh-connections-on-linux-unix-using-ssh-config-file/&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
	<entry>
		<id>https://doc.lesmorin.fr/index.php?title=Busybox_init&amp;diff=1489</id>
		<title>Busybox init</title>
		<link rel="alternate" type="text/html" href="https://doc.lesmorin.fr/index.php?title=Busybox_init&amp;diff=1489"/>
		<updated>2023-11-02T10:41:31Z</updated>

		<summary type="html">&lt;p&gt;Ycharbi : Suppression d'un &amp;quot;cd ~&amp;quot; inutile + ajout de la commande permettant d'installer Qemu sans tout le bordel associé afin de réaliser les tests + ajout du code source de linux dans nos fichiers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:distributions_linux]]&lt;br /&gt;
&lt;br /&gt;
[[Busybox]] intègre &amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt;, un programme pouvant être amorcé directement par un noyau ''Linux'' au démarrage d'une machine. Il est ainsi possible de concevoir un système d'exploitation léger composé uniquement d'un noyau et de ''Busybox''. L'adjonction d'outils supplémentaires sur cette base minimaliste pourra engendrer une distribution spécifiquement conçue pour un besoin particulier. Cette association s’avère donc particulièrement intéressante dans des systèmes embarqués tel que les ''appliances'' réseau comme [https://openwrt.org/ OpenWRT] ou [https://dd-wrt.com/ DD-WRT].&lt;br /&gt;
&lt;br /&gt;
Nous verrons comment construire un tel système en partant des sources de chaque programmes depuis une ''GNU/Linux Debian 12 Bookworm''. Les compilations se feront avec l'ensemble des paramètres par défaut. Je recommande d'utiliser une machine (virtuelle ''amd64'' dans mon cas) spécifiquement installée pour cet usage car un grand nombre de dépendances est nécessaire et il serait dommage de pourrir votre environnement de travail...&lt;br /&gt;
&lt;br /&gt;
L'espace de travail sera le répertoire personnel de l'utilisateur ''root''.&lt;br /&gt;
&lt;br /&gt;
=Linux=&lt;br /&gt;
Installation des dépendances&lt;br /&gt;
 apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev libelf-dev libssl-dev libncurses-dev dwarves&lt;br /&gt;
&lt;br /&gt;
Téléchargement des sources du dernier noyau stable (01/11/2023)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Code source&lt;br /&gt;
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz -P ~&lt;br /&gt;
# Signature GPG&lt;br /&gt;
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.sign -P ~&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note : le code source est également disponible dans [https://{{SERVERNAME}}/fichiers/système/noyaux/linux/linux-6.6.tar.xz nos fichiers].&lt;br /&gt;
&lt;br /&gt;
Décompression de l'archive des sources&lt;br /&gt;
 unxz -k ~/linux-6.6.tar.xz&lt;br /&gt;
&lt;br /&gt;
Vérification de la signature GPG de l'archive&lt;br /&gt;
 apt install gnupg2&lt;br /&gt;
 gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org&lt;br /&gt;
 gpg2 --tofu-policy good 38DBBDC86092693E&lt;br /&gt;
 gpg2 --tofu-policy good 79BE3E4300411886&lt;br /&gt;
 gpg2 --trust-model tofu --verify ~/linux-6.6.tar.sign&lt;br /&gt;
&lt;br /&gt;
Note : la dernière commande doit vous renvoyer plusieurs lignes de résultat dont &amp;lt;code&amp;gt;gpg: Bonne signature de « Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt; » [totale]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Désarchivage des sources&lt;br /&gt;
 tar xvf ~/linux-6.6.tar&lt;br /&gt;
 cd ~/linux-6.6/&lt;br /&gt;
&lt;br /&gt;
Création d'une configuration de confection saine avec les paramètres par défaut et compilation avec 4 cœurs de processeur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
make defconfig&lt;br /&gt;
make -j4&lt;br /&gt;
# Retour dans le répertoire personnel&lt;br /&gt;
cd ~&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le noyau compilé pour notre architecture x86 64bits se trouve à l'emplacement suivant : &amp;lt;code&amp;gt;~/linux-6.6/arch/x86/boot/bzImage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Busybox=&lt;br /&gt;
Téléchargement des sources&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2&lt;br /&gt;
wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2.sha256&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vérification d'intégrité&lt;br /&gt;
 sha256sum -c ~/busybox-1.36.1.tar.bz2.sha256&lt;br /&gt;
&lt;br /&gt;
Note : la vérification d'intégrité doit renvoyer &amp;lt;code&amp;gt;Réussi&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Extraction de l'archive compressée&lt;br /&gt;
 tar xvf ~/busybox-1.36.1.tar.bz2&lt;br /&gt;
 cd ~/busybox-1.36.1/&lt;br /&gt;
&lt;br /&gt;
Configuration par défaut et compilation du code avec lien statique afin d'embarquer les dépendances dans le binaire final&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
make defconfig&lt;br /&gt;
make -j4 LDFLAGS=&amp;quot;--static&amp;quot;&lt;br /&gt;
# Retour dans le répertoire personnel&lt;br /&gt;
cd ~&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Busybox'' est désormais disponible ici : &amp;lt;code&amp;gt;~/busybox-1.36.1/busybox&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Média d'amorce=&lt;br /&gt;
Nous avons dés à présent en notre possession tous les programmes de notre future système d'exploitation. Vous pouvez préparer les vôtres en vue de les intégrer dans les sections qui suivent.&lt;br /&gt;
&lt;br /&gt;
Les méthodes d'amorçages peuvent varier selon les besoins et votre convenance. Je répertorie personnellement 3 cas d'usage :&lt;br /&gt;
# mémoire morte avec système de fichier classique type ''EXT4''&lt;br /&gt;
# [https://fr.wikipedia.org/wiki/Initrd initramfs]&lt;br /&gt;
# ''PXE''&lt;br /&gt;
&lt;br /&gt;
Toute les démonstrations seront réalisées via [[Qemu]]. La mise en œuvre du réseau ne sera pas détaillée car j'utilise des scripts personnalisés avec mon système. La création d'une interface ''tap'' et son exploitation via la directive &amp;lt;code&amp;gt;-device virtio-net-pci,netdev=network0,mac=$tap_mac -netdev tap,id=network0,ifname=$int_tap,script=no,downscript=no&amp;lt;/code&amp;gt; permet de lier la machine virtuel au réseau physique via l'adjonction d'un pont réseau.&lt;br /&gt;
&lt;br /&gt;
L'étape &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; fera office de tronc commun aux autres sections afin de ne pas alourdir le document avec une redondance inutile et difficilement maintenable. Seule celle-ci nécessite l'utilisation d'un périphérique de type bloc, les deux autres peuvent êtres réalisées directement dans &amp;lt;code&amp;gt;~/rootfs&amp;lt;/code&amp;gt; si vous le désirez. La réalisation successive des trois étapes est toutefois possible. Il faudra simplement penser à remonter &amp;lt;code&amp;gt;~/rootfs&amp;lt;/code&amp;gt; afin de ne pas travailler dans un répertoire vide...&lt;br /&gt;
&lt;br /&gt;
==1. Amorçage en mémoire morte==&lt;br /&gt;
Cette façon de faire permet de modifier simplement le contenu de votre distribution après coup. Il suffit pour se faire de monter le système de fichier en écriture pour y actualiser son contenu à votre guise.&lt;br /&gt;
&lt;br /&gt;
Pour l'exemple, je créerai un fichier simulant un périphérique de type bloc du nom de &amp;lt;code&amp;gt;busybox.dd&amp;lt;/code&amp;gt; au même titre qu'une mémoire morte. En condition réelle, remplacez celui-ci par votre périphérique physique : &amp;lt;code&amp;gt;/dev/sda&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;/dev/mmcblk&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;/dev/nvme0n1&amp;lt;/code&amp;gt;...&lt;br /&gt;
&lt;br /&gt;
Création et formatage de la mémoire racine&lt;br /&gt;
 dd if=/dev/zero of=~/busybox.dd bs=1M count=1024&lt;br /&gt;
 mkfs.ext4 ~/busybox.dd&lt;br /&gt;
&lt;br /&gt;
Création et montage de l'environnement de travail&lt;br /&gt;
 mkdir -p ~/rootfs&lt;br /&gt;
 mount ~/busybox.dd ~/rootfs&lt;br /&gt;
 cd ~/busybox-1.36.1/&lt;br /&gt;
&lt;br /&gt;
Installation de l'arborescence du système ''Busybox'' dans notre système de fichiers avec [https://stackoverflow.com/questions/49369508/kernel-panic-not-syncing-requested-init-linuxrc-failed-error-2 lien statiques]&lt;br /&gt;
 make install CONFIG_PREFIX=../rootfs LDFLAGS=&amp;quot;--static&amp;quot;&lt;br /&gt;
 cd ~&lt;br /&gt;
&lt;br /&gt;
Cette étape a créée les répertoires standards permettant d’accueillir les binaires usuels du système selon la [https://fr.wikipedia.org/wiki/Filesystem_Hierarchy_Standard Filesystem Hierarchy Standard] (''FHS''). L'exécutable &amp;lt;code&amp;gt;busybox&amp;lt;/code&amp;gt; précédemment compilé a été copié dans le nouveau &amp;lt;code&amp;gt;/bin&amp;lt;/code&amp;gt; et des liens symboliques ont étés créés pointant vers celui-ci avec le nom de tous les utilitaires qu'il contient.&lt;br /&gt;
&lt;br /&gt;
Création des points montages des pseudos systèmes de fichiers usuels, de la table de montages statiques et du répertoire accueillant notre futur script d'initialisation&lt;br /&gt;
 mkdir -p ~/rootfs/proc ~/rootfs/sys ~/rootfs/dev&lt;br /&gt;
 mkdir -p ~/rootfs/etc&lt;br /&gt;
 touch ~/rootfs/etc/fstab&lt;br /&gt;
 mkdir -p ~/rootfs/etc/init.d&lt;br /&gt;
&lt;br /&gt;
Script d'initialisation du système&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash -c &amp;quot;cat &amp;gt; ~/rootfs/etc/init.d/rcS&amp;quot; &amp;lt;&amp;lt; _EOF_&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
# Message d'accueil&lt;br /&gt;
echo &amp;quot;Busybox ycharbi.fr&amp;quot;&lt;br /&gt;
# Pseudos systèmes de fichiers usuels&lt;br /&gt;
mount -t proc proc /proc&lt;br /&gt;
mount -t sysfs sysfs /sys&lt;br /&gt;
mount -t devtmpfs none /dev&lt;br /&gt;
&lt;br /&gt;
# Configuration réseau&lt;br /&gt;
ip addr add 10.0.0.1/24 dev eth0&lt;br /&gt;
ip link set dev eth0 up&lt;br /&gt;
ip route add default via 10.0.0.254 dev eth0&lt;br /&gt;
&lt;br /&gt;
# Clavier en AZERTY&lt;br /&gt;
loadkmap &amp;lt; /etc/fr.map&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Attribution du droit d'exécution au script d'initialisation&lt;br /&gt;
 chmod +x ~/rootfs/etc/init.d/rcS&lt;br /&gt;
&lt;br /&gt;
Configuration des Télétypes (''TTY'')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bash -c &amp;quot;cat &amp;gt; ~/rootfs/etc/inittab&amp;quot; &amp;lt;&amp;lt; _EOF_&lt;br /&gt;
::sysinit:/etc/init.d/rcS&lt;br /&gt;
ttyS0::respawn:/bin/sh&lt;br /&gt;
tty2::askfirst:-/bin/sh&lt;br /&gt;
tty3::askfirst:-/bin/sh&lt;br /&gt;
tty4::askfirst:-/bin/sh&lt;br /&gt;
tty4::respawn:/sbin/getty 38400 tty5&lt;br /&gt;
tty5::respawn:/sbin/getty 38400 tty6&lt;br /&gt;
::ctrlaltdel:/sbin/reboot&lt;br /&gt;
::shutdown:/sbin/swapoff -a&lt;br /&gt;
::shutdown:/bin/umount -a -r&lt;br /&gt;
::restart:/sbin/init&lt;br /&gt;
_EOF_&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce fichier définit les ''TTY'' qui doivent êtres invoqués au lancement de &amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt;. Vous devrez probablement adapter ceci à votre besoin. La documentation de ces lignes ainsi que de la configuration appliquée par défaut en cas d'absence du fichier est disponible dans &amp;lt;code&amp;gt;~/busybox-1.36.1/examples/inittab&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Création du binaire de traduction clavier afin d'utiliser l{{'}}''AZERTY''&lt;br /&gt;
 busybox dumpkmap &amp;gt; ~/rootfs/etc/fr.map&lt;br /&gt;
&lt;br /&gt;
À ce stade, notre mémoire morte est prête.&lt;br /&gt;
&lt;br /&gt;
Pour permettre son amorçage, un éventail de possibilités s'offre à vous : [[Grub]]; [[Systemd-boot]]; [[Efibootmgr#Création_d'une_entrée_de_type_STUB|UEFI stub]]; [[Ipxe]]; [[Installation_slax_-_UEFI_64bits#Préparation_de_l'environnement_hôte|Syslinux]]... Pour ma part et comme précisé en introduction, j'utiliserai [[Qemu#Démarrage_de_la_machine_virtuelle|Qemu]] afin de simplifier au maximum l'exposé.&lt;br /&gt;
&lt;br /&gt;
Démontage du système de fichier&lt;br /&gt;
 umount ~/rootfs&lt;br /&gt;
&lt;br /&gt;
Note : si vous comptez poursuivre les étapes des sections suivantes, pensez à remonter ce système de fichier ou à en copier le contenu dans un autre répertoire de travail afin de ne pas recommencer à zéro.&lt;br /&gt;
&lt;br /&gt;
Test du système avec ''Qemu'' (&amp;lt;code&amp;gt;apt install --no-install-recommends qemu-system-x86&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 \&lt;br /&gt;
--enable-kvm \&lt;br /&gt;
-m 2048 \&lt;br /&gt;
-device virtio-balloon \&lt;br /&gt;
-kernel ~/linux-6.6/arch/x86/boot/bzImage \&lt;br /&gt;
-append &amp;quot;ro root=/dev/sda console=ttyS0 quiet&amp;quot; \&lt;br /&gt;
-cpu host -smp cores=2,threads=1,sockets=1 \&lt;br /&gt;
-serial mon:stdio \&lt;br /&gt;
-drive id=disk,file=&amp;quot;${HOME}&amp;quot;/busybox.dd,format=raw,if=none \&lt;br /&gt;
-device ahci,id=ahci \&lt;br /&gt;
-device ide-hd,drive=disk,bus=ahci.0 \&lt;br /&gt;
-display none&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour un affichage sans port console, il faut supprimer le paramètre &amp;lt;code&amp;gt;console=ttyS0&amp;lt;/code&amp;gt; de la directive &amp;lt;code&amp;gt;-append&amp;lt;/code&amp;gt;; supprimer la directive &amp;lt;code&amp;gt;-display none&amp;lt;/code&amp;gt; et remplacer la ligne &amp;lt;code&amp;gt;ttyS0::respawn:/bin/sh&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;tty1::respawn:/bin/sh&amp;lt;/code&amp;gt; dans le &amp;lt;code&amp;gt;inittab&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==2. Amorçage en initramfs==&lt;br /&gt;
L'utilisation d'un système de fichiers initial en mémoire à accès aléatoire apporte encore plus de légèreté à la solution. Un unique fichier compressé vient s'ajouter au noyau en cours d'exécution pour servir la racine construite précédemment. Le système est exécuté intégralement en mémoire vive et peut donc se voir distribué via des protocoles réseaux tel que ''TFTP'' ou ''HTTP''.&lt;br /&gt;
&lt;br /&gt;
Construction de l'archive compressée ''Initramfs''&lt;br /&gt;
 cd ~/rootfs &amp;amp;&amp;amp; find . -print0 | cpio --null -ov --format=newc | gzip -9 &amp;gt; ../initramfs.cpio.gz &amp;amp;&amp;amp; cd ~&lt;br /&gt;
&lt;br /&gt;
Test du système avec ''Qemu''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 \&lt;br /&gt;
--enable-kvm \&lt;br /&gt;
-m 2048 \&lt;br /&gt;
-device virtio-balloon \&lt;br /&gt;
-kernel ~/linux-6.6/arch/x86/boot/bzImage \&lt;br /&gt;
-append &amp;quot;ro rootfstype=ramfs rdinit=/sbin/init console=ttyS0 quiet&amp;quot; \&lt;br /&gt;
-initrd ~/initramfs.cpio.gz \&lt;br /&gt;
-cpu host -smp cores=2,threads=1,sockets=1 \&lt;br /&gt;
-serial mon:stdio \&lt;br /&gt;
-display none&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les différences de lancement sont :&lt;br /&gt;
* modification des paramètres noyau ([https://www.man7.org/linux/man-pages/man7/kernel-command-line.7.html cmdline]) de la directive &amp;lt;code&amp;gt;-append&amp;lt;/code&amp;gt;&lt;br /&gt;
* ajout de la directive &amp;lt;code&amp;gt;-initrd&amp;lt;/code&amp;gt;&lt;br /&gt;
* les directives concernant le disque ''SATA'' ont étés supprimées&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3. Amorçage initramfs via PXE==&lt;br /&gt;
Cette méthode d'amorçage ne varie pas beaucoup de la précédente puisque elle réutilise les mêmes éléments à savoir le noyau et l{{'}}''Initramfs''. Le delta sera sur la syntaxe du chargeur d'amorçage réseau utilisé ainsi que quelques paramètres passés au noyau. Voici la section fonctionnelle pour [[Ipxe]] :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!ipxe&lt;br /&gt;
&lt;br /&gt;
set menu-timeout 10000&lt;br /&gt;
set submenu-timeout ${menu-timeout}&lt;br /&gt;
isset ${menu-defaut} || set menu-defaut Debian_Buster&lt;br /&gt;
set serveur_ip 10.0.0.100&lt;br /&gt;
&lt;br /&gt;
menu&lt;br /&gt;
item --gap --           -------------DEMARRAGE EN RAM----------------&lt;br /&gt;
item busybox			Lancer Busybox&lt;br /&gt;
&lt;br /&gt;
choose --timeout ${menu-timeout} --default ${menu-default} target &amp;amp;&amp;amp; goto ${target}&lt;br /&gt;
&lt;br /&gt;
:busybox&lt;br /&gt;
kernel http://${serveur_ip}/systemes/noyaux/busybox/bzImage ro initrd=initramfs.cpio.gz rootfstype=ramfs rdinit=/sbin/init console=ttyS0&lt;br /&gt;
initrd http://${serveur_ip}/systemes/noyaux/busybox/initramfs.cpio.gz&lt;br /&gt;
boot&lt;br /&gt;
# https://ipxe.org/cmd/kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* https://dev.to/donaldsebleung/hello-embedded-world-booting-a-minimal-linux-with-busybox-on-risc-v-from-source-2ne9&lt;br /&gt;
* https://cs4118.github.io/dev-guides/debian-kernel-compilation.html&lt;br /&gt;
* ''POSIX Base Specifications Issue 7'' :&lt;br /&gt;
** https://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html&lt;br /&gt;
** Paramètres du shell Sh : https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
</feed>