<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Projet &#8211; erwan.guillemard</title>
	<atom:link href="https://erwanguillemard.com/tag/projet/feed/" rel="self" type="application/rss+xml" />
	<link>https://erwanguillemard.com</link>
	<description>Blog personnel</description>
	<lastBuildDate>Sat, 11 Apr 2026 13:55:29 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://erwanguillemard.com/wp-content/uploads/2024/02/cropped-Logo-sans-baseline-32x32.png</url>
	<title>Projet &#8211; erwan.guillemard</title>
	<link>https://erwanguillemard.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PROJET &#8211; Linux Partitions Calculator</title>
		<link>https://erwanguillemard.com/projet-linux-partitions-calculator/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Sat, 11 Apr 2026 13:55:29 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[Projet]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=3409</guid>

					<description><![CDATA[Je ne pensais pas en venir un jour à rédiger un article sur cette thématique. Pourtant force est de constater que je me suis fait encore une fois ch*er la bi*e (passez-moi l&#8217;expression) à déployer une machine linux. Je rassure le lecteur qui s&#8217;est égaré ici, ce billet va être simple. Bref, j&#8217;ai la problématique...]]></description>
										<content:encoded><![CDATA[
<p>Je ne pensais pas en venir un jour à rédiger un article sur cette thématique. Pourtant force est de constater que je me suis fait encore une fois ch*er la bi*e (passez-moi l&rsquo;expression) à déployer une machine linux.</p>



<p>Je rassure le lecteur qui s&rsquo;est égaré ici, ce billet va être simple.</p>



<p>Bref, j&rsquo;ai la problématique suivante, lorsque je déploie une nouvelle machine Linux (RHEL<sup data-fn="d0cf7aef-1d32-469c-80aa-165e012513eb" class="fn"><a href="#d0cf7aef-1d32-469c-80aa-165e012513eb" id="d0cf7aef-1d32-469c-80aa-165e012513eb-link">1</a></sup> ou Debian) je suis le guide d&rsquo;hygiène et sécurité de l&rsquo;ANSSI<sup data-fn="0a4dc23e-e493-4f49-8cdf-9a361464e536" class="fn"><a href="#0a4dc23e-e493-4f49-8cdf-9a361464e536" id="0a4dc23e-e493-4f49-8cdf-9a361464e536-link">2</a></sup>. Ce qui se traduit par le partitionnement strict des points de montage système et de données. Sauf que lorsque la taille de notre disque varie, difficile de définir de tête quelle volumétrie doit être provisionnée pour chaque partition&#8230;</p>



<p>C&rsquo;est donc là que j&rsquo;ai pris un coup de sang.</p>



<p class="has-text-align-center">En voiture Simone, c&rsquo;est parti !</p>





<h2 class="wp-block-heading">Avant-Propos</h2>



<p>Je ne vais pas rentrer dans le détail du code qui compose mon application, ce n&rsquo;est pas l&rsquo;objectif. Si l&rsquo;on souhaite comprendre ce dernier, un peu de réverse engineering et le tour est joué (surtout que j&rsquo;ai commenté le code).</p>



<p>Je n&rsquo;aborderai pas non plus la partie de durcissement des systèmes GNU Linux. Pourquoi ?</p>



<ol class="wp-block-list">
<li>Ce n&rsquo;est pas le sujet de ce billet</li>



<li>Je traite le sujet dans un de mes premiers articles que je ne partage que sur contact et échange</li>



<li>Je pars du principe que cela sera fait après déploiement du SE<sup data-fn="7c312e03-317c-474a-ab3e-448ddb4d3df3" class="fn"><a href="#7c312e03-317c-474a-ab3e-448ddb4d3df3" id="7c312e03-317c-474a-ab3e-448ddb4d3df3-link">3</a></sup>.</li>
</ol>



<p>L&rsquo;objectif est vraiment de comprendre ou du moins rappeler la structure d&rsquo;un système GNU quant à son arborescence d&rsquo;organisation de fichier. Et donc outre à mesure à comprendre pourquoi nous devons allouer plus ou moins d&rsquo;espace de stockage.</p>



<p>Concernant l&rsquo;application que j&rsquo;ai développé, bien que je revienne sur ce point plus bas dans ce billet, cette dernière n&rsquo;est pas fonctionnelle sur les environnements GNU Linux du fait de la GUI<sup data-fn="957eb17c-7564-49a4-beda-d11cd897f8a8" class="fn"><a href="#957eb17c-7564-49a4-beda-d11cd897f8a8" id="957eb17c-7564-49a4-beda-d11cd897f8a8-link">4</a></sup>.</p>



<p>Il est également important de souligné que cette application n&rsquo;est compatible qu&rsquo;avec la version 5.X de powershell. </p>



<h2 class="wp-block-heading">Prérequis</h2>



<ul class="wp-block-list">
<li><strong>SE :</strong>&nbsp;Environnement Windows non obsolète</li>



<li><strong>Apps :&nbsp;</strong>Non Applicable</li>



<li><strong>Autres :</strong>
<ul class="wp-block-list">
<li>PowerShell version 5.X</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Théorie</h2>



<p>Si nous devons commencer par la base, il serait bon de se poser la question </p>



<p class="has-text-align-center"><strong>« Comment est structurer un environnement GNU Linux ? »</strong></p>



<p class="has-text-align-left">Contrairement à certaines connaissances que j&rsquo;ai pu fréquenter, oui c&rsquo;est un point important. Cela évite de faire n&rsquo;importe quoi et dans une outre mesure d&rsquo;apprendre quelques choses. (Toutes ressemblances avec des personnes existantes et purement fortuite).</p>



<p class="has-text-align-center"><strong>T&rsquo;es un peu chafouin en ce moment non ? Tu ne voudrais pas ton petit suppositoire à la verveine ?</strong></p>



<p class="has-text-align-left">Légèrement agacé avec une pointe de colère et donc de sarcasme il est vrai. L&rsquo;hypocrisie des uns fait le désespoir des autres. Mais OKLM comme disent les d&rsquo;jeuns je prends un sacré recul. Cependant, je suis partant pour la verveine mais pas en suppositoire, plus en pousse café 🙂 <a href="https://www.youtube.com/watch?v=s_aka1i0RD0&amp;list=RDs_aka1i0RD0&amp;start_radio=1">Et puis Monsieur, Madame, Mademoiselle, je suis bien fatigué&#8230; J&rsquo;en ai marre&#8230;</a></p>



<p>Regardons alors de plus près l&rsquo;architecture n à n-1.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="546" height="570" src="https://erwanguillemard.com/wp-content/uploads/2026/02/PP_005_001_arch.jpg" alt="" class="wp-image-3416" style="width:307px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/02/PP_005_001_arch.jpg 546w, https://erwanguillemard.com/wp-content/uploads/2026/02/PP_005_001_arch-287x300.jpg 287w" sizes="(max-width: 546px) 100vw, 546px" /></figure>
</div>


<p>(Pas de panique je vais prendre le temps de décrire chaque répertoire).</p>



<p>Nous avons le répertoire parent de notre arborescence, communément appelé « la Racine » (et non rien à voir avec l&rsquo;organisation de l&rsquo;ombre de Konoha dans Naruto [super référence&#8230;]) ou <strong>root</strong>. C&rsquo;est sous ce répertoire <strong>/</strong> que nous allons retrouver les répertoires qui organise notre SE.</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3409_97e24c-b7 kt-accordion-has-14-panes kt-active-pane-0 kt-accordion-block kt-pane-header-alignment-left kt-accodion-icon-style-basic kt-accodion-icon-side-right" style="max-width:none"><div class="kt-accordion-inner-wrap" data-allow-multiple-open="false" data-start-open="none">
<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-1 kt-pane3409_1e6061-7a"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>/bin</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Ce répertoire est l&rsquo;abréviation de <strong>binaries</strong>. Il est essentiel au bon fonctionnement du système puisque ce dernier va contenir l&rsquo;ensemble des commandes exécutables de bases.</p>



<p>C&rsquo;est ici que nous retrouvons les programmes nécessaires au mode de restauration ainsi qu&rsquo;au démarrage du système. C&rsquo;est je pense l&rsquo;un des répertoire les plus important du système.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3409_4a9c15-d7"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>/boot</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Ce répertoire est réservé au rangement des chaussures afin d&rsquo;utiliser nos sockets&#8230; Ok je sors.</p>



<p>Plus sérieusement, ce répertoire contient tout ce qui est nécessaire au démarrage du système. </p>



<p class="has-text-align-center"><strong>Pas de /boot ? Pas de démarrage&#8230;</strong></p>



<p class="has-text-align-left">Ce dernier contient le kernel (noyau Linux), les fichiers d&rsquo;amorçage (bootloader pour ne pas dire GRUB<sup data-fn="6b4eeabd-5566-437e-ab1d-1980ef7ba3d1" class="fn"><a href="#6b4eeabd-5566-437e-ab1d-1980ef7ba3d1" id="6b4eeabd-5566-437e-ab1d-1980ef7ba3d1-link">5</a></sup> dans la majorité des cas) ainsi que l&rsquo;initramfs ou initrd (cela dépend) qui est notre « petit » système d&rsquo;exploitation temporaire. Il va sans dire que ce dernier est critique&#8230;</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane3409_cb4761-85"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>/dev</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Ce répertoire est l&rsquo;abréviation de <strong>devices</strong>. C&rsquo;est dans ce répertoire que nous allons retrouver l&rsquo;ensemble des fichiers spéciaux représentant les périphériques systèmes. </p>



<p class="has-text-align-center">Si nous avions des doutes, sous Linux, <strong><em>Tout est fichiers</em></strong>.</p>



<p class="has-text-align-left">Bref, c&rsquo;est ici que nous allons interagir avec nos médias de stockage, les périphériques tels que caméra, micro, audio etc&#8230; C&rsquo;est notre noyau qui gère son contenu.</p>



<p>Ce n&rsquo;est ni plus ni moins que l&rsquo;interface entre notre système logique et notre système physique pour ne pas dire matériel.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane3409_def777-a5"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>/etc</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>/etc, l&rsquo;un des dossiers les plus importants&#8230; C&rsquo;est dans ce dernier que nous allons retrouver l&rsquo;ensemble des fichiers de configuration du système. Il me semble de jadis ce que j&rsquo;ai écrit dans mes cours de licence (merci M. HSU) que c&rsquo;est l&rsquo;abréviation de <strong>et cetera</strong> (c&rsquo;était pour la minute <a href="https://www.youtube.com/watch?v=nWdUojwhJVo">Père castor</a>)</p>



<ul class="wp-block-list">
<li>Configurations globales du système</li>



<li>Paramètres de sécurité</li>



<li>Informations sur les utilisateurs</li>



<li>Configuration réseau</li>



<li>Configuration des services</li>
</ul>



<p>Généralement, la modification des fichiers nécessite les droits d&rsquo;administrations. Il est généralement conseillé avant toutes altérations de faire une copie du fichier d&rsquo;origine 🙂</p>



<p class="has-text-align-center">Généralement on se fait avoir une fois pas deux <strong>#bisous</strong></p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-5 kt-pane3409_11bf63-4a"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>/home</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p class="has-text-align-center"><a href="https://www.youtube.com/watch?v=6FLXqkL9MPM">E.T phone&#8230; HHHHH-OOOOOOOMMMMM-EEE&#8230;</a></p>



<p>C&rsquo;est le répertoire utilisateur. C&rsquo;est dans ce dernier que les utilisateurs vont stocker leurs items, et c&rsquo;est également dans ce dernier que la configuration propre au profil de l&rsquo;utilisateur est stockée.</p>



<p>Pour faire simple, c&rsquo;est un espace personnel limité par des permissions strictes pour chaque utilisateur.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-6 kt-pane3409_ae88eb-cd"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>/lib</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Abréviation de <strong>librairie</strong>, ce répertoire va contenir l&rsquo;ensemble des bibliothèques partagées essentielles et nécessaires au fonctionnement de notre système et des exécutables stockés dans les répertoires <strong>/bin</strong> et <strong>/sbin</strong>.</p>



<p>Si nous faisions la comparaison avec Windows, les fichiers .dll s&rsquo;appellent .so.</p>



<p>Dans ce répertoire nous retrouvons également les modules du kernel. Ce répertoire est critique pour le système car lié au /bin.</p>



<p class="has-text-align-center">Merci Capt&rsquo;ain Obvious !</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-7 kt-pane3409_83b8b1-28"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>/media</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>L&rsquo;un des amalgames que nous pouvons souvent faire avec ce répertoire se fait avec le répertoire <strong>/dev</strong> et <strong>/mnt</strong>.</p>



<p>Effectivement, le répertoire <strong>/media</strong> sert de point de montage automatique pour les périphériques amovibles. Si vous voyez genre les Usb-Key, CD/DVD, DD externe, Disquette, Carte SD etc&#8230; C&rsquo;est pourquoi nous ne retrouvons pas ces périphériques dans <strong>/dev</strong>.</p>



<p>Le fait que le point de montage se fait automatiquement il n&rsquo;y a pas besoin de chercher du côté du répertoire <strong>/mnt</strong>.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-8 kt-pane3409_b55779-e4"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>/mnt</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>L&rsquo;abréviation de <strong>mount</strong>. Ce répertoire est un point de montage temporaire pour monter manuellement des systèmes de fichiers.</p>



<p>Il sert à monter un disque manuellement, monter un ISO, accéder à une partition de réparation.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-9 kt-pane3409_9ec501-3a"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>/proc</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>C&rsquo;est un répertoire un peu particulier d&rsquo;abréviation <strong>processus</strong>. C&rsquo;est un système de fichiers virtuel qui est généré dynamiquement par le kernel.</p>



<p>Ainsi, nous retrouvons :</p>



<ul class="wp-block-list">
<li>Les processus actifs</li>



<li>Les informations des ressources (CPU et RAM)</li>



<li>La configuration du kernel</li>
</ul>



<p>Il est possible de modifier certains paramètres systèmes à chaud comme le réseau par exemple.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-10 kt-pane3409_1d05bd-93"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>/sbin</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>De son abréviation <strong>system binaries</strong>, nous retrouvons les mêmes caractéristiques que le répertoire /bin à l&rsquo;exception que les commandes des exécutables présents dans le répertoire sont destinées principalement à l&rsquo;administration (utilisateur root).</p>



<p>Ainsi les ressources présentes dans le répertoire <strong>/sbin</strong> :</p>



<ul class="wp-block-list">
<li>Permettre le démarrage du système</li>



<li>Gérer l&rsquo;administration des partitions et des disques</li>



<li>Administrer le réseau</li>



<li>Réaliser la maintenance et récupération</li>
</ul>



<p>Les commandes étant sensibles, ces dernières ne doivent pas être accessible des utilisateurs. Uniquement des utilisateurs privilégiés.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-11 kt-pane3409_c96322-21"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>/srv</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>De son petit nom <strong>service</strong>, ce répertoire va contenir les données des services fournis par le système.</p>



<p>Il sert à stocker les fichiers spécifiques aux services réseau ou applications serveurs. Généralement chaque service à son propre sous-dossier.</p>



<p>Les données présentes dans <strong>/srv</strong> sont considérées comme fixes. Dans le cas contraire il faudra se tourner vers le <strong>/var</strong>.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-12 kt-pane3409_b447db-5d"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>/tmp</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Le répertoire <strong>temporaire</strong> enfin. Comme son nom l&rsquo;indique il va contenir des ressources temporaires durant l&rsquo;exécution d&rsquo;un programme, d&rsquo;échange de données inter processus, voire de zone tampon durant l&rsquo;installation ou compilation d&rsquo;un programme.</p>



<p>C&rsquo;est un répertoire magique, une zone grise. L&rsquo;avantage de ce répertoire se trouve dans la suppression des données à chaque redémarrage du système.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-14 kt-pane3409_f75fa3-11"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>/var</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Le dossier <strong>variable</strong>&#8230; Ce répertoire va contenir les données qui vont changer dans le temps contrairement aux fichiers statiques comme /usr, /bin, /srv.</p>



<p>Ce répertoire est généralement utilisé pour stocker des fichiers générés par le système ou par les applications (site web par exemple). Toutefois, nous retrouvons également :</p>



<ul class="wp-block-list">
<li>Les journaux systèmes et services (logs)</li>



<li>Les files d&rsquo;impressions ou mails (spools)</li>



<li>Les BDDs<sup data-fn="2d347e21-a763-4bc2-ab40-e0ef607de630" class="fn"><a href="#2d347e21-a763-4bc2-ab40-e0ef607de630" id="2d347e21-a763-4bc2-ab40-e0ef607de630-link">6</a></sup></li>



<li>Les fichiers temporaires persistants</li>
</ul>



<p>Attention car ce répertoire peut très vite grossir 🙂</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-13 kt-pane3409_955780-1c"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>/usr</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>L&rsquo;un des répertoires importants du système mais pas non critique. Ce dernier est l&rsquo;abréviation de <strong>user</strong> et va contenir les logiciels installés par le système ou l&rsquo;administrateur.</p>



<p>Une sous arborescence bien organisée est présente afin de garantir l&rsquo;accès aux programmes, bibliothèques et fichiers partagés pour l&rsquo;ensemble des utilisateurs :</p>



<ul class="wp-block-list">
<li><strong>/usr/bin :</strong> Programme accessible à tous les utilisateurs</li>



<li><strong>/usr/sbin :</strong> Programmes d&rsquo;administration</li>



<li><strong>/usr/lib :</strong> Bibliothèques partagées</li>



<li><strong>/usr/share :</strong> Fichiers partagés</li>



<li><strong>/usr/include :</strong> Fichiers header pour la compilation de logiciels</li>



<li><strong>/usr/local :</strong> Programmes installés manuellement</li>
</ul>



<p>Je peux vous dire que plus d&rsquo;une fois je me suis mordu les doigts pour ne pas avoir bien provisionné ma partition et je me retrouve bloqué en plein update ou durant une installation&#8230;</p>
</div></div></div>
</div></div></div>



<p></p>



<p>J&rsquo;en peux plus. C&rsquo;est que c&rsquo;est long comme retour aux bases&#8230; J&rsquo;espère ne pas avoir oublié de répertoire.</p>



<p>L&rsquo;une des mauvaises pratiques lors du déploiement d&rsquo;un SE Linux est d&rsquo;allouer l&rsquo;ensemble de l&rsquo;espace disponible à <strong>/</strong>, de ce fait si par exemple je viens à blinder le <strong>/var/tmp</strong> ou <strong>/var/log</strong> mon système est à genoux. Donc sur un disque il convient de partitionner les répertoires.</p>



<p class="has-text-align-center"><strong>Oui mais quels répertoires ?</strong></p>



<p>En réponse à cette question, <a href="https://www.youtube.com/watch?v=EvoL-FvSPDg">je mets en 3/4 face et je réponds par un Uraken</a> des familles en sortant le guide de l&rsquo;ANSSI.</p>



<figure class="wp-block-table aligncenter"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td><img decoding="async" width="600" height="632" class="wp-image-1459" style="width: 600px;" src="https://erwanguillemard.com/wp-content/uploads/2024/01/IL01_012_R12_part.png" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/01/IL01_012_R12_part.png 338w, https://erwanguillemard.com/wp-content/uploads/2024/01/IL01_012_R12_part-285x300.png 285w" sizes="(max-width: 600px) 100vw, 600px" /></td><td>Cela offre également une autre possibilité concernant la sécurité.<br><br>Au-delà d&rsquo;assurer le fonctionnement du système quant au potentiel risque de saturation de stockage, il est possible de définir des options sur les points de montage de nos répertoires.<br><br>Ainsi il est possible de limiter l&rsquo;accès au device ou l&rsquo;exécution de programme.<br><br>Je préconise également d&rsquo;ajouter le répertoire <strong>/var/log/audit</strong>. <br><br>Je ne rentre volontairement pas dans le détail car j&rsquo;explique ce point de recommandation (R12) dans mon billet concernant le durcissement d&rsquo;un système GNU Linux.</td></tr></tbody></table></figure>



<p class="has-text-align-center"><strong>Ok pour ce qui est de la segmentation, mais du coup, quel doit être la répartition niveau stockage ?</strong></p>



<p>C&rsquo;est plutôt simple. Encore une fois, il suffit de chercher un peu. Malheureusement il n&rsquo;y a pas de recommandation empirique. C&rsquo;est donc à nous de définir les seuils par répertoire en tenant compte des critères énoncés précédemment.</p>



<p>Pour ma part cela donne :</p>



<figure class="wp-block-table has-small-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>Répertoires</strong></td><td class="has-text-align-center" data-align="center"><strong>% Minimum</strong></td><td class="has-text-align-center" data-align="center"><strong>% Maximum</strong></td></tr><tr><td class="has-text-align-center" data-align="center">/</td><td class="has-text-align-center" data-align="center">10%</td><td class="has-text-align-center" data-align="center">15%</td></tr><tr><td class="has-text-align-center" data-align="center">/boot</td><td class="has-text-align-center" data-align="center"><strong><mark style="background-color:rgba(0, 0, 0, 0);color:#fe0000" class="has-inline-color">*</mark> 1024 Mio</strong></td><td class="has-text-align-center" data-align="center"><strong><mark style="background-color:rgba(0, 0, 0, 0);color:#fe0000" class="has-inline-color">*</mark> 1024 Mio</strong></td></tr><tr><td class="has-text-align-center" data-align="center">/usr</td><td class="has-text-align-center" data-align="center">10%</td><td class="has-text-align-center" data-align="center">15%</td></tr><tr><td class="has-text-align-center" data-align="center">/var</td><td class="has-text-align-center" data-align="center">10%</td><td class="has-text-align-center" data-align="center">15%</td></tr><tr><td class="has-text-align-center" data-align="center">swap</td><td class="has-text-align-center" data-align="center"><strong>1:1 de la RAM si =&lt; 8 Gio<br>1:0.5 de la RAM si &gt; 8 Gio</strong></td><td class="has-text-align-center" data-align="center"><strong>1:1 de la RAM si =&lt; 8 Gio<br>1:0.5 de la RAM si &gt; 8 Gio</strong></td></tr><tr><td class="has-text-align-center" data-align="center">/var/log</td><td class="has-text-align-center" data-align="center">5%</td><td class="has-text-align-center" data-align="center">10%</td></tr><tr><td class="has-text-align-center" data-align="center">/var/log/audit</td><td class="has-text-align-center" data-align="center">2%</td><td class="has-text-align-center" data-align="center">5%</td></tr><tr><td class="has-text-align-center" data-align="center">/var/tmp</td><td class="has-text-align-center" data-align="center">5%</td><td class="has-text-align-center" data-align="center">5%</td></tr><tr><td class="has-text-align-center" data-align="center">/tmp</td><td class="has-text-align-center" data-align="center">5%</td><td class="has-text-align-center" data-align="center">5%</td></tr><tr><td class="has-text-align-center" data-align="center">/opt</td><td class="has-text-align-center" data-align="center">5%</td><td class="has-text-align-center" data-align="center">10%</td></tr><tr><td class="has-text-align-center" data-align="center">/home</td><td class="has-text-align-center" data-align="center">10%</td><td class="has-text-align-center" data-align="center">10%</td></tr><tr><td class="has-text-align-center" data-align="center">/srv</td><td class="has-text-align-center" data-align="center">2%</td><td class="has-text-align-center" data-align="center">5%</td></tr></tbody></table></figure>



<p></p>



<p>Voilà ce qui est pour la théorie. Comme ça me soule de ne pas savoir quel espace allouer pour 30 Gio, 40 Gio, 50 Gio de disque, j&rsquo;ai été contraint de faire une petite application en Powershell&#8230; Pourquoi changer une équipe qui gagne ?</p>



<h2 class="wp-block-heading">Application</h2>



<p>Je reste un puriste en termes de développement et je ne peux me passer de Windows Powershell ISE<sup data-fn="29a21fb4-e351-4d35-8f8b-3970b17ecbef" class="fn"><a href="#29a21fb4-e351-4d35-8f8b-3970b17ecbef" id="29a21fb4-e351-4d35-8f8b-3970b17ecbef-link">7</a></sup>. Je sais qu&rsquo;il existe mieux comme IDE<sup data-fn="2a0ff43d-b86a-4ec2-affb-823bcb64afdc" class="fn"><a href="#2a0ff43d-b86a-4ec2-affb-823bcb64afdc" id="2a0ff43d-b86a-4ec2-affb-823bcb64afdc-link">8</a></sup> (Visual Studio Code par exemple) mais je n&rsquo;arrive pas à me faire à l&rsquo;idée de quitter ISE&#8230;</p>



<p class="has-text-align-center"><strong>Cela fait-il de moi un vieux réactionnaire ? Un dev de l&rsquo;ancien temps ?</strong></p>



<p>Bref, je laisse cette question existentielle en suspens.</p>



<p>Je me suis amusé pour une fois à réaliser une interface GUI<sup data-fn="f0557ebb-6968-4aca-a988-4463d1adb9db" class="fn"><a href="#f0557ebb-6968-4aca-a988-4463d1adb9db" id="f0557ebb-6968-4aca-a988-4463d1adb9db-link">9</a></sup> via WindowsForm. Moi l&rsquo;amoureux du CLI<sup data-fn="3e18b1eb-c04c-4c76-bba6-28e2298ac5a5" class="fn"><a href="#3e18b1eb-c04c-4c76-bba6-28e2298ac5a5" id="3e18b1eb-c04c-4c76-bba6-28e2298ac5a5-link">10</a></sup> je reconnais mettre amusé. Encore une fois <a href="https://www.youtube.com/watch?v=1SERx1KyECU&amp;list=RD1SERx1KyECU&amp;start_radio=1">je sais que je ne savais rien</a> et j&rsquo;ai donc encore appris.</p>



<p>Réaliser une application GUI en plaçant les items au pixel c&rsquo;est marrant mais vite casse gueule. Cela demande une gymnastique d&rsquo;esprit qui ne me rebute pas.</p>



<p>Il y a toutefois un bémol non négligeable à l&rsquo;utilisation de WindowsForm, cela ne permet pas l&rsquo;opérabilité multiplateforme. Logique puisque WindowsForm fait partie intégrante de Windows, donc pas possible de faire fonctionner ce dernier sous Linux.</p>



<p>Il faudrait donc que je compose un mode de fonctionnement CLI pour assurer l&rsquo;opérabilité. Cela n&rsquo;est qu&rsquo;au final que le développement d&rsquo;une fonction d&rsquo;affichage.</p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>La première version de mon application ne se base pas pour l&rsquo;instant sur un fichier de configuration ce qui implique que les seuils minimums et maximums sont défini en dur dans le code (en tant que constante global tout de même je ne suis pas un sauvage !).</td><td><img decoding="async" width="550" height="388" class="wp-image-3431" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/PP_005_002_app.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/PP_005_002_app.jpg 932w, https://erwanguillemard.com/wp-content/uploads/2026/03/PP_005_002_app-300x211.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/PP_005_002_app-768x541.jpg 768w" sizes="(max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p>J&rsquo;offre également la possibilité de définir la taille minimum ou maximum à provisionner.</p>



<p>Pour bien comprendre (c&rsquo;est un grand mot) je propose la courte vidéo de présentation de la version béta de mon app.</p>



<h3 class="wp-block-heading">Démonstration</h3>



<figure class="wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="PROJET   Linux Partitions Calculator" width="720" height="405" src="https://www.youtube.com/embed/-pFmGdQvl3E?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h3 class="wp-block-heading">GitHub</h3>



<p class="has-text-align-center"><a href="https://github.com/EGuillemard/GS_002_UNI_SYS_Storage">Miaou</a></p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Qu&rsquo;il est bon de revenir aux bases. Sans cela, je pense que je n&rsquo;aurai pas eu l&rsquo;idée de faire du GUI en powershell depuis mon ISE. Il est vrai que cela permet également de revenir peut-être aux prémices de ce blog qui étaient :</p>



<ul class="wp-block-list">
<li>L&rsquo;aspect pédagogique</li>



<li>Aborder les bases</li>



<li>Réaliser des petits projets</li>



<li>Sortir des sentiers battus</li>
</ul>



<p>Ainsi, je renoue avec certaines valeurs laissées de côté dans le cadre des derniers gros projets que j&rsquo;ai pu mener. Toutefois, je reste une tête de c*n à laisser transparaitre ma désinvolture, sarcasmes et autres tournures de phrases et expressions vitriolés 🙂 (Ce blog et mes articles restent un loisir personnel et cela m&rsquo;amuse d&rsquo;user de ma liberté d&rsquo;expression tout en tachant de rester respectueux).</p>



<p>Bref, il est temps de clôturer ce billet et d&rsquo;attaquer d&rsquo;autres thématiques 🙂 </p>



<p>Le mot de la fin :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>J&rsquo;ai évalué et calculé mon incompétence, elle est à la hauteur de vos mensonges et de votre lâcheté. Un petit partitionnement de prime et de service ? Vous méritez bien convenablement un pâté lorrain en cadeau ?</em></p>
<cite>Erwan GUILLEMARD</cite></blockquote>



<h2 class="wp-block-heading">Sources</h2>



<ul class="wp-block-list">
<li><a href="https://www.debian.org/releases/stable/arm64/apcs03.en.html">Debian : Recommanded Partitioning</a></li>



<li><a href="https://help.ubuntu.com/community/DiskSpace">Ubuntu : DiskSpace</a></li>
</ul>


<ol class="wp-block-footnotes"><li id="d0cf7aef-1d32-469c-80aa-165e012513eb"><strong>RHEL :</strong> RedHat Entreprise Linux <a href="#d0cf7aef-1d32-469c-80aa-165e012513eb-link" aria-label="Aller à la note de bas de page 1">↩︎</a></li><li id="0a4dc23e-e493-4f49-8cdf-9a361464e536"><strong>ANSSI :</strong> Agence Nationale de Sécurité des Systèmes d&rsquo;Informations <a href="#0a4dc23e-e493-4f49-8cdf-9a361464e536-link" aria-label="Aller à la note de bas de page 2">↩︎</a></li><li id="7c312e03-317c-474a-ab3e-448ddb4d3df3"><strong>SE :</strong> Système d&rsquo;Exploitation <a href="#7c312e03-317c-474a-ab3e-448ddb4d3df3-link" aria-label="Aller à la note de bas de page 3">↩︎</a></li><li id="957eb17c-7564-49a4-beda-d11cd897f8a8"><strong>GUI :</strong> Graphical User Interface <a href="#957eb17c-7564-49a4-beda-d11cd897f8a8-link" aria-label="Aller à la note de bas de page 4">↩︎</a></li><li id="6b4eeabd-5566-437e-ab1d-1980ef7ba3d1"><strong>GRUB :</strong> GRand Unifier Bootloader <a href="#6b4eeabd-5566-437e-ab1d-1980ef7ba3d1-link" aria-label="Aller à la note de bas de page 5">↩︎</a></li><li id="2d347e21-a763-4bc2-ab40-e0ef607de630"><strong>BDD :</strong> Base De Données <a href="#2d347e21-a763-4bc2-ab40-e0ef607de630-link" aria-label="Aller à la note de bas de page 6">↩︎</a></li><li id="29a21fb4-e351-4d35-8f8b-3970b17ecbef"><strong>ISE :</strong> Integrated Scripting Environment <a href="#29a21fb4-e351-4d35-8f8b-3970b17ecbef-link" aria-label="Aller à la note de bas de page 7">↩︎</a></li><li id="2a0ff43d-b86a-4ec2-affb-823bcb64afdc"><strong>IDE :</strong> Integraded Development Environment <a href="#2a0ff43d-b86a-4ec2-affb-823bcb64afdc-link" aria-label="Aller à la note de bas de page 8">↩︎</a></li><li id="f0557ebb-6968-4aca-a988-4463d1adb9db"><strong>GUI :</strong> Graphical User Interface <a href="#f0557ebb-6968-4aca-a988-4463d1adb9db-link" aria-label="Aller à la note de bas de page 9">↩︎</a></li><li id="3e18b1eb-c04c-4c76-bba6-28e2298ac5a5"><strong>CLI :</strong> Command Line Interface  <a href="#3e18b1eb-c04c-4c76-bba6-28e2298ac5a5-link" aria-label="Aller à la note de bas de page 10">↩︎</a></li></ol>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PROJET &#8211; Dream Nebula, VMWare KPI</title>
		<link>https://erwanguillemard.com/projet-dream-nebula-vmware-kpi/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Sun, 07 Sep 2025 18:51:25 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[Projet]]></category>
		<category><![CDATA[VEEAMONE]]></category>
		<category><![CDATA[VMWare]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=3089</guid>

					<description><![CDATA[Toc Toc Toc ? Il y a quelqu&#8217;un ? C&#8217;est moi Borgniol&#8230; Après 3 mois d&#8217;absence et de retrait vis à vis du dernier article, j&#8217;ai pris la décision de faire une pause. Des contextes complexes m&#8217;ont menés à devenir un homme fatigué, à deux doigts du break. Mais ne nous attardons pas sur ce...]]></description>
										<content:encoded><![CDATA[
<p class="has-text-align-center">Toc Toc Toc ? Il y a quelqu&rsquo;un ? C&rsquo;est moi Borgniol&#8230;</p>



<p>Après 3 mois d&rsquo;absence et de retrait vis à vis du dernier article, j&rsquo;ai pris la décision de faire une pause. Des contextes complexes m&rsquo;ont menés à devenir <a href="https://www.youtube.com/watch?v=TbHgzj5-YdA&amp;ab_channel=STUDIOCANALFrance">un homme fatigué, à deux doigts du break</a>. Mais ne nous attardons pas sur ce point si petit soit il mais sans le négliger non plus.</p>



<p>Bref, en parallèle du projet précédent Green Ray, dans ma fièvre créative j&rsquo;ai conçu sur la même période une autre application. J&rsquo;ai toujours à l&rsquo;esprit cette même pudeur de présenter mes travaux, vis à vis des solutions déjà présente sur le marché ou des regards critiques de mes pairs.</p>



<p>J&rsquo;ai rêvé depuis des nombreuses années d&rsquo;une solution qui permettrai de suivre dans le temps l&rsquo;évolution d&rsquo;un SI en terme de ressource dans un environnement virtualisé VMWare. Je sais encore une fois que ce rêve n&rsquo;est que la prolongation de la vision de mon prédécesseur. Ce dernier avait pensé et développé un tableau de bord dans un tableur pour définir le seuil de consommation d&rsquo;un environnement clustérisé VMWare et de définir la charge critique des ressources dans un fonctionnement normal et dégradé. Il avait également poussé le curseur jusqu&rsquo;à dissocier les grandes familles des ressources virtuelles.</p>



<p>La vie d&rsquo;une entreprise vous connaissez ? <a href="https://www.youtube.com/watch?v=nLU5pgSxqNU&amp;list=RDnLU5pgSxqNU&amp;start_radio=1&amp;ab_channel=RTSArchives">Ca s&rsquo;en va et ca revient</a> (ou pas&#8230;). Vous comprenez qu&rsquo;il a quitté l&rsquo;entreprise, emportant avec lui la solution qu&rsquo;il avait développé sur son temps personnel.</p>



<p>Je me suis donc inspiré de ces réflexions et ai poussé plus loin le curseur jusqu&rsquo;aux serveurs virtuelles, datastores etc. De ce contexte est né <strong>SS_043</strong> ou <strong>Dream Nebula</strong>, concrétisant l&rsquo;accomplissement d&rsquo;un projet de 3 ans. Mon application vient répondre à la problématique.</p>



<p class="has-text-align-center"><strong><em>Comment garantir le capacity planning d&rsquo;un système d&rsquo;information virtualisé sous VMWare dans son fonctionnement normal et dégradé dans le temps tout en garantissant une vision la plus précise de chaque type d&rsquo;environnement ainsi qu&rsquo;une synthèse des bulles métiers ou clients à des fins de facilitation de refacturation interne ou externe des ressources consommées.</em></strong></p>



<p>Encore une bien vaste problématique qui pourrait faire le sujet d&rsquo;une fin de cycle de cinquième année. 🙂</p>



<p>Les premières versions pour répondre aux attentes se basait sur les RVTools et les données qui en étaient retournées. Ainsi il m&rsquo;était donc facile de marcher dans les pas de mon prédécesseurs et d&rsquo;integrer et manipuler les données dans un tableau xlsxm.</p>



<p class="has-text-align-center"><strong>XLSXM tien donc ?</strong></p>



<p>Oui. Je rappel que je souhaite avoir une traçabilité dans le temps. Donc pas besoin de sortir de Saint-Cyr pour savoir que cela va se traiter par le biais de MACRO en VB. (Normalement avec juste les termes tableurs, MACRO et VB nous SACHONS que cela ne fonctionnera pas dans le temps en terme de maintient de la solution). Et bien spoiler, la première solution aura tenue un an et demi. A la fin cela ne ressemblait plus à grand chose et beaucoup d&rsquo;options automatisées étaient faites manuellement.</p>



<p class="has-text-align-center"><strong>Pourquoi ?</strong></p>



<p>Il y a bien des raisons et je vais les expliquer :</p>



<ul class="wp-block-list">
<li>La mise à jour des composants VMWares (vSphere et vCenter) ajoute ou modifie l&rsquo;ordre des colonnes. Donc il est nécessaire de réadapter l&rsquo;ensemble des formules dans le tableur</li>



<li>Les mises à jour du framework .NET et Windows rendent obsolètes certaines fonctionnalités au sein d&rsquo;excel. Retour case développement dans les MACRO</li>



<li>Certaines lignes sautent et donc cela décalent toutes les autres lignes</li>
</ul>



<p>C&rsquo;est à partir des points précédents que Dream Nebula ou SS_043 est né 🙂</p>



<p>Mon projet se base sur une technologie, VMWare et son usage des tags. Toutefois et à des fins d&rsquo;efficience, je me base sur VEEAMOne pour l&rsquo;attribution des tags VMWares. Je vous laisse si nécessaire vous référer à l&rsquo;article déjà présent sur le sujet. J&rsquo;insiste, l&rsquo;usage de VEEAMOne est optionnel.</p>





<h2 class="wp-block-heading">Avant-Propos</h2>



<p>Attention, bis repetita en approche&#8230;</p>



<p>Il est important de comprendre que ce billet ne rentrera pas dans le détail technique et ce pour des raisons évidentes de savoir faire et de protection intellectuelle. Le code source est disponible sur GitHub mais ne sera pas en libre accès.&nbsp;<strong>Ah ouai et pourquoi donc ?</strong></p>



<p>Comme j’ai pu le mentionner dans un&nbsp;<a href="https://erwanguillemard.com/projet-passerelle-veeamone-itop/">article précédent</a>&nbsp;je suis satisfait de ce que j’ai réussi à livrer et à créer. J’ai passé un bon nombre d’heure de recherche et de développement à concevoir la solution ainsi que la lecture des différentes documentations. Contrairement à d’autres projets je suis satisfait de la qualité du code produit et de l’architecture de ce dernier.</p>



<p>Ce qui m’amène au point, dois je commercialiser ce dernier ou le laisser à la disposition de tous ? Mon cœur peine à se décider… Je souhaite valoriser mon travail de recherche…</p>



<p>Bref, si votre curiosité est toujours suscitée je pense que le reste de l’article devrait être satisfaite. Dans le cas contraire, je vous laisse exécuter la combinaison&nbsp;<strong>Ctrl+F4</strong>.</p>



<h2 class="wp-block-heading">Prérequis</h2>



<ul class="wp-block-list">
<li><strong>SE :</strong>&nbsp;Windows Server 2k19 et version ultérieures ou Windows 11</li>



<li><strong>Apps :&nbsp;</strong>VCSA version 7 ou plus</li>



<li><strong>Autres :</strong>
<ul class="wp-block-list">
<li>PowerShell version 5 et superieur</li>



<li>PowerBI (optionnel)</li>



<li>ODBC drivers (SQLite3)</li>



<li>VEEAMOne version 12 ou plus (optionnel) </li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Guide</h2>



<ul class="wp-block-list">
<li><a href="https://erwanguillemard.com/projet-dream-nebula-vmware-kpi-partie-1-theorie/">Partie 1 : Théorie</a>
<ul class="wp-block-list">
<li>Définir l’expression du besoin et aborder le cahier des charges attendu. Ce qui implique l’architecture de l’application, du code. Les solutions retenues ainsi que les notions de sécurité</li>
</ul>
</li>



<li><a href="https://erwanguillemard.com/projet-dream-nebula-vmware-kpi-partie-2-pratique/">Partie 2 : Pratique</a>
<ul class="wp-block-list">
<li>Guide de déploiement de la solution et paramétrage de cette dernière.</li>



<li><mark><em><s>Oups, un mot de passe ? On échange avant ?</s></em>&nbsp;</mark><strong>#bisous</strong></li>
</ul>
</li>



<li><a href="https://erwanguillemard.com/projet-dream-nebula-vmware-kpi-partie-3-demonstration/">Partie 3 : Démonstration</a>
<ul class="wp-block-list">
<li>Faire une présentation de la solution dans les différents modes qui ont été développés.</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Le mot de la fin</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Moi j&rsquo;ai la lèvre humide et je sais la science, de perdre au fond d&rsquo;un terminal ISE l&rsquo;antique conscience. Je sèche tous les pleurs sur mes KPIs triomphants, et fais rire les DSIs du rire du DEVOps</p>
<cite>Erwan GUILLEMARD refondu de <em><a href="https://www.youtube.com/watch?v=3LY2y-x92CA&amp;ab_channel=L%C3%A9oFerr%C3%A9">Charles BAUDELAIRE</a></em></cite></blockquote>



<h2 class="wp-block-heading">Sources</h2>



<ul class="wp-block-list">
<li><a href="https://techdocs.broadcom.com/us/en/vmware-cis/vcf/power-cli/latest/powercli.html">VMWare &#8211; PowerCLI</a></li>
</ul>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PROJET – Green Ray, VEEAM Reporting</title>
		<link>https://erwanguillemard.com/projet-green-ray-veeam-reporting/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Sun, 13 Apr 2025 18:28:21 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[Projet]]></category>
		<category><![CDATA[VEEAM]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=2988</guid>

					<description><![CDATA[Après un an d&#8217;attente, me voilà prêt à présenter le résultat de mes travaux dans ce billet. Pourquoi un an ? Je pensais et pense toujours qu&#8217;il est difficile de présenter une solution sans expliquer préalablement sur quels produits et solutions mon application s&#8217;appuie&#8230; Une fois n&#8217;est pas coutume, je me réfère aux saintes écritures...]]></description>
										<content:encoded><![CDATA[
<p>Après un an d&rsquo;attente, me voilà prêt à présenter le résultat de mes travaux dans ce billet. Pourquoi un an ? Je pensais et pense toujours qu&rsquo;il est difficile de présenter une solution sans expliquer préalablement sur quels produits et solutions mon application s&rsquo;appuie&#8230;</p>



<p>Une fois n&rsquo;est pas coutume, je me réfère aux saintes écritures</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>Et moi, je te dis que tu es Pierre, et que sur cette pierre je bâtirai mon Église, et que les portes du séjour des morts ne prévaudront point contre elle.</em></p>
<cite>Matthieu, 16:13:18</cite></blockquote>



<p>De ce verset, je bâti donc le mien</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>Et moi, je te dis que tu es SS_034, et que sur cette application je bâtirai mes KPIs, et que les défaillances des jobs de protection ne prévaudront point contre elle.</em></p>
<cite>Le rédacteur de ce billet</cite></blockquote>



<p>Ne voyez pas dans cette reformulation une quelconque provocation de ma part ou quelques pensées négatives quant à mon sarcasme et ironie qui m&rsquo;habite. J&rsquo;ai une éducation des plus classiques dans l&rsquo;ordre mariste. Passons.</p>



<p>Enfin, vous comprendrez mieux je pense l&rsquo;allusion à la rédaction des articles précédents sur les différents produits VEEAM puisque mon application s&rsquo;appuie sur ces derniers. Cela à représenter un travail personnel titanesque en dehors de mon activité professionnelle&#8230;</p>



<p class="has-text-align-center"><strong>Mais c&rsquo;est quoi ton application SS_034 ou Green Ray ? Et ça sert à quoi ? Quel rapport avec les produits VEEAM ?</strong></p>



<p>Avant de répondre à l&rsquo;ensemble des questions, la problématique à laquelle j&rsquo;ai été confronté prends son origine courant mars 2023, dans mon environnement professionnel.</p>



<p class="has-text-align-center"><strong><em>Comment s&rsquo;assurer de l&rsquo;état des mécanismes de protection des systèmes d&rsquo;informations quotidien fournit par les produits VEEAM et établir à partir de ces données des indicateurs de performance afin de s&rsquo;assurer du bon respect des engagements contractuels interne ou externe.</em>    </strong></p>



<p>C&rsquo;est marrant car je dirai que cette problématique conviendrait pour un mémoire de fin de cycle de 5 année. 🙂</p>



<p><strong><mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color">/!\</mark> Spoiler</strong>, j&rsquo;ai non seulement trouvé une solution à cette problématique mais ce dernier a pris une tournure inattendue au cours de ces deux dernières années.</p>



<p><strong>Hé banane, nous nous en doutons sinon tu n&rsquo;aurais pas pondu un article&#8230; Mouai, bà je suis certains qu&rsquo;il existe déjà des applications ou fonctionnalités internes ou externes à VEEAM qui permet de faire ça ? Tu as réinventé la roue&#8230; Encore un article p*te à clic&#8230;</strong></p>



<p>C&rsquo;est vrai que l&rsquo;argumentaire se tiens, toutefois pouvez vous me sortir les statistiques par jobs ou par organisations sur un mois précis ? Sur 13 mois glissant ? Déduire une tendance ? Allez y je vous regarde 🙂</p>



<p>Donc pour répondre aux 3 questions précédemment énoncées :</p>



<ul class="wp-block-list">
<li>En tant que MSP<sup data-fn="11686542-5715-4e20-969a-5cdb194875ff" class="fn"><a href="#11686542-5715-4e20-969a-5cdb194875ff" id="11686542-5715-4e20-969a-5cdb194875ff-link">1</a></sup> dans le milieu professionnel, l&rsquo;usage des produits VCC<sup data-fn="92323b67-b45b-408c-8fac-a724d7ed02e1" class="fn"><a href="#92323b67-b45b-408c-8fac-a724d7ed02e1" id="92323b67-b45b-408c-8fac-a724d7ed02e1-link">2</a></sup>, VSPC<sup data-fn="a38a8437-b0a8-4ade-973b-c2b6d616d957" class="fn"><a href="#a38a8437-b0a8-4ade-973b-c2b6d616d957" id="a38a8437-b0a8-4ade-973b-c2b6d616d957-link">3</a></sup> pour administrer et gérer les différents serveurs de sauvegarde VBR<sup data-fn="f0776cc3-c9f7-4336-bf91-3ae744f36c9c" class="fn"><a href="#f0776cc3-c9f7-4336-bf91-3ae744f36c9c" id="f0776cc3-c9f7-4336-bf91-3ae744f36c9c-link">4</a></sup> ou VB MO365<sup data-fn="728dfc79-57bc-4ca5-9b67-18fad8c6fadd" class="fn"><a href="#728dfc79-57bc-4ca5-9b67-18fad8c6fadd" id="728dfc79-57bc-4ca5-9b67-18fad8c6fadd-link">5</a></sup>, il est logique que je me concentre sur les solutions de l&rsquo;éditeur VEEAM. De plus VEEAM s&rsquo;inscrit depuis la <a href="https://www.veeam.com/blog/fr/leader-gartner-magic-quadrant.html">5 années consécutives</a> comme le leader de la sauvegarde sur le marché.</li>



<li>L&rsquo;application développée par mes soins vient collecter, traiter et présenter les données quotidiennes des jobs de sauvegardes tout en garantissant la flexibilité de la solution et la plus grande sécurité possible</li>



<li>Le nom du projet est SS_034_TOOLS_Backup-Reporting (toujours ma nomenclature personnelle <strong>SystemScript</strong> numéro <strong>34</strong>). Mes proches m&rsquo;ont fait remarquer à maintes reprises que le nom est difficilement commercialisable. C&rsquo;est pourquoi Green Ray est plus adapté. En raison d&rsquo;un relevé quotidien des outils VEEAM d&rsquo;un vert caractéristique, je me suis dit que cela revenait à <a href="https://www.youtube.com/watch?v=8AcbSv-FfJ0&amp;ab_channel=WilliamShellerVEVO">guetter le dernier rayon vert du soir</a> 🙂</li>
</ul>



<p class="has-text-align-center"><strong>Tu dis difficilement commercialisable ?</strong> <em>Je reviendrai plus tard sur ce point.</em></p>





<h2 class="wp-block-heading">Avant-Propos</h2>



<p>Il est important de comprendre que ce billet ne rentrera pas dans le détail technique et ce pour des raisons évidentes de savoir faire et de protection intellectuelle. Le code source est disponible sur GitHub mais ne sera pas en libre accès.&nbsp;<strong>Ah ouai et pourquoi donc ?</strong></p>



<p>Comme j&rsquo;ai pu le mentionner dans un <a href="https://erwanguillemard.com/projet-passerelle-veeamone-itop/">article précédent</a> je suis satisfait de ce que j&rsquo;ai réussi à livrer et à créer. J&rsquo;ai passé un bon nombre d&rsquo;heure de recherche et de développement à concevoir la solution ainsi que la lecture des différentes documentations. Contrairement à d&rsquo;autres projets je suis satisfait de la qualité du code produit et de l&rsquo;architecture de ce dernier.</p>



<p>Ce qui m&rsquo;amène au point, dois je commercialiser ce dernier ou le laisser à la disposition de tous ? Mon cœur peine à se décider&#8230; Je souhaite valoriser mon travail de recherche&#8230;</p>



<p>Bref, si votre curiosité est toujours suscitée je pense que le reste de l&rsquo;article devrait être satisfaite. Dans le cas contraire, je vous laisse exécuter la combinaison <strong>Ctrl+F4</strong>. </p>



<h2 class="wp-block-heading">Prérequis</h2>



<ul class="wp-block-list">
<li><strong>SE :</strong>&nbsp;Windows Server 2k19 et version ultérieures ou Windows 11</li>



<li><strong>Apps :&nbsp;</strong>VSPC version 7 ou plus</li>



<li><strong>Autres :</strong>
<ul class="wp-block-list">
<li>PowerShell version 5 et ultérieures</li>



<li>PowerBI (optionnel)</li>



<li>ODBC drivers (SQLite3)</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Guide</h2>



<ul class="wp-block-list">
<li><a href="https://erwanguillemard.com/projet-green-ray-veeam-reporting-partie-1-theorie/">Partie 1 : Théorie</a>
<ul class="wp-block-list">
<li>Définir l&rsquo;expression du besoin et aborder le cahier des charges attendu. Ce qui implique l&rsquo;architecture de l&rsquo;application, du code. Les solutions retenues ainsi que les notions de sécurité</li>
</ul>
</li>



<li><a href="https://erwanguillemard.com/projet-green-ray-veeam-reporting-partie-2-pratique/">Partie 2 : Pratique</a>
<ul class="wp-block-list">
<li>Guide de déploiement de la solution et paramétrage de cette dernière.</li>



<li><mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color"><em><s>Oups, un mot de passe ? On échange avant ?</s></em> </mark><strong>#bisous</strong></li>
</ul>
</li>



<li>Partie 3 : Démonstration
<ul class="wp-block-list">
<li>Faire une présentation de la solution dans les deux modes qui ont été développés.  </li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Bien, difficile de conclure un projet sur lequel je reste assez nébuleux (mais pas opaque, je tiens à la nuance). Certes il y a la théorie et je garde le guide d&rsquo;installation dans sa culotte de chasteté, mais la démonstration fait le taf non ? 🙂</p>



<p>Je vois dans cette solution un bon moyen d&rsquo;assister les RSSIs<sup data-fn="b95106c9-785f-4f51-b34e-3c03333fe855" class="fn"><a href="#b95106c9-785f-4f51-b34e-3c03333fe855" id="b95106c9-785f-4f51-b34e-3c03333fe855-link">6</a></sup>, DSIs<sup data-fn="b2786152-1f87-47e8-8a28-5972898c8603" class="fn"><a href="#b2786152-1f87-47e8-8a28-5972898c8603" id="b2786152-1f87-47e8-8a28-5972898c8603-link">7</a></sup> qu&rsquo;ils soient internalisés ou non. Cela permet de montrer du concret au DG<sup data-fn="a3dd87fb-6a5a-4a42-a687-4d4cc5987cdc" class="fn"><a href="#a3dd87fb-6a5a-4a42-a687-4d4cc5987cdc" id="a3dd87fb-6a5a-4a42-a687-4d4cc5987cdc-link">8</a></sup>, DAF<sup data-fn="1721ce52-7980-4395-9564-0ae6b7a2198e" class="fn"><a href="#1721ce52-7980-4395-9564-0ae6b7a2198e" id="1721ce52-7980-4395-9564-0ae6b7a2198e-link">9</a></sup> ou PDG<sup data-fn="b66ce7ae-6091-4047-ac97-8f2722f359e9" class="fn"><a href="#b66ce7ae-6091-4047-ac97-8f2722f359e9" id="b66ce7ae-6091-4047-ac97-8f2722f359e9-link">10</a></sup> quant au travail de longue haleine réalisé par les équipes (oui, on ne va pas se mentir pour le commun des utilisateurs nous sommes désagréables et nous passons nos journées à boire des cafés en nous tirant sur le noeud&#8230; Sans oublier les cabinets de recrutement qui trouve normal de nous proposer un salaire confortable de 30-35k€ annuel). Plus sérieusement, cela permet à la direction d&rsquo;accorder un crédit et de la confiance à ses collaborateurs et d&rsquo;avoir ainsi une bonne vision de la sécurité de son entreprise.</p>



<p>J&rsquo;ai malheureusement trop vu de société externalisée ou équipe interne faire preuve de laxisme ou pire maquiller les rapports de sauvegarde et ce à l&rsquo;insu de leur client ou employeur/repsonbale&#8230; Mais bon, c&rsquo;est triste d&rsquo;écrire ces mots. <em>La fin justifie les moyens</em>&#8230; C&rsquo;est qu&rsquo;il faut la décrocher cette prime annuelle&#8230;</p>



<p>Je ne peux donc qu&rsquo;encourager encore une fois les DAF, DSI, DG ou PDG <strong><mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color">de réclamer</mark></strong> les indicateurs des jobs de protection journalier, hebdomadaire, mensuel et annuel. Même si vous ne comprenez pas grand chose, cela reste des chiffres et il est important de savoir pourquoi certaines fois cela n&rsquo;a pas fonctionné et comment les équipes ont traité le dysfonctionnement. Et il faut faire preuve à certain moment de fermeté et dans d&rsquo;autres cas être indulgent. Il n&rsquo;est pas aisé de garder une main de fer dans un gant de velours.</p>



<p>De plus, ces métriques jouent un rôle important auprès de votre assurance en cas de sinistre informatique. En plus je suis quasiment certains qu&rsquo;une police d&rsquo;assurance cybersécurité a été souscrit. Le risque zéro n&rsquo;existant pas, si vous arrivez à prouver que votre sauvegarde tiens la route et fait l&rsquo;objet d&rsquo;un point de suivi régulier cela devrait faciliter l&rsquo;indemnisation du sinistre.</p>



<p>Si nous revenons plus à même du projet <em>Green Ray</em>, la flexibilité de l&rsquo;application permettant d&rsquo;interfacer n&rsquo;importe quelle solution de reporting (puisque que basé sur une BDD<sup data-fn="591af98b-59ee-4ce6-94dc-cf81b933aa08" class="fn"><a href="#591af98b-59ee-4ce6-94dc-cf81b933aa08" id="591af98b-59ee-4ce6-94dc-cf81b933aa08-link">11</a></sup>) répond au niveau et compétence de chaque RSI ou DSI. La possibilité d&rsquo;activer ou non le mode debug facilite la correction d&rsquo;erreur comme le contrôle dans un fichier de log.</p>



<p>Bien que pour l&rsquo;instant l&rsquo;application ne prend en compte que les jobs de protection de type Backup, BackupCopy et Replication ainsi que les jobs de protection pour Microsoft O365, l&rsquo;application a été pensée pour s&rsquo;adapter assez rapidement que ce soit aux différents niveaux, de l&rsquo;acquisition des données à leurs restitutions en passant par leurs traitements. Si ce n&rsquo;est pas évolutif à quoi bon ? Egalement le fait qu&rsquo;elle puisse traiter plusieurs organisations permets de répondre à un besoin de fournisseur de service et de faciliter la tâche d&rsquo;un Responsable des Services Hébergés par exemple &lt;3 (A la limite du narcissisme non ? C&rsquo;est inquiétant).</p>



<p>Le seul regret que j&rsquo;ai pour l&rsquo;instant en ce mois de Mars 2025 reste que le code est écrit en Powershell et non en C#, C/C++ ou VB .NET (PS c&rsquo;est en .NET non ? 🙂 ). Je pourrais me lancer dans un programme en C/C++ mais pour le coup je suis rouillé. Il serait pas mal d&rsquo;incorporer le rendu directement dans VEEAM (VEEAM One ou dans la VSPC) mais le produit ne doit pas être ouvert pour réaliser ce type d&rsquo;opération (et heureusement).</p>



<p>La version béta 2.0 (en dehors de la factorisation du mode service pour éviter la redondance de code) est stable. Je sais qu&rsquo;il reste des optimisations possibles et de potentiel modules à développer, mais ça l&rsquo;avenir nous le dira si oui ou non je vais investir de nouveau du temps 🙂 En toutes circonstances je suis bien loin de la version 1.0 à manipuler des CSVs dans un fichier XLSX avec des formules à rallonges !</p>



<p>Le mot de la fin</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>Mes PKIs ils sont super ! Quand on les refreshent ils sortent. On peut acquisitionner à Quimper ou à Chalon-Sur-Saone. Ils ont l&rsquo;option&#8230; sécurisantes. Qui résonnent dans mon bureau-eau-eau&#8230; </em></p>
<cite>Erwan GUILLEMARD <em>refondu de <a href="https://www.youtube.com/watch?v=UvQ4x9_e1oE&amp;ab_channel=ArneVinzon-Topic">Arne VINZON</a></em></cite></blockquote>



<h2 class="wp-block-heading">Sources</h2>



<ul class="wp-block-list">
<li><a href="https://www.veeam.com/blog/fr/leader-gartner-magic-quadrant.html">VEEAM : Leader Gartner</a></li>
</ul>


<ol class="wp-block-footnotes"><li id="11686542-5715-4e20-969a-5cdb194875ff"><strong>MSP</strong> : Managed Services Providers <a href="#11686542-5715-4e20-969a-5cdb194875ff-link" aria-label="Aller à la note de bas de page 1">↩︎</a></li><li id="92323b67-b45b-408c-8fac-a724d7ed02e1"><strong>VCC</strong> : VEEAM Cloud Connect <a href="#92323b67-b45b-408c-8fac-a724d7ed02e1-link" aria-label="Aller à la note de bas de page 2">↩︎</a></li><li id="a38a8437-b0a8-4ade-973b-c2b6d616d957"><strong>VSPC</strong> : VEEAM Service Provider Console <a href="#a38a8437-b0a8-4ade-973b-c2b6d616d957-link" aria-label="Aller à la note de bas de page 3">↩︎</a></li><li id="f0776cc3-c9f7-4336-bf91-3ae744f36c9c"><strong>VBR</strong> : VEEAM Backup et Replication <a href="#f0776cc3-c9f7-4336-bf91-3ae744f36c9c-link" aria-label="Aller à la note de bas de page 4">↩︎</a></li><li id="728dfc79-57bc-4ca5-9b67-18fad8c6fadd"><strong>VB MO365</strong> :  VEEAM Backup for Microsoft 365 <a href="#728dfc79-57bc-4ca5-9b67-18fad8c6fadd-link" aria-label="Aller à la note de bas de page 5">↩︎</a></li><li id="b95106c9-785f-4f51-b34e-3c03333fe855"><strong>RSSI :</strong> Responsable Sécurité des Systèmes d&rsquo;Informations <a href="#b95106c9-785f-4f51-b34e-3c03333fe855-link" aria-label="Aller à la note de bas de page 6">↩︎</a></li><li id="b2786152-1f87-47e8-8a28-5972898c8603"><strong>DSI :</strong> Directeur des Systèmes d&rsquo;Informations <a href="#b2786152-1f87-47e8-8a28-5972898c8603-link" aria-label="Aller à la note de bas de page 7">↩︎</a></li><li id="a3dd87fb-6a5a-4a42-a687-4d4cc5987cdc"><strong>DG :</strong> Directeur Général <a href="#a3dd87fb-6a5a-4a42-a687-4d4cc5987cdc-link" aria-label="Aller à la note de bas de page 8">↩︎</a></li><li id="1721ce52-7980-4395-9564-0ae6b7a2198e"><strong>DAF :</strong> Directeur Administratif et Financier <a href="#1721ce52-7980-4395-9564-0ae6b7a2198e-link" aria-label="Aller à la note de bas de page 9">↩︎</a></li><li id="b66ce7ae-6091-4047-ac97-8f2722f359e9"><strong>PDG :</strong> Président Directeur Général <a href="#b66ce7ae-6091-4047-ac97-8f2722f359e9-link" aria-label="Aller à la note de bas de page 10">↩︎</a></li><li id="591af98b-59ee-4ce6-94dc-cf81b933aa08"><strong>BDD :</strong> Base De Données <a href="#591af98b-59ee-4ce6-94dc-cf81b933aa08-link" aria-label="Aller à la note de bas de page 11">↩︎</a></li></ol>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Projet &#8211; Passerelle VEEAMOne/ITOP</title>
		<link>https://erwanguillemard.com/projet-passerelle-veeamone-itop/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Tue, 12 Nov 2024 22:23:33 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[iTop]]></category>
		<category><![CDATA[Projet]]></category>
		<category><![CDATA[VEEAMONE]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=2428</guid>

					<description><![CDATA[Bien, ça fait un petit moment que j&#8217;avais ça en réserve et que je me devais de vous présenter ce petit projet. Cela m&#8217;a demandé du temps. Pourquoi vous demandez vous ? Excellente question à toi qui vient d&#8217;aborder la lecture de ce billet. La réponse est simple et s&#8217;articule en deux points. Laissez-moi donc...]]></description>
										<content:encoded><![CDATA[
<p>Bien, ça fait un petit moment que j&rsquo;avais ça en réserve et que je me devais de vous présenter ce petit projet. Cela m&rsquo;a demandé du temps. Pourquoi vous demandez vous ?</p>



<p>Excellente question à toi qui vient d&rsquo;aborder la lecture de ce billet. La réponse est simple et s&rsquo;articule en deux points. Laissez-moi donc les énumérer :</p>



<ul class="wp-block-list">
<li>J&rsquo;attendais impatiemment la sortie communautaire LTS<sup data-fn="f191d455-4717-4aaf-8ff4-82c9265b904b" class="fn"><a href="#f191d455-4717-4aaf-8ff4-82c9265b904b" id="f191d455-4717-4aaf-8ff4-82c9265b904b-link">1</a></sup> ITOP 3.2.X en lieu et place de la version 2.7.X (entre nous ITOP c&rsquo;est fait une sacrée beauté &lt;3)</li>



<li>J&rsquo;avais une flemme monstrueuse de remonter un ITOP from scratch, sur un environnement durci et configurer ce dernier pour « mon organisation »</li>
</ul>



<p>Bref, malgré un emploi du temps le jour bien remplie. Me voilà repris d&rsquo;insomnie et de doutes qu&rsquo;il faut ma foi bien occuper.</p>



<p class="has-text-align-center"><strong><em>Sinon, tu te la joues BOOMER qui raconte sa LIFE sur Facebook ? Tu vas nous parler de ton projet et de tes travaux ?</em></strong> <strong><em><a href="https://www.youtube.com/watch?v=hPpdJEMRGwE&amp;ab_channel=FranceInter">#RIENAFOUTRE</a></em></strong></p>



<p>Promis, j&rsquo;arrête pour au moins deux paragraphes&#8230; Je suis parti d&rsquo;une problématique professionnelle (qui n&rsquo;intéresse malheureusement que moi et non certains de mes pairs&#8230;), comment s&rsquo;assurer des états de notre outils de supervision (monitoring) et du bon traitement des alarmes avertissements ou erreurs remontées sur notre SI<sup data-fn="d7c86f1e-4938-4f27-a623-2239f16a69e6" class="fn"><a href="#d7c86f1e-4938-4f27-a623-2239f16a69e6" id="d7c86f1e-4938-4f27-a623-2239f16a69e6-link">2</a></sup> ?</p>



<p>Une première approche est de prendre un ETP<sup data-fn="f1d99d7a-2755-48a1-8e82-84bc9b93e4c0" class="fn"><a href="#f1d99d7a-2755-48a1-8e82-84bc9b93e4c0" id="f1d99d7a-2755-48a1-8e82-84bc9b93e4c0-link">3</a></sup> compétent et qui ne coute pas trop à la société, de le scotcher à une chaise devant la solution de monitoring et de l&rsquo;autoriser à dormir que lorsque tout est au vert fixe !</p>



<p>Cette première méthode est loin de plaire à nos amis syndicalistes, partisans du code du travail et certains RH.</p>



<p>Il y a donc une seconde approche, celle où les éditeurs de solution de surveillance des SIs partent du postulat que les alertes sont envoyées par courriel (hé oui je n&rsquo;ai pas écrit e-mail). Mais là encore, c&rsquo;est compliqué de ne pas se noyer dans la volumétrie des mails et de ne pas passer à côté d&rsquo;un événement important. Point positif, nous pouvons mettre plusieurs personnes/collaborateurs derrière une BAL<sup data-fn="0aa1a249-3ecf-41de-9099-f521c19d40af" class="fn"><a href="#0aa1a249-3ecf-41de-9099-f521c19d40af" id="0aa1a249-3ecf-41de-9099-f521c19d40af-link">4</a></sup>. Quoi que cela demande de la communication (et la communication dans une entreprise n&rsquo;est pas une compétence acquise de tous. Un peu comme la politesse&#8230;).</p>



<p>Et enfin, il y a la troisième approche. Qui arrive timidement par certains éditeurs de solution de supervision qui propose d&rsquo;interfacer leurs plateformes avec une solution de ticketing (souvent ITSM<sup data-fn="1fd80a16-6c1d-4153-90e3-0ecc9f956387" class="fn"><a href="#1fd80a16-6c1d-4153-90e3-0ecc9f956387" id="1fd80a16-6c1d-4153-90e3-0ecc9f956387-link">5</a></sup>). Là autant vous dire que je fais un gros cœur avec les mains devant mon écran. C&rsquo;est ainsi que dans un article précédent traitant de VEEAMOne (je n&rsquo;ai toujours pas d&rsquo;action qu&rsquo;on se le dise), VEEAMOne propose une connexion à la solution de ticketing ServiceNow. Franchement c&rsquo;est super, il n&rsquo;y a rien à faire sauf sortir le chéquier, changer de solution de ticketing si nous en avions déjà un, lancer des projets de migration&#8230; Bref ça me pose un problème car ce n&rsquo;est pas l&rsquo;outil que j&rsquo;utilise pour la gestion de mes tickets.</p>



<p>Là, encore une fois nous avons deux possibilités :</p>



<ul class="wp-block-list">
<li>Notre solution ITSM peut créer des tickets sur réception de notification mail. Soit de manière plus concrète avec un peu de paramétrage, nous allons faire créer une requête lors de la réception d&rsquo;un email d&rsquo;alerte ou d&rsquo;avertissement. (Perso, je ne suis pas fan de cette méthode).</li>



<li>Nous utilisons les APIs des deux solutions et nous développons une petite passerelle 🙂 (Perso j&rsquo;aime d&rsquo;avantage).</li>
</ul>



<p>Toutefois et comme c&rsquo;est la solution que je vais présenter il est important de comprendre avant d&rsquo;aller plus loin qu&rsquo;il y a des avantages et beaucoup de contraintes à développer une passerelle (entre nous, nous l&rsquo;appellerons GW<sup data-fn="25af4c42-afb9-44b3-9039-e222037b293e" class="fn"><a href="#25af4c42-afb9-44b3-9039-e222037b293e" id="25af4c42-afb9-44b3-9039-e222037b293e-link">6</a></sup> parce que c&rsquo;est un mot qui me soule à écrire. Hé oui au ch***e la loi Toubon ! Mais que de grossièreté !).</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>Avantages</strong></td><td class="has-text-align-center" data-align="center"><strong>Inconvénients</strong></td></tr><tr><td class="has-text-align-center" data-align="center">Langages libres<br>Découvertes techniques<br>Satisfaire l&rsquo;appétence techniques</td><td class="has-text-align-center" data-align="center">Avoir une documentation sur les deux APIs<br>MCO du code lors des montées de version<br>Bien penser son code<br>Penser générique</td></tr></tbody></table></figure>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="513" height="144" src="https://erwanguillemard.com/wp-content/uploads/2024/10/AP_010_002_GW.png" alt="" class="wp-image-2431" srcset="https://erwanguillemard.com/wp-content/uploads/2024/10/AP_010_002_GW.png 513w, https://erwanguillemard.com/wp-content/uploads/2024/10/AP_010_002_GW-300x84.png 300w" sizes="auto, (max-width: 513px) 100vw, 513px" /></figure>
</div>


<p class="has-text-align-center has-small-font-size"><em>Nous remarquerons l&rsquo;acquisition des compétences et maitrise de l&rsquo;application PAINT. Oui, j&rsquo;ai un doctorat en PAINT appliqué !</em></p>





<h2 class="wp-block-heading">Prérequis</h2>



<ul class="wp-block-list">
<li><strong>SE :</strong>&nbsp;Windows Server 2k19 et version ultérieures</li>



<li><strong>Apps :&nbsp;</strong>VEEAMOne 12.x, ITOP 3.2.X</li>



<li><strong>Autres :</strong>
<ul class="wp-block-list">
<li>PowerShell version 5 et ultérieures</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Avant-Propos</h2>



<p>Comme d&rsquo;habitude, je vais proposer ci-dessous un usage sécuriser de l&rsquo;outil. Je n&rsquo;ai pas la prétention toutefois de garantir un haut niveau de sécurité dans le code (ça fait longtemps et je suis un peu rouillé dans ce domaine).</p>



<p>J&rsquo;annonce en amont que le code source ne sera pas accessible sur le GitHub en libre accès. <strong>Ah ouai et pourquoi donc ?</strong></p>



<p>Je suis plutôt content de ce que j&rsquo;ai créé. Toutefois, je ne suis pas satisfait de la qualité du code et de certaines méthodes que j&rsquo;ai pu développer. Je pense qu&rsquo;un grand pas a été fait mais que cette aventure nécessite d&rsquo;être porté par et avec d&rsquo;autres personnes et ceux afin de proposer ce projet comme quelques choses d&rsquo;abouti et de communautaire. Mais voyez vous, je ne suis plus dev et je rentre sur un terrain et domaine ou le jugement est facile, faire un peu moins.</p>



<p>C&rsquo;est pourquoi, si vous êtes intéressé par ce projet, je suis à votre disposition pour échanger et collaborer sur ça factorisation et évolution.</p>



<p>Je vous rassure toutefois, je vais aller assez loin dans mes choix et dans la logique dont j&rsquo;ai construit cette GW. Sinon à quoi bon faire un article sur le sujet si ce n&rsquo;est que pour satisfaire une petit plaisir solitaire issue du fruit d&rsquo;une masturbation intellectuelle ?</p>



<h2 class="wp-block-heading">Théorie</h2>



<p>Je tiens à garder un format à peu près standard pour chacun de mes articles. Dans ce cas précis, nous considérons cette partie plus comme un cahier des charges et expressions des besoins. Naturellement, nous apporterons des réponses et solutions ce qui n&rsquo;est donc pas tout à fait juste un cahier des charges.</p>



<p>(Mais qu&rsquo;est-ce qu&rsquo;il peut être torturé ce garçon&#8230; Oui mais non ce n&rsquo;est pas ça, mais ça tout de même. Quelqu&rsquo;un veut-il prendre l&rsquo;initiative de lui mettre un coup de pelle derrière les oreilles pour qu&rsquo;il aille à l&rsquo;essentiel ?)</p>



<h3 class="wp-block-heading">Expression du besoin</h3>



<p>Bien, nous avons tous à ce jour des infrastructures virtualisées en local (onpremise) ou dans le cloud (privé ou public). En tant que fournisseur de service (Service Provider), je suis contraint de réaliser l&rsquo;exploitation de l&rsquo;ensemble de mon infrastructure hébergé chaque jour pour l&rsquo;ensemble de nos clients. Toutefois, mon périmètre est restreint aux services et infrastructures permettant d&rsquo;assurer le bon fonctionnement des environnements constituant notre infrastructure.</p>



<p>Comment s&rsquo;assurer que les serveurs clients ont bien leurs MCO<sup data-fn="f29fcc2d-94f5-4c52-9877-bad186eaca9c" class="fn"><a href="#f29fcc2d-94f5-4c52-9877-bad186eaca9c" id="f29fcc2d-94f5-4c52-9877-bad186eaca9c-link">7</a></sup> d&rsquo;effectuer par les équipes opérationnelles ? Comment s&rsquo;assurer que le responsable informatique effectue bien son MCO ?</p>



<p>Il est facile et malheureusement (je l&rsquo;ai constaté) il est facile de cacher des dysfonctionnements d&rsquo;exploitations aux yeux de l&rsquo;entreprise et de ces dirigeants. Un peu comme il est facile de cacher des cadavres dans les placards quand il n&rsquo;y a plus de place sous le tapis.</p>



<p>Possédant une solution ITSM/CMDB<sup data-fn="54fccf78-98cb-4623-8360-19b237ba2ba9" class="fn"><a href="#54fccf78-98cb-4623-8360-19b237ba2ba9" id="54fccf78-98cb-4623-8360-19b237ba2ba9-link">8</a></sup>, j&rsquo;ai nommé ITOP (là non plus je n&rsquo;ai pas d&rsquo;action), pourquoi ne pas faire remonter les éléments de notre supervision VEEAMOne dans ce dernier.</p>



<p>Cela permettrait de s&rsquo;assurer d&rsquo;être pro actif lors d&rsquo;un potentiel dysfonctionnement d&rsquo;exploitation (espace disque, consommation élevée de CPU, RAM etc.) et dans les cas les plus complexe de garder une trace du traitement et donc nourrir la base de connaissance de notre service IT ?</p>



<p>Il sera donc utile de définir un cycle de vie.</p>



<h3 class="wp-block-heading">Cahier des Charges</h3>



<p>Afin de répondre aux besoins, je prends le parti de ne pas développer de module directement côté ITOP, ni côté VEEAMOne.</p>



<p>Pourquoi ? ITOP n&rsquo;est pas pour moi une solution que je maitrise à 100% et cela demande des compétences WEB (HTML/CSS/PHP/JS et autres frameworks) que je ne possède pas. Côté VEEAMOne l&rsquo;application n&rsquo;est pas « ouverte ». Toutefois la solution que je souhaite proposer tend à une intégration côté VEEAMOne. Finalement, une fois que le code a été pondu une fois, il suffit de le traduire et l&rsquo;adapter dans un autre langage.</p>



<p>J&rsquo;ai choisi d&rsquo;utiliser en langage le framework .NET Powershell (version 5 et plus) afin d&rsquo;exécuter les opérations sur un un environnement Windows.</p>



<p>Le script sera utilisé sur un serveur Windows indépendant des deux solutions applicatives.</p>



<p>Dans un premier temps, le script sera utilisé de manière quotidienne une seule fois à 09h00. Aucun module d&rsquo;exception sera implémenté car rien ne justifie de ne pas faire remonter les alertes. Lors de la présence d&rsquo;une alerte dans la console de supervision, une alerte sera créée singulièrement avec pour contenu la dite alarme au format HTML 5.</p>



<p>Le demandeur du ticket sera un utilisateur identifié comme une service bot. Le ticket sera affecté au service IT compétent et identifié.</p>



<h4 class="wp-block-heading">Topographie &#8211; Infrastructure</h4>



<p>L&rsquo;infrastructure réseau est plutôt simple. Il suffira de prendre les ports par défaut si ces derniers n&rsquo;ont pas été modifiés (1239 pour accéder l&rsquo;API WEB de VEEAMOne et 443 pour accéder à l&rsquo;API d&rsquo;ITOP). Dans le cas contraire, il faudra chercher un dans les paramètres pour trouver l&rsquo;information.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="865" height="180" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_003_Topographie_network.png" alt="" class="wp-image-2441" style="width:485px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_003_Topographie_network.png 865w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_003_Topographie_network-300x62.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_003_Topographie_network-768x160.png 768w" sizes="auto, (max-width: 865px) 100vw, 865px" /></figure>
</div>


<p>Dans l&rsquo;idée, je souhaite tirer les informations et données du serveur VEEAMOne via le Serveur Tools et pousser les données vers le Serveur ITOP.</p>



<h4 class="wp-block-heading">Topographie &#8211; Applicative</h4>



<p>La logique de traitement a été identifié et pensé de la manière suivante (dans un premier temps car je pense perfectible la chose).</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="886" height="283" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_004_Topographie_applicative.png" alt="" class="wp-image-2443" style="width:560px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_004_Topographie_applicative.png 886w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_004_Topographie_applicative-300x96.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_004_Topographie_applicative-768x245.png 768w" sizes="auto, (max-width: 886px) 100vw, 886px" /></figure>
</div>


<p>Nous admirons le schéma pour apprendre à compter jusqu&rsquo;à 9 !</p>



<ul class="wp-block-list">
<li><strong>1</strong> : Appel API pour l&rsquo;ouverture de session de manière sécurisé et demande de récupération des données à collecter</li>



<li><strong>2</strong> : Autorisation de connexion et retour des données collectées ou non si absente</li>



<li><strong>3</strong> : Traitement des données brutes récupérées de VEEAMOne afin de faciliter la création des requêtes ITOP</li>



<li><strong>4</strong> : Appel API pour l&rsquo;ouverture de session de manière <mark style="background-color:rgba(0, 0, 0, 0);color:#fd0000" class="has-inline-color">NON sécurisé</mark><mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color">e</mark> (pour l&rsquo;instant) et demande de récupération des données nécessaires à la qualification des données à traiter</li>



<li><strong>5</strong> : Autorisation de connexion et retour des données demandées</li>



<li><strong>6</strong> : Création d&rsquo;une requête via API avec les informations traitées/extraites de VEEAMOne et les informations ITOP.</li>



<li><strong>7</strong> : Retour de la requête API, si cette dernière retourne un code différent de 0 il faudra se <a href="https://www.youtube.com/watch?v=XDVZoMlxzJA&amp;ab_channel=IsabelleAdjaniVEVO">plonger</a> dans la documentation et dans le MCD<sup data-fn="8cde5590-e181-4d7a-b4a4-ace5fddd45c0" class="fn"><a href="#8cde5590-e181-4d7a-b4a4-ace5fddd45c0" id="8cde5590-e181-4d7a-b4a4-ace5fddd45c0-link">9</a></sup> d&rsquo;ITOP.</li>



<li><strong>8</strong> : Appel d&rsquo;un stimulus par appel API pour assigner la requête à une équipe et respecter le cycle de vie ITOP.</li>



<li><strong>9</strong> : Comme pour l&rsquo;étape 7 il conviendra d&rsquo;être vigilant à l&rsquo;erreur retournée. Sans quoi, vous retourner avec ADJANI en case piscine.</li>
</ul>



<h4 class="wp-block-heading">Topographie &#8211; Logiciel</h4>



<p>Le script sera pensé de la manière suivante. Une partie exécutable permettant de réaliser l&rsquo;appel des différentes fonctions et l&rsquo;import des modules comportant les fonctions statiques.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="918" height="337" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_005_Topographie_logicielle.png" alt="" class="wp-image-2446" style="width:607px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_005_Topographie_logicielle.png 918w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_005_Topographie_logicielle-300x110.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_005_Topographie_logicielle-768x282.png 768w" sizes="auto, (max-width: 918px) 100vw, 918px" /></figure>
</div>


<p>En résumer, nous avons un fichier .ps1 qui va servir d&rsquo;exécutable et trois fichiers module powershell qui nous permettrons de réaliser distinctement les actions pour chacune des applications VEEAMOne et ITOP.</p>



<p><strong>Tain le mec nous dit plus haut avec un air supérieur qu&rsquo;il va nous apprendre à compter jusqu&rsquo;à 9 et là il nous dit 3 fichiers pour 2 applications. Tu nous prendrais pas par hasard pour des raclures de bidets ?</strong></p>



<p>C&rsquo;est juste et c&rsquo;est bien l&rsquo;effet souhaité. Je me suis aperçu avec le temps que la génération de rapport en HTML pesait lourd dans les fonctions ou dans les modules et qu&rsquo;il ne serait pas déconnant de dédier un module à la partie HTML. De plus un rapport nous pouvons considérer celui-ci comme immuable dans le temps. Donc il peut être qualifié comme module. 🙂 <a href="https://www.youtube.com/watch?v=u8ccGjar4Es&amp;ab_channel=Psychostick">Soit en conclusion 2+1 = 3. Mais n&rsquo;allons pas plus loin.</a></p>



<p>Et si nous regardions ce qu&rsquo;il y a dans le ventre des 3 modules ? Oui mais gros malin, tu nous as dit que tu ne voulais pas partager ton code. Tu vas faire comment ? Hé bien dirons nous que cela revient à regarder un porno sur CANAL+ sans abonnement (époque que certains lecteurs ne connaitront jamais). On devine, mais personne n&rsquo;en profite vraiment (où alors vous êtes des grands malades !).</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id2428_1711b0-ca kt-accordion-has-3-panes kt-active-pane-0 kt-accordion-block kt-pane-header-alignment-left kt-accodion-icon-style-basic kt-accodion-icon-side-right" style="max-width:none"><div class="kt-accordion-inner-wrap" data-allow-multiple-open="false" data-start-open="none">
<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-1 kt-pane2428_c24b5a-2e"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">SS_039_1_COMBODO_itop_api.psm1</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Le module est constitué de 6 fonctions. Nous noterons le camouflage de deux informations capitales (d&rsquo;où le NON sécurisée plus haut). Il faudrait avec un peu d&rsquo;huile de coude que je modifie le code pour que ce dernier gère l&rsquo;authentification via la fonctionnalité CLIXML. Promis je travaille dessus.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="789" height="353" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_006_Module_ITOP.png" alt="" class="wp-image-2448" style="width:668px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_006_Module_ITOP.png 789w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_006_Module_ITOP-300x134.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_006_Module_ITOP-768x344.png 768w" sizes="auto, (max-width: 789px) 100vw, 789px" /></figure>
</div>


<p>Il existe deux versions de ce module. Une version compatible ITOP 2.7.X LTS et une version ITOP 3.2.X LTS. La fonction API propre à la création d&rsquo;une requête diffère entre ces deux versions.</p>



<ul class="wp-block-list">
<li><strong>formatItopNumberCustomer</strong> : Fonction qui permet de récupérer le nom et le numéro identifiant le client dans le cas où le format est du type XX-CUSTOMER. Cette fonction est plus orientée dans le cas de Service Provider. Mais qui peut le plus peu le moins c&rsquo;est pourquoi la fonction est présente par défaut</li>



<li><strong>Invoke-RestiTopMethod</strong> : Fonction qui permet de réaliser l&rsquo;appel API</li>



<li><strong>Get-REST_API_iTop</strong> : Fonction qui permet de réaliser des requêtes de type CORE/GET à notre instances ITOP</li>



<li><strong>Get-Organization</strong> : Permet de récupérer la liste des organisations présentes dans ITOP et ceux pour pouvoir créer les requêtes dans la bonne organisation</li>



<li><strong>CreateRequest-REST_API_ITOP</strong> : Fonction qui permet de réaliser des requêtes de type CORE/CREATE à notre instances ITOP pour créer une requête</li>



<li><strong>ApplyStimulus-REST_API_ITOP</strong> : Fonction qui permet de réaliser des requêtes de type CORE/APPLY_STIMULUS à notre instances ITOP pour assigner un état à notre requête créé précédemment</li>
</ul>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane2428_992d3f-fc"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">SS_039_1_HTML_report.psm1</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Le module est constitué de 2 fonctions.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="348" height="139" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_006_Module_HTML.png" alt="" class="wp-image-2450" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_006_Module_HTML.png 348w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_006_Module_HTML-300x120.png 300w" sizes="auto, (max-width: 348px) 100vw, 348px" /></figure>
</div>


<ul class="wp-block-list">
<li><strong>Set-ITOP_HTML-VEEAMONEREPORT</strong> : Fonction qui prend un certain nombre d&rsquo;argument en paramètre afin d&rsquo;établir le rapport HTML qui sera poussé dans le corps de notre requête ITOP</li>



<li><strong>Set-ITOP_HTML-ErrorReport</strong> : Fonction qui prend un certain nombre d&rsquo;argument en paramètre afin d&rsquo;établir le rapport HTML d&rsquo;erreur qui sera poussé dans le corps de notre requête ITOP dans le cas où la fonction initiale n&rsquo;a pas pu aboutir</li>
</ul>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane2428_eb27a0-ed"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">SS_039_1_VEEAM_One_api.psm1</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Nous retrouvons sensiblement les mêmes fonctions que dans le module dédié à ITOP. Bien qu&rsquo;à l&rsquo;inverse, je n&rsquo;ai pas été fainéant car la gestion de l&rsquo;authentification est sécurisée pour VEEAMOne&#8230;</p>



<p>Passons, le module est composé de 9 fonctions.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="576" height="408" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_006_Module_VEEAMOne.png" alt="" class="wp-image-2451" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_006_Module_VEEAMOne.png 576w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_006_Module_VEEAMOne-300x213.png 300w" sizes="auto, (max-width: 576px) 100vw, 576px" /></figure>
</div>


<ul class="wp-block-list">
<li><strong>Invoke-RestVEEAMOneMethod</strong> : Fonction qui permet de réaliser l&rsquo;appel API</li>



<li><strong>Connect-VEEAMOneAPI</strong> : Fonction qui permet d&rsquo;établir la connexion au webservice VEEAMOne</li>



<li><strong>Disconnection-VEEAMOneAPI</strong> : Fonction qui permet de cloturer la connexion au webservice VEEAMOne</li>



<li><strong>Get-ServerInformations</strong> : Fonction qui permet de retourner les informations du serveur VEEAMOne</li>



<li><strong>Get-Sessions</strong> : Fonction qui permet de retourner l&rsquo;ID de la session en cours</li>



<li><strong>Get-AllAlarms</strong> : Fonction qui permet de retourner toutes les alarmes en cours sur l&rsquo;application VEEAMOne à tous les niveaux Infrastructures à Backup de l&rsquo;hôte jusqu&rsquo;au VMs</li>



<li><strong>Get-License</strong> : Fonction qui permet de retourner les informations relatives aux licences</li>



<li><strong>VEEAMONE_Extract_Informations</strong> : Fonction qui permet de traiter les informations retournées précédemment et de consolider ces dernières</li>



<li><strong>Get-VEEAMONE_GlobalDataObject</strong> : Fonction qui appel la fonction précédente pour consolider le retour dans un seul objet</li>
</ul>
</div></div></div>
</div></div></div>



<h4 class="wp-block-heading">Sécurité</h4>



<p>La partie sécurité est un vrai enjeu. Je n&rsquo;ai malheureusement pas implémenté dans cette version à ce moment (version 1.3) la redirection des sorties dans un fichier de log. J&rsquo;ai gardé le mode debug, mais cela ne sera viable sur le long terme pour assurer un support adéquat.</p>



<p>Il en va de soi que nous avons besoin de 3 comptes en nous basant sur le principe de RBAC<sup data-fn="0290669f-efb9-4ab6-a7b3-b4f7eff01b1c" class="fn"><a href="#0290669f-efb9-4ab6-a7b3-b4f7eff01b1c" id="0290669f-efb9-4ab6-a7b3-b4f7eff01b1c-link">10</a></sup>.</p>



<ul class="wp-block-list">
<li><strong>VEEAMOne</strong> : Un compte permettant d&rsquo;accéder à l&rsquo;application en API en pouvant réaliser des requêtes. Donc membre du <strong><em>GLS VEEAM ONE Administrator</em></strong> par chance, le serveur étant joint au domaine, il suffira de peupler le bon GGS. Néanmoins, ce compte doit être vu comme un compte de service. Donc à restreindre dans les règles de l&rsquo;art pour empêcher toutes ouvertures de sessions</li>



<li><strong>ITOP</strong> : Le compte doit être protégé par un mot de passe robuste. Ce dernier doit avoir obligatoirement les profils <strong>Administrator</strong> et <strong>REST Services User</strong>. Ce compte devant accéder à l&rsquo;ensemble des données cela justifie le profil Administrator.</li>



<li><strong>Compte de Service</strong> : Il va être nécessaire d&rsquo;utiliser un compte de service pour exécuter notre tâche. Je préfère dans un premier temps passer par un compte utilisateur du domaine restreint plutôt que par un gMSA<sup data-fn="80135d95-15b4-4cd0-a0ec-c8ffde965f4b" class="fn"><a href="#80135d95-15b4-4cd0-a0ec-c8ffde965f4b" id="80135d95-15b4-4cd0-a0ec-c8ffde965f4b-link">11</a></sup></li>
</ul>



<p>Il faut également se poser la question du répertoire où va être stocké et appelé les scripts. Je ne préfère pas stocker ce dernier sur un partage réseau mais en local sur la partition système. Toutefois, je retire l&rsquo;accès du groupe utilisateur et ajoute la lecture et exécution uniquement sur le GLS des comptes de services restreints.</p>



<p>Il en sera de même pour le répertoire <strong>_auth</strong> qui va contenir l&rsquo;ensemble des éléments sécurisés d&rsquo;accès aux ressources via CLIXML.</p>



<p>Je pense qu&rsquo;avec toutes ces informations nous devrions être en capacité de réaliser le paramétrage nécessaire pour une implémentation.</p>



<h2 class="wp-block-heading">Pratiques</h2>



<p>L&rsquo;implémentation se déroulera en quatre mouvements (comme une <a href="https://www.youtube.com/watch?v=Rd0HnxWm5CY&amp;ab_channel=DWClassicalMusic">symphonie</a>), c&rsquo;est à dire le paramétrage des solutions et création des comptes, le paramétrage du script, la mise en place de la tâche planifiée et pour finir les tests de bon fonctionnement.</p>



<h3 class="wp-block-heading">Paramétrages des solutions &amp; création des accès</h3>



<h4 class="wp-block-heading">VEEAMOne</h4>



<p>Pour l&rsquo;application VEEAMOne, il n&rsquo;y a pas grand chose à faire. Tout va se faire au niveau de la création d&rsquo;un utilisateur dans notre Active Directory.</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id2428_5dc585-d8 kt-accordion-has-2-panes kt-active-pane-0 kt-accordion-block kt-pane-header-alignment-left kt-accodion-icon-style-basic kt-accodion-icon-side-right" style="max-width:none"><div class="kt-accordion-inner-wrap" data-allow-multiple-open="false" data-start-open="none">
<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-1 kt-pane2428_bf6ff7-17"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">1 &#8211; Création de l&rsquo;utilisateur</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Créer un utilisateur qui devra être utilisateur du domaine.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="753" height="565" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_007_VEEAMOne_User.png" alt="" class="wp-image-2455" style="width:532px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_007_VEEAMOne_User.png 753w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_007_VEEAMOne_User-300x225.png 300w" sizes="auto, (max-width: 753px) 100vw, 753px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane2428_b590a6-f4"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">2 &#8211; Assignation à un groupe</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Afin de limiter les risques au maximum, nous allons ajouter notre utilisateur au groupe de service pour restreindre le périmètre d&rsquo;attaque de ce compte.</p>



<p>Nous allons également ajouter ce dernier en tant que membre du GLS VEEAM One Administrator qui est membre du groupe local de notre serveur VEEAMOne.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="498" height="479" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_008_VEEAMOne_Group.png" alt="" class="wp-image-2456" style="width:367px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_008_VEEAMOne_Group.png 498w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_008_VEEAMOne_Group-300x289.png 300w" sizes="auto, (max-width: 498px) 100vw, 498px" /></figure>
</div></div></div></div>
</div></div></div>



<p></p>



<p>Bien, passons à ITOP.</p>



<h4 class="wp-block-heading">ITOP</h4>



<p>Contrairement à VEEAMOne, il va falloir réaliser un certain nombre de modification sur notre ITOP.</p>



<p>La création d&rsquo;un ticket nécessite plusieurs champs :</p>



<ul class="wp-block-list">
<li>Le client</li>



<li><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">Un demandeur</mark></li>



<li>L&rsquo;origine</li>



<li>Le titre</li>



<li>Le corps</li>



<li><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">Le service</mark></li>



<li>Type de Requête</li>



<li>L&rsquo;impact</li>



<li>L&rsquo;urgence</li>



<li>La priorité</li>



<li><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">L&rsquo;Equipe de contact</mark></li>
</ul>



<p>Nous allons avoir besoin de nous assurer de la bonne existence des champs ci-haut en vert. Dans le cas contraire, il faudra créer ces derniers.</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id2428_2cac9a-af kt-accordion-has-4-panes kt-active-pane-0 kt-accordion-block kt-pane-header-alignment-left kt-accodion-icon-style-basic kt-accodion-icon-side-right" style="max-width:none"><div class="kt-accordion-inner-wrap" data-allow-multiple-open="false" data-start-open="none">
<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-1 kt-pane2428_69acff-fd"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">1 &#8211; Personne</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner"><div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="388" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_009_ITOP_Personn-1024x388.png" alt="" class="wp-image-2458" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_009_ITOP_Personn-1024x388.png 1024w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_009_ITOP_Personn-300x114.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_009_ITOP_Personn-768x291.png 768w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_009_ITOP_Personn.png 1514w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane2428_7ce1ca-20"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">2 &#8211; Compte utilisateur</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner"><div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="568" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_012_ITOP_CompteUtilisateur-1024x568.png" alt="" class="wp-image-2459" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_012_ITOP_CompteUtilisateur-1024x568.png 1024w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_012_ITOP_CompteUtilisateur-300x166.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_012_ITOP_CompteUtilisateur-768x426.png 768w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_012_ITOP_CompteUtilisateur.png 1069w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane2428_7ea98e-82"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">3 &#8211; Services</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner"><div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="443" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_010_ITOP_Services-1024x443.png" alt="" class="wp-image-2460" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_010_ITOP_Services-1024x443.png 1024w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_010_ITOP_Services-300x130.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_010_ITOP_Services-768x332.png 768w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_010_ITOP_Services.png 1498w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane2428_4ad432-b7"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">4 &#8211; Contact</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner"><div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="296" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_011_ITOP_EquipeInterne-1024x296.png" alt="" class="wp-image-2461" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_011_ITOP_EquipeInterne-1024x296.png 1024w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_011_ITOP_EquipeInterne-300x87.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_011_ITOP_EquipeInterne-768x222.png 768w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_011_ITOP_EquipeInterne.png 1508w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div></div></div></div>
</div></div></div>



<h3 class="wp-block-heading">Paramétrage du script</h3>



<p>Encore une fois, pourquoi nous narguer avec ton script si tu nous en donnes pas l&rsquo;accès ? Tu connais l&rsquo;histoire de <a href="https://www.youtube.com/watch?v=KLhOa5Jm1js&amp;ab_channel=Gojira">Marie-Antoinette</a> ?</p>



<p>Je le redis, ma décision de ne pas lever le voile maintenant n&rsquo;est pas définitive et je préfère anticiper lorsque celui-ci deviendrait accessible de tous. Toutefois avec les éléments déjà communiqués il est aisé de faire du reverse engineering.</p>



<p>Certaines variables sont donc à définir. Il serait plus aisé de créer un fichier xml (pour les jeunes dinosaures comme moi à défaut d&rsquo;un fichier ini pour les vieux dinosaures) ou d&rsquo;un fichier json (pour la nouvelle génération) pour gérer la configuration de l&rsquo;outil. M&rsquo;enfin, je ne suis que sur une version 1.3 et je dois monter en compétence dans certain domaine. Le temps étant toujours l&rsquo;éternel problème&#8230;</p>



<p>Applicable pour la version 1.3</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id2428_2ea77b-68 kt-accordion-has-3-panes kt-active-pane-0 kt-accordion-block kt-pane-header-alignment-left kt-accodion-icon-style-basic kt-accodion-icon-side-right" style="max-width:none"><div class="kt-accordion-inner-wrap" data-allow-multiple-open="false" data-start-open="0">
<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-1 kt-pane2428_88c9ca-f7"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">1 &#8211; SS_039_1.0_ConnectorVEEAMOne-ITOP.ps1</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>On ne touche pas la première ligne, sauf si les modules changent. Je choisie de gérer le chargement des modules à travers le script.</p>



<p>La seconde ligne se trouve être tout simplement le chemin absolu où va être stocké notre script.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="741" height="73" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_101_ITOP_ps1conf.png" alt="" class="wp-image-2463" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_101_ITOP_ps1conf.png 741w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_101_ITOP_ps1conf-300x30.png 300w" sizes="auto, (max-width: 741px) 100vw, 741px" /></figure>
</div>


<p>La variable $_const_defaultItopOrganisation doit contenir le nom de l&rsquo;organisation ITOP par défaut. Dans le cas d&rsquo;un fonctionnement en tant que Service Providers, l&rsquo;outil basculera vers dans une autre condition. Si l&rsquo;organisation client n&rsquo;est pas trouvé, l&rsquo;incident sera remonté directement dans l&rsquo;organisation par défaut.</p>



<p>Il en est de même pour la variable $_const_defaultTeam_from_defaultOrganization qui va contenir l&rsquo;équipe pour qui le ticket va être assigné. Dans le cas contraire, l&rsquo;équipe sera définie sur une valeur en dur dans le code.</p>



<p>Nous ne touchons pas au format date.</p>



<p>Plus loin dans le script nous trouvons les variables liées au system notamment pour la partie authentification.</p>



<p>Il sera nécessaire de modifier le nom du domaine, le compte qui va être utilisé pour établir la connexion à l&rsquo;application VEEAMOne. De renseigner le chemin absolu où va être stocké le fichier CLIXML pour l&rsquo;authentification.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="620" height="58" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_102_ITOP_ps1conf.png" alt="" class="wp-image-2464" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_102_ITOP_ps1conf.png 620w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_102_ITOP_ps1conf-300x28.png 300w" sizes="auto, (max-width: 620px) 100vw, 620px" /></figure>
</div>


<p>Je ferai un article sur les différentes gestions des credentials et moyen d&rsquo;authentification en powershell à l&rsquo;avenir car je pense utile pour moi de connaitre l&rsquo;ensemble des méthodes et de faire un rapide feedback. Décidemment, le respect de la loi allgood est <a href="https://www.youtube.com/watch?v=qfqA1sTKhmw&amp;ab_channel=Palmashow">dead</a> là !</p>



<p>Bref, je reviendrai sur ce point plus tard, mais dans le cas d&rsquo;un dysfonctionnement d&rsquo;authentification il suffira de supprimer le fichier xml.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane2428_dedfde-4e"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">2 &#8211; SS_039_1_VEEAM_One_api.psm1</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Dans le fichier de module propre à VEEAMOne il faut regarder les lignes suivantes.</p>



<p><mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color">STOP ! RED FLAGS !!</mark> Depuis quand on balance des variables dans un fichier module ou header (.h représente !) gros cochon ! <em>Si l&rsquo;indien ou le vieux VERMEU te voyaient, tu ne convoiterais pas comme ça cette banane !</em></p>



<p>Oui je sais, pour le coup j&rsquo;ai fait de la merde par paquet de 10 et c&rsquo;est dégeulasse Mais avec ça je suis au moins certain que ce n&rsquo;est pas du chat GPT ! Je vous explique l&rsquo;hérésie. J&rsquo;ai d&rsquo;abord fait le code en ps1 (version 1.0) puis je me suis dit que l&rsquo;architecture n&rsquo;était pas la bonne. J&rsquo;ai donc refactorisé une partie du code mais pas tout. Ce heurte alors à la portabilité des variables, les appels et le transfert d&rsquo;argument&#8230; J&rsquo;ai fait comme d&rsquo;habitude. <a href="https://www.youtube.com/watch?v=JmghDKkeiik&amp;ab_channel=bref.">Je remets à demain, qui le remet à plus tard, mais pas à jamais&#8230;</a></p>



<p>Enfin, passons et regardons ce qui doit être modifié</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="541" height="74" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_103_ITOP_psm1V1_conf.png" alt="" class="wp-image-2465" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_103_ITOP_psm1V1_conf.png 541w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_103_ITOP_psm1V1_conf-300x41.png 300w" sizes="auto, (max-width: 541px) 100vw, 541px" /></figure>
</div>


<p>Préciser dans la première ligne l&rsquo;url de notre serveur VEEAMOne. Ne pas oublier d&rsquo;ouvrir les flux si besoin et de bien commencer par <strong>https://</strong> et terminer par <strong>/api</strong>.</p>



<p>Pour le reste, pas besoin de toucher 🙂</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane2428_91e4f8-3e"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">3 &#8211; SS_039_1_COMBODO_itop_api.psm1</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Idem que pour le volet précédent concernant le module VEEAMOne, c&rsquo;est à gerber&#8230; Mais c&rsquo;est comme ça et dans la vie il faut savoir serrer les dents et garder les gros morceaux (si vous avez l&rsquo;image, oui c&rsquo;est hard et dégelasse).</p>



<p>Mais comme présenté plus haut, c&rsquo;est encore plus insupportable car le couple d&rsquo;authentification à ITOP est en clair dans le fichier&#8230;</p>



<p>Oui je vais corriger ça. 🙂 Mais regardons tout de même les variables à adapter.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="766" height="87" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_104_ITOP_psm1V1_conf.png" alt="" class="wp-image-2469" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_104_ITOP_psm1V1_conf.png 766w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_104_ITOP_psm1V1_conf-300x34.png 300w" sizes="auto, (max-width: 766px) 100vw, 766px" /></figure>
</div>


<p>Dans la première ligne relative à l&rsquo;url, modifier portail.erwanguillemard.com:443 par votre url en spécifiant le port. Naturellement si vous êtes en HTTPS pas besoin de préciser le port.</p>



<p>Préciser la version de l&rsquo;API, le compte utilisateur créé précédemment (celui avec le profil REST) ainsi que son mot de passe.</p>



<p>Laissez la varibale d&rsquo;outfields à *. Sans quoi vous ne retournerez pas l&rsquo;ensemble de tous les attributs lors des appels API.</p>
</div></div></div>
</div></div></div>



<h3 class="wp-block-heading">Sécurité</h3>



<p>Deux aspects sont à considérer sur ce point. Je ne traiterai pas de la partie gMSA car cela fera le biais d&rsquo;un autre billet.</p>



<ul class="wp-block-list">
<li>Qui peut accéder au répertoire scripts ?</li>



<li>Qui peut accéder au fichier permettant l&rsquo;authentification ?</li>
</ul>



<p>A ces deux questions, je répondrai uniquement les utilisateurs administrateurs du domaines et local de notre serveur en contrôle total ainsi que le groupe de services en lecture exécutions et écritures uniquement sur le répertoire _auth. Oui sinon comment exporter le fichier xml ?</p>



<p>Ainsi, nous passerions des droits suivants :</p>



<figure class="wp-block-table aligncenter"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>Avant</strong></td><td class="has-text-align-center" data-align="center"><strong>Après</strong></td></tr><tr><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="350" height="145" class="wp-image-2471" style="width: 350px;" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_105_beforeACL.png" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_105_beforeACL.png 726w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_105_beforeACL-300x124.png 300w" sizes="auto, (max-width: 350px) 100vw, 350px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="350" height="150" class="wp-image-2472" style="width: 350px;" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_106_afterACL.png" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_106_afterACL.png 731w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_106_afterACL-300x129.png 300w" sizes="auto, (max-width: 350px) 100vw, 350px" /></td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Taches Planifiées</h3>



<p>Pour la tache planifiée, rien de plus simple il suffit de suivre le vieux Raffiki (ou <a href="https://www.abcduvin.com/index.php/term/1,2703.xhtml">Riquiqui</a> mais à trop le suivre celui là on peut <a href="https://www.youtube.com/watch?v=Gk9rW4q7y8Q&amp;ab_channel=chance">terminer mal mon copaing</a>), il connait le chemin.</p>



<p>Néanmoins, j&rsquo;ai buté et bute encore sur un os. Je vous ai cassé les pieds avec le CLIXML pour sécuriser l&rsquo;authentification ? Et bien cela se retourne contre moi&#8230; Mais pourquoi donc ?</p>



<p>Le principe du chiffrement via CLIXML repose sur l&rsquo;usage d&rsquo;une <strong>SecureString</strong> au sens .NET du terme. Pour assurer ce chiffrement, le système utilise l&rsquo;information de la session utilisateur ainsi que du SE. Or pour déchiffrer l&rsquo;information il faut donc que les conditions de chiffrement soient présente (évident <em>Capt&rsquo;ain Obivous</em>).</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>Chiffrement</strong></td><td class="has-text-align-center" data-align="center"><strong>Déchiffrement</strong></td></tr><tr><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="350" height="272" class="wp-image-2477" style="width: 350px;" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_110_import.png" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_110_import.png 451w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_110_import-300x233.png 300w" sizes="auto, (max-width: 350px) 100vw, 350px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="350" height="269" class="wp-image-2478" style="width: 350px;" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_111_export.png" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_111_export.png 461w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_111_export-300x230.png 300w" sizes="auto, (max-width: 350px) 100vw, 350px" /></td></tr></tbody></table></figure>



<p>Sauf que dans notre contexte et avec les moyens mise en œuvre pour sécuriser le compte de service nous nous retrouvons avec un usage batard&#8230; Effectivement, même si la tache planifiée utilise le bon compte, cette dernière est planifié dans une autre session. Ce qui nous retourne une erreur « bête » de déchiffrement&#8230; (POWNED mon gars).</p>



<p>Paradoxalement, si nous appelons le script en dehors de la tâche planifiée, ce dernier fonctionne sans problème. J&rsquo;ai déjà des idées et piste pour prendre pleine possession du sujet. Il faut contacter MARSHAL 🙂</p>



<p>Finalement, pas besoin de MARSHAL, après plusieurs semaines (en réalité ça fait 2 ans que je cherche&#8230; Mais chut !) je suis tombé dans les méandres d&rsquo;une discussion entre deux developper .NET dans le cadre d&rsquo;une autre projet sur cet problématique. Le post datant de 2015, en tant normal je passe alégrement mon chemin, mais là j&rsquo;ai lu la problématique et la démarche pour tenter de résoudre cette dernière. La théorie est bonne, mais semblait incomplète. Et pour le coup elle était bien incomplète. Tout est une histoire de contexte.</p>



<p>La génération du fichier chiffré (Export-CLIXML) ne doit pas être fait dans la session utilisateur, mais dans le contexte de l&rsquo;utilisateur. Et donc ? Et donc chers amis, il est nécessaire de générer le fichier depuis la tâche la première fois en demandant au préalable la saisie des credentials par l&rsquo;utilisateur. De cette manière, même avec ma session qui a servi à l&rsquo;exécution, je ne peux pas déchiffrer le contenu du fichier (fallait y penser).</p>



<p>Poussant le vice plus loin, cela fonctionne avec mon compte de service, mais également avec un compte de type MSA<sup data-fn="1efa48a9-bd98-4fd0-8da2-65480836c319" class="fn"><a href="#1efa48a9-bd98-4fd0-8da2-65480836c319" id="1efa48a9-bd98-4fd0-8da2-65480836c319-link">12</a></sup>. Pour plus de détail, je vous laisse me contacter 😉</p>



<p>M&rsquo;enfin comme dirait Gaston LAGAFFE, je pose tout de même les paramètres de la tâche planifiée ici.</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id2428_25d085-26 kt-accordion-has-5-panes kt-active-pane-0 kt-accordion-block kt-pane-header-alignment-left kt-accodion-icon-style-basic kt-accodion-icon-side-right" style="max-width:none"><div class="kt-accordion-inner-wrap" data-allow-multiple-open="false" data-start-open="none">
<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-1 kt-pane2428_9751bb-01"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">1 &#8211; Général</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner"><div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="634" height="486" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk1.png" alt="" class="wp-image-2479" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk1.png 634w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk1-300x230.png 300w" sizes="auto, (max-width: 634px) 100vw, 634px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane2428_72dc40-33"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">2 &#8211; Trigger</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner"><div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="641" height="521" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk2.png" alt="" class="wp-image-2480" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk2.png 641w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk2-300x244.png 300w" sizes="auto, (max-width: 641px) 100vw, 641px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane2428_c455ea-29"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">3 &#8211; Action</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner"><div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="634" height="484" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk3.png" alt="" class="wp-image-2481" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk3.png 634w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk3-300x229.png 300w" sizes="auto, (max-width: 634px) 100vw, 634px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane2428_6c3bef-f4"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">4 &#8211; Conditions</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner"><div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="635" height="484" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk4-1.png" alt="" class="wp-image-2484" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk4-1.png 635w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk4-1-300x229.png 300w" sizes="auto, (max-width: 635px) 100vw, 635px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-5 kt-pane2428_9ee5ef-75"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">5 &#8211; Settings</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner"><div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="639" height="486" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk5-1.png" alt="" class="wp-image-2485" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk5-1.png 639w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_107_tsk5-1-300x228.png 300w" sizes="auto, (max-width: 639px) 100vw, 639px" /></figure>
</div></div></div></div>
</div></div></div>



<p></p>



<p>En truandant la chose (comprendre en insérant le password en dur et en clair), c&rsquo;est ok.</p>



<h3 class="wp-block-heading">Tests et Debug</h3>



<p>Nous n&rsquo;allons pas nous mentir, une petite fonction ou menu de debug ne serait pas du luxe. Je me le note c&rsquo;est promis. (T&rsquo;ain, il y a du pain sur la planche d&rsquo;ici Noël&#8230;).</p>



<p>Allons jeter un œil <a href="https://www.youtube.com/watch?v=sFsKTkrOIps&amp;ab_channel=InaChansons"><s>du côté de chez Swann</s></a> euh de notre ITOP pardon dans la vue des tickets en cours. Oui j&rsquo;ai aussi du travail sur mon infra @home. 🙂 Mais cela nous montre l&rsquo;intérêt de la solution ?</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="291" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_108_global-1024x291.png" alt="" class="wp-image-2487" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_108_global-1024x291.png 1024w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_108_global-300x85.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_108_global-768x218.png 768w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_108_global-1536x437.png 1536w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_108_global.png 1565w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Et si nous regardons une requête plus en détail ?</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="611" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_108_detail-1024x611.png" alt="" class="wp-image-2486" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_108_detail-1024x611.png 1024w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_108_detail-300x179.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_108_detail-768x459.png 768w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_108_detail.png 1422w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Nous retrouvons la valeur des attributs renseignés précédemment dans notre appel API. Le ticket est bien assigné à notre organisation <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">00-RONELAB</mark>, le demandeur est le <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">Service VEEAMONE</mark>. La requête est dans l&rsquo;état <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">Assignée</mark> à une équipe <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">Equipe Interne</mark> depuis l&rsquo;origine <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">Supervision</mark>. La catégorie de Service est <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">SE</mark> etc. Nous retrouvons également dans le corps de notre requête l&rsquo;ensemble des <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">informations contextuelles</mark> dans la première et seconde ligne puis le <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">détail de l&rsquo;erreur</mark> dans la troisième ligne.</p>



<p>Oui mais si ça ne fonctionne pas, tu debugs comment ?</p>



<p>Pour le coup, il nous suffira de lire les retours des calls API d&rsquo;ITOP. Si c&rsquo;est 0 tu exaltes de joie si c&rsquo;est 100 tu lis gentiment le message d&rsquo;insultes et tu corriges. Dans la grande majorité des cas les erreurs résultent d&rsquo;une modification côté ITOP d&rsquo;une valeur attendue ou d&rsquo;une valeur manquante.</p>



<p>Je vous glisse un exemple ci-dessous du script en mode debug sur la création d&rsquo;une requête à la suite d&rsquo;une alarme VEEAMOne.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="449" src="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_109_tsk5-1024x449.png" alt="" class="wp-image-2488" style="width:840px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_109_tsk5-1024x449.png 1024w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_109_tsk5-300x132.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_109_tsk5-768x337.png 768w, https://erwanguillemard.com/wp-content/uploads/2024/11/AP_010_109_tsk5.png 1249w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>Dans le bloc jaune, nous avons la création du ticket. Nous voyons clairement le retour <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">code=0</mark> nous informant que l&rsquo;opération de création c&rsquo;est bien passé. Notre ticket est donc dans l&rsquo;état « Nouveau ». Dans le bloc rouge qui gère l&rsquo;assignation de notre requête (pour respecter le cycle de vie) nous constatons que nous avons une erreur qui est retourné lors de notre appel API, présence d&rsquo;une insulte et d&rsquo;un <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">code=100</mark>. Etrangement, la requête échoue mais le ticket est bien assigné. Au vu du message, la requête est incomplète ou doit comporter une erreur de syntaxe. A creuser&#8230; 🙂</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>La supervision comme nous le savons déjà offre une bonne vision de l&rsquo;état de santé de notre système d&rsquo;information. Cependant, il résulte lors d&rsquo;incidents ou de dysfonctionnements légers d&rsquo;exploitation un manque de suivi quant à leur résolution. Certes, un dysfonctionnement d&rsquo;espace disque sur une VM<sup data-fn="d45a292e-81b8-49a9-9313-85d6dc8e238d" class="fn"><a href="#d45a292e-81b8-49a9-9313-85d6dc8e238d" id="d45a292e-81b8-49a9-9313-85d6dc8e238d-link">13</a></sup> n&rsquo;apporte pas d&rsquo;information technique quant à sa résolution. A l&rsquo;inverse, un dysfonctionnement de synchronisation DRS<sup data-fn="64f0d887-4193-4ca4-b5fb-28e45b10840e" class="fn"><a href="#64f0d887-4193-4ca4-b5fb-28e45b10840e" id="64f0d887-4193-4ca4-b5fb-28e45b10840e-link">14</a></sup> qui nécessite de toucher au service vpxuser nécessite de nourrir la base de connaissance et de garder une trace dans la solution ITSM.</p>



<p>Vous êtes efficaces ? Soyons efficients ! L&rsquo;avantage d&rsquo;une passerelle applicative permet de se focaliser sur un point d&rsquo;entrée unique et donc d&rsquo;être réactif. Attention cela ne veut pas dire qu&rsquo;il ne faut pas regarder les autres consoles.</p>



<p>Il sera également intéressant de mesurer la volumétrie de requête créé et de se poser la question sur la stabilité ou non du SI et d&rsquo;engager ou non un plan correctif sur l&rsquo;infrastructure ou sur imaginons dans un certains cas son remplacement ou son renforcement.</p>



<p>Sur le plan service, cette méthode permettrait également de faire grandir les équipes opérationnelles quant aux traitements des différentes alarmes remontées.</p>



<p>D&rsquo;un point de vu personnel, je souffre de cette frustration de vouloir bien faire sans atteindre pleinement mon but. Le code ne sera jamais assez bien pour moi. Il reste à améliorer, factoriser, sécuriser. C&rsquo;est un métier, un métier que je n&rsquo;ai pas su faire le mien à l&rsquo;époque et maintenant (d&rsquo;un autre côté du cherche aussi, développer en Notepad++ et en Powershell ISE aussi&#8230;). <s>La frustration sur le CLIXML me laisse un gout amer. Néanmoins, pourquoi mentir et dire que tout va bien et que cela fonctionne alors que ce n&rsquo;est pas le cas ? C&rsquo;est également l&rsquo;objectif de ce site parler de ce qui fonctionne et de ce qui ne fonctionne pas ou pas comme il devrait.</s> <mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color">Hourra ! (petit update 3 mois après&#8230;). Le gout amer est partie 🙂 A partir de ce jour le script est sécurisé à travers un fichier généré par CLIXML depuis un compte de service standard et gMSA. La méthode était la bonne, mais pas la pratique. Tout est histoire de contexte finalement.</mark> Comme quoi avec persévérance 🙂</p>



<p>Il serait également facile de me reprocher sur ce petit projet de ne pas avoir émis la possibilité de traiter directement les flux de mails directement dans ITOP. Mais la tâche devient tout de suite plus titanesque. Comment gérer la remédiation dans le cas d&rsquo;une variation d&rsquo;alarme ? Je laisse ça a d&rsquo;autre, il y a des APIs il faut les utiliser. La génération de ticket sur un flux de messagerie entrant doit selon moi être définie dans un cas d&rsquo;usage précis et n&rsquo;est pas adapté à un usage de monitoring, supervision.</p>



<p>Bref, à voir si certaines personnes seraient intéressés d&rsquo;échanger sur le sujet et de faire grandir ce petit projet. A savoir que je ne baisserai pas les bras car <strong><mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color">SPOILER ALERTE</mark></strong>, j&rsquo;ai déjà développé les GWs :</p>



<ul class="wp-block-list">
<li><strong>VEEAM B&amp;R &lt;-&gt; ITOP</strong></li>



<li><strong>VSPC &lt;-&gt; ITOP</strong></li>
</ul>



<p>Oui M&rsquo;sieurs, Dames ! Et je vais faire les mêmes articles mais avec les corrections !</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>Bonjour, je viens pour la clim ! Mon papa m&rsquo;a toujours dit de ne pas accepter les call APIs des inconnus&#8230;  C&rsquo;est que j&rsquo;ai eu un CRUD sur toi, tu aimes les films de gladiateur ?</em></p>
<cite>Erwan GUILLEMARD</cite></blockquote>



<h2 class="wp-block-heading">Sources</h2>



<ul class="wp-block-list">
<li><a href="https://www.servicenow.com/fr/">ServiceNow</a></li>



<li><a href="https://www.veeam.com/fr/products/free/monitoring-analytics.html">VEEAMOne</a></li>



<li><a href="https://www.combodo.com/ITOP">ITOP by COMBODO</a></li>
</ul>


<ol class="wp-block-footnotes"><li id="f191d455-4717-4aaf-8ff4-82c9265b904b"><strong>LTS</strong> : Long Time Support <a href="#f191d455-4717-4aaf-8ff4-82c9265b904b-link" aria-label="Aller à la note de bas de page 1">↩︎</a></li><li id="d7c86f1e-4938-4f27-a623-2239f16a69e6"><strong>SI :</strong> Système d&rsquo;Information <a href="#d7c86f1e-4938-4f27-a623-2239f16a69e6-link" aria-label="Aller à la note de bas de page 2">↩︎</a></li><li id="f1d99d7a-2755-48a1-8e82-84bc9b93e4c0"><strong>ETP :</strong> Equivalent Temps Plein <a href="#f1d99d7a-2755-48a1-8e82-84bc9b93e4c0-link" aria-label="Aller à la note de bas de page 3">↩︎</a></li><li id="0aa1a249-3ecf-41de-9099-f521c19d40af"><strong>BAL</strong> : Boites Aux Lettres <a href="#0aa1a249-3ecf-41de-9099-f521c19d40af-link" aria-label="Aller à la note de bas de page 4">↩︎</a></li><li id="1fd80a16-6c1d-4153-90e3-0ecc9f956387"><strong>ITSM</strong> : Information Technology Service Management <a href="#1fd80a16-6c1d-4153-90e3-0ecc9f956387-link" aria-label="Aller à la note de bas de page 5">↩︎</a></li><li id="25af4c42-afb9-44b3-9039-e222037b293e"><strong>GW</strong> : GateWay ou Passerelle <a href="#25af4c42-afb9-44b3-9039-e222037b293e-link" aria-label="Aller à la note de bas de page 6">↩︎</a></li><li id="f29fcc2d-94f5-4c52-9877-bad186eaca9c"><strong>MCO</strong> : Maintien en Condition Opérationel <a href="#f29fcc2d-94f5-4c52-9877-bad186eaca9c-link" aria-label="Aller à la note de bas de page 7">↩︎</a></li><li id="54fccf78-98cb-4623-8360-19b237ba2ba9"><strong>CMDB</strong> : Configuration Management Database <a href="#54fccf78-98cb-4623-8360-19b237ba2ba9-link" aria-label="Aller à la note de bas de page 8">↩︎</a></li><li id="8cde5590-e181-4d7a-b4a4-ace5fddd45c0"><strong>MCD</strong> : Modèle Conceptuel des Données <a href="#8cde5590-e181-4d7a-b4a4-ace5fddd45c0-link" aria-label="Aller à la note de bas de page 9">↩︎</a></li><li id="0290669f-efb9-4ab6-a7b3-b4f7eff01b1c"><strong>RBAC</strong> : Role Based Access Control <a href="#0290669f-efb9-4ab6-a7b3-b4f7eff01b1c-link" aria-label="Aller à la note de bas de page 10">↩︎</a></li><li id="80135d95-15b4-4cd0-a0ec-c8ffde965f4b"><strong>gMSA</strong> : GroupManaged Service Account <a href="#80135d95-15b4-4cd0-a0ec-c8ffde965f4b-link" aria-label="Aller à la note de bas de page 11">↩︎</a></li><li id="1efa48a9-bd98-4fd0-8da2-65480836c319"><strong>MSA</strong> : Managed Service Account <a href="#1efa48a9-bd98-4fd0-8da2-65480836c319-link" aria-label="Aller à la note de bas de page 12">↩︎</a></li><li id="d45a292e-81b8-49a9-9313-85d6dc8e238d"><strong>VM</strong> : Virtual Machine <a href="#d45a292e-81b8-49a9-9313-85d6dc8e238d-link" aria-label="Aller à la note de bas de page 13">↩︎</a></li><li id="64f0d887-4193-4ca4-b5fb-28e45b10840e"><strong>DRS</strong> : Distributed Ressources Scheduler <a href="#64f0d887-4193-4ca4-b5fb-28e45b10840e-link" aria-label="Aller à la note de bas de page 14">↩︎</a></li></ol>


<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PROJET &#8211; ITOP, MARIADB &#038; DUMP</title>
		<link>https://erwanguillemard.com/projet-dump-sql/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Tue, 26 Mar 2024 00:43:00 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[iTop]]></category>
		<category><![CDATA[Projet]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=1782</guid>

					<description><![CDATA[Il était une fois, un vendredi 22 février 2019, un jeune responsable informatique qui a décidé de réaliser un changement en production. Jusque-là, les conditions étaient favorables à cette veille de week-end. La semaine ne s&#8217;était pas si mal passée, les prémices des premiers rayons de soleil de printemps baignaient l&#8217;openspace d&#8217;une douce lumière, l&#8217;ambiance...]]></description>
										<content:encoded><![CDATA[
<p>Il était une fois, un vendredi 22 février 2019, un jeune responsable informatique qui a décidé de réaliser un changement en production. Jusque-là, les conditions étaient favorables à cette veille de week-end. La semaine ne s&rsquo;était pas si mal passée, les prémices des premiers rayons de soleil de printemps baignaient l&rsquo;openspace d&rsquo;une douce lumière, l&rsquo;ambiance était chaleureuse.</p>



<p>Mon binôme et moi-même rigolions à quelques blagues potaches de ma part. Tout allait bien. J&rsquo;enchainais dans notre solution ITSM<sup data-fn="4f016091-caee-4b8c-a7e6-1b261affbaf7" class="fn"><a href="#4f016091-caee-4b8c-a7e6-1b261affbaf7" id="4f016091-caee-4b8c-a7e6-1b261affbaf7-link">1</a></sup> les requêtes SQL<sup data-fn="8379ab85-9658-4c5e-9828-433f56ea0c75" class="fn"><a href="#8379ab85-9658-4c5e-9828-433f56ea0c75" id="8379ab85-9658-4c5e-9828-433f56ea0c75-link">2</a></sup>/OQL<sup data-fn="5263c9bd-049e-413f-971a-20c0ee6c7e4b" class="fn"><a href="#5263c9bd-049e-413f-971a-20c0ee6c7e4b" id="5263c9bd-049e-413f-971a-20c0ee6c7e4b-link">3</a></sup> avec des gros mots comme DROP, DROP CASCADE. (Vous le voyez le drame qui arrive ? Iceberg droit devant ! </p>



<p>Attention spoiler, ça ne va pas se terminer avec l&rsquo;anneau dans le volcan !). </p>



<p>Un collègue passe m&rsquo;avertir qu&rsquo;il ne peut plus traiter de ticket. Je me souviens lui avoir répondu avec un aplomb digne d&rsquo;un politicien que c&rsquo;était normal. Pourquoi s&rsquo;arrêter en si bon chemin dans l&rsquo;exécution de mes requêtes, il n&rsquo;y a pas de message d&rsquo;erreur ? Tant que je gagne je joue ! xD</p>



<p>J&rsquo;ai un peu moins rigolé quand deux minutes montre en main le responsable du centre de service m&rsquo;a indiqué que s&rsquo;il y a quelques minutes nos collègues ne pouvaient plus s&rsquo;assigner de ticket, cette fois si, ils n&rsquo;existaient même plus et ne pouvaient plus sélectionner leur nom sur l&rsquo;interface WEBUI<sup data-fn="0895739d-0898-404b-9759-53df65cec194" class="fn"><a href="#0895739d-0898-404b-9759-53df65cec194" id="0895739d-0898-404b-9759-53df65cec194-link">4</a></sup>.</p>



<p>Pour vous résumer mon état :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>Si ça en a le gout, la texture et l&rsquo;odeur. C&rsquo;est que s&rsquo;en est !</em></p>
<cite>Ce n&rsquo;est pas de moi, mais l&rsquo;auteur je l&rsquo;espère se reconnaitra</cite></blockquote>



<p>Avant de poursuivre ce conte digne des frères GRIMM, je souhaite dans cet article vous faire part d&rsquo;une situation particulière à la limite du critique, de la réflexion pour corriger cette situation et des solutions pour se prémunir d&rsquo;une potentielle récidive. <a href="https://www.youtube.com/watch?v=hH-jgntsgaU&amp;ab_channel=InaPierreDesproges.%C3%89tonnant%2Cnon%3F">Chassez le naturel, il revient au goulot</a>&#8230;</p>





<h2 class="wp-block-heading">Prérequis</h2>



<ul class="wp-block-list">
<li><strong>SE:</strong> RHEL, DEBIAN, UBUNTU</li>



<li><strong>Apps:</strong> bash, crontab, Mariadb/Mysql</li>



<li><strong>Autres:</strong> Au moins une base de données, <a href="https://erwanguillemard.com/apps-mutt/">Apps &#8211; MUTT</a></li>
</ul>



<h2 class="wp-block-heading">(Reprise de l&rsquo;histoire)</h2>



<p>Effectivement, j&rsquo;ai bien « défoncé » quelques tables et jointures. L&rsquo;application ITSM colonne vertébrale de notre organisation n&rsquo;est plus fonctionnel. Il est 15h00 et l&rsquo;ensemble des équipes sont à l&rsquo;arrêt. Paradoxalement, j&rsquo;aurai dû continuer de passer des requêtes SQLs car si nous ne pouvions pas traiter les demandes et incidents des utilisateurs, ces derniers pouvaient créer des tickets.</p>



<p>A ce moment, nous avions bien identifié l&rsquo;origine du dysfonctionnement (1m98, 85 kilos&#8230; oui mais pas que). Nous envisagions mes collègues et moi une once d&rsquo;espoir pour faire machine arrière quant à mes actions sur la base de données.</p>



<p>C&rsquo;est un peu plus difficile quand j&rsquo;ai annoncé ne pas avoir noté toutes les requêtes que j&rsquo;avais exécuté, et que les journaux de logs sont vides. </p>



<p>Pourtant, <a href="https://www.youtube.com/watch?v=2LMiVLpOMlQ&amp;ab_channel=JasonChicandier">personne ne doit travailler le vendredi après midi, le vendredi après midi on est bleu</a>. La décision est prise. Il va falloir restaurer la base de données.</p>



<h3 class="wp-block-heading">Réunion de crise</h3>



<p>Récapitulons donc la situation, la production est hors service. Nous ne pouvons pas revenir en arrière, la production continue de tourner et à cette époque nous avions un fonctionnement particulier avec l&rsquo;un des nos clients pour lequel notre outil ITSM était « master » d&rsquo;un seconde instance ITSM satellite « slave » avec des synchronisations. Bref, un truc super mais sensible en cas de non respect du cycle de vie des tickets.</p>



<p>En dehors du cas singulier précédent, il faut savoir que dans le fonctionnement de notre organisation, nous avons des engagements de résultats sur le traitements des demandes et incidents (SLA<sup data-fn="ae4627e1-e11b-4cec-8fa2-b37da3573deb" class="fn"><a href="#ae4627e1-e11b-4cec-8fa2-b37da3573deb" id="ae4627e1-e11b-4cec-8fa2-b37da3573deb-link">5</a></sup>, OLA<sup data-fn="45db95fc-7d07-48d2-b8d8-be79e04986d3" class="fn"><a href="#45db95fc-7d07-48d2-b8d8-be79e04986d3" id="45db95fc-7d07-48d2-b8d8-be79e04986d3-link">6</a></sup>, SLR<sup data-fn="4ba39691-0448-4c1f-bdc1-f2e4dfe0a212" class="fn"><a href="#4ba39691-0448-4c1f-bdc1-f2e4dfe0a212" id="4ba39691-0448-4c1f-bdc1-f2e4dfe0a212-link">7</a></sup> etc).</p>



<p>Revenir en arrière en restaurant la base de données, oui mais sans perdre les tickets et requêtes utilisateurs en cours.</p>



<p><strong>A quelle heure pouvons nous donc restaurer la BDD ?</strong> Encore une fois c&rsquo;est là où le bât blesse. Nous n&rsquo;avons pas de dump de la base&#8230; (Nous voici donc au volant d&rsquo;une voiture qui roule à vive allure, nous pensons que tout va bien puis que d&rsquo;un coup nous découvrons que l&rsquo;assurance n&rsquo;est pas à jour. Que l&rsquo;ensemble des témoins du tableau de bord s&rsquo;allument tous comme un sapin de Noël et que les freins vont surement lâchés.)</p>



<p>Nous décidons de contacter l&rsquo;éditeur qui malheureusement ne peut rien faire pour nous dans le contexte et arrive à la même conclusion que nous. La restauration en date de la veille et inéluctable. </p>



<p>Nous réalisons toutefois un export de l&rsquo;ensemble de toutes les requêtes créés, modifiées entre le matin même de 06h00 à 18h00 sur l&rsquo;environnement ITSM de production ainsi que sur l&rsquo;environnement ITSM satellite du client, puis coupons les services. De mémoire, cela représentait un volume de 300 tickets environ.</p>



<h3 class="wp-block-heading">Excès de confiance</h3>



<p>Pourquoi cette situation ? Pourquoi ce changement n&rsquo;a-t-il pas été soumis à un CAB ? Si vous avez pris un peu le temps de lire d&rsquo;autres articles ou de lire ma présentation, je suis quelqu&rsquo;un de malchanceux marqué du signe du chat noir ascendant Pierre RICHARD (mais je le vis bien je vous rassure). Nous avions initialement mon collègue et moi pour objectif « d&rsquo;alléger » notre base de données de production. C&rsquo;est pourquoi, dans le cadre du contrat de support et d&rsquo;assistance avec l&rsquo;éditeur, après une analyse commune, nous avions établit une liste de requête <strong><em><span style="text-decoration: underline;">précise</span></em></strong>.</p>



<p>Toutefois et par prudence, il était impératif de tester sur notre environnement de test/préproduction à ISO périmètre de l&rsquo;environnement de production les dites requêtes. Chose qui a été réalisé par mes soins sans rencontrer la moindre complication ou dysfonctionnement. Le résultat est positif, tous les voyants sont verts. Pourquoi ne pas appliquer les modifications sur l&rsquo;environnement de production ? </p>



<p>C&rsquo;est là, que ça ne va pas. L&rsquo;environnement de préproduction ne fonctionne pas à ISO périmètre de l&rsquo;environnement de production. Ce dernier est sans cesse sollicité se qui n&rsquo;est pas le cas de l&rsquo;environnement de préprod. (C&rsquo;est diabolique). Et donc, l&rsquo;application des requêtes ont générés d&rsquo;autres erreurs. L&rsquo;outil ITSM m&rsquo;a gentiment proposé de corriger les dîtes erreurs. Je suis donc sortie allégrement du contexte de mon changement sans m&rsquo;en rendre compte.</p>



<p>Je pensais maitriser mes actions et n&rsquo;ais à aucun moment pensé qu&rsquo;il s&rsquo;agissait d&rsquo;un changement ! Il a suffit d&rsquo;un excès de confiance. Pour mettre à genoux l&rsquo;organisation (rien de bien dramatique en soi quand nous voyons aujourd&rsquo;hui l&rsquo;impact d&rsquo;un crypto, ce n&rsquo;est pas du tout le même impact).</p>



<p>Mais vous savez même si la chat et noir, il a toujours quelques poils blancs dans son pelage 🙂 L&rsquo;incident tombant un vendredi, il nous reste le week-end pour trouver une solution.</p>



<h3 class="wp-block-heading">Plan d&rsquo;actions</h3>



<p>C&rsquo;est incroyable de se dire que l&rsquo;action d&rsquo;un individu à impacté l&rsquo;ensemble des services et nécessité cinq collaborateurs de trois services différents. Néanmoins, personnes n&rsquo;a été malveillant à mon égard à ma grande surprise. Nous étions une équipe face, un bloc face à l&rsquo;incident en cours.</p>



<p>Nous avions donc défini le plan d&rsquo;action suivant :</p>



<ul class="wp-block-list">
<li>Restauration du serveur de base de donnée à la veille dans un environnement isolé</li>



<li>Réalisation du dump de la base de données</li>



<li>Exportation de la base de données</li>



<li>Désactivation de l&rsquo;appareillage entre l&rsquo;ITOP master et le satellite (slave)</li>



<li>Importation de la base de données sur l&rsquo;environnement de production</li>



<li>Réalisation des mêmes actions côté ITOP satellite</li>



<li>Réactivation de l&rsquo;appareillage entre les deux ITOP</li>



<li>Reprise des requêtes côté satellite depuis le fichier CSV exporté plus tôt</li>



<li>Reprise des requêtes côté master depuis le fichier CSV exporté plus tôt</li>
</ul>



<p>Sur le papier cela sonnait bien. Et pourtant encore nous allions buter sur deux points bêtes. C&rsquo;est toujours quand nous sommes dans l&#8217;embarras (pour ne pas dire dans la m***e) que nous nous rendons compte de la réalité des choses. </p>



<ul class="wp-block-list">
<li>A l&rsquo;époque, dans une console VMWare (version 5.5 de mémoire) il était ardu de taper certains caractères spécifiques. Nous avons buter pendant 30 minutes pour saisir le caractère <strong>« @</strong>« .</li>



<li>Lors de l&rsquo;import d&rsquo;un dump existant ITOP, lors de l&rsquo;application d&rsquo;un setup il est nécessaire de supprimer l&rsquo;intégralité d&rsquo;une table VIEWS. Nous ne le savions pas à l&rsquo;époque&#8230; (J&rsquo;ai dans mes tablettes un article en cours à ce propos). Nous ne sommes pas SysDBA, mais nous avons tout de même réalisé le STATMENT qui va bien. (Malgré tous ces péripéties, ils t&rsquo;ont laissé faire du SQL ? Non je vous rassure j&rsquo;étais sous tutelle 🙂 ).</li>
</ul>



<h3 class="wp-block-heading">Reprise des données</h3>



<p>La diversité des tickets et les différents paramètres des ces derniers allaient rendre difficile l&rsquo;automatisation de réimport des requêtes. Il ne suffit pas de reprendre les tickets, il est nécessaire de leurs appliquer un « stimulus » afin que les notifications, SLA, le cycle de vie etc s&rsquo;appliquent. L&rsquo;éditeur nous avait prévenu quelques heures auparavant qu&rsquo;il allait falloir user d&rsquo;huile de coude.</p>



<p>J&rsquo;ai eu à cœur d&rsquo;assumer ma faute et de porter la responsabilité de cet échec. Si mon binôme n&rsquo;était pas disponible samedi pour m&rsquo;aider il l&rsquo;était dimanche. Toutefois, j&rsquo;ai fait tout ce qui était possible pour qu&rsquo;il n&rsquo;ait rien à faire.</p>



<p>Sur les 300 et quelques tickets, il aura dû en traiter une vingtaine et c&rsquo;est je crois toujours 20 de trop. A grand coup de copier/coller, 270 tickets il faut compter à peu près 19h. (J&rsquo;ai oublié de préciser que ma femme m&rsquo;a mis un savon le soir comme quoi il est interdit de faire des changements le vendredi, blablabla. J&rsquo;ai encore le souvenir de la voir partir le samedi soir avec ces copines et revenir tôt le dimanche matin. Ca fait ne me rajeunit pas).</p>



<h3 class="wp-block-heading">Dénouement et fin</h3>



<p>Le lundi matin, tout était de nouveau fonctionnel. Le week-end a été long et les heures de sommeil rares. Toutefois, « la bêtise » était assumée. Un nombre incalculable de « Je suis désolé », « Veuillez accepter mes excuses » auprès de mes collègues ont eu lieu. Il me semble que cela les a plus agacé que l&rsquo;incident en lui même. (Effectivement le gars qui se là joue <a href="https://fr.wikipedia.org/wiki/Les_Cent_Vingt_Journ%C3%A9es_de_Sodome">Les 120 journées de Sodome</a> c&rsquo;est usant). </p>



<p>Le plus beau, restera qu&rsquo;aucun de nos clients n&rsquo;a remarqué l&rsquo;incident et le changement des SLAs de quelques heures. Si quelques interlocuteurs clients l&rsquo;ont remarqués ils n&rsquo;ont pas demandés plus de compte que cela.</p>



<p>Un REX<sup data-fn="12964d76-0031-4d00-b74e-5bcf426f014a" class="fn"><a href="#12964d76-0031-4d00-b74e-5bcf426f014a" id="12964d76-0031-4d00-b74e-5bcf426f014a-link">8</a></sup> a eu lieu en comité et nous avons su pointer les points qui devaient être améliorer. Le plus gros étant de s&rsquo;assurer au moins un dump de la base de données entre deux points de sauvegarde. Oui mais comment faire et surtout par où commencer.</p>



<h2 class="wp-block-heading">Réflexion</h2>



<p>A la suite de la petite histoire ci-haut, qui commence mal mais qui se termine plutôt bien. L&rsquo;une des premières questions que je me suis posé est qu&rsquo;est ce que propose ITOP ? Est ce que la solution embarque un système de sauvegarde, de dump de base de données ?</p>



<p>La réponse est oui ! Mais ça ne me convient pas !  </p>



<p>Mais il est jamais content se type. Il y a des solutions mises en place par l&rsquo;éditeur dans sa solution et ça ne lui convient pas. Je le vois déjà écrire « Oui je veux pas réinventer la roue, mais&#8230; ». Tu serais pas un SysAdmin frustré par hasard ? Qu&rsquo;est ce qui a ? </p>



<p>Pour le coup le contexte est différent. Si nous reprenons l&rsquo;architecture 2-tiers (<a href="https://erwanguillemard.com/apps-itop/">Apps &#8211; iTOP</a>), nous avons d&rsquo;un côté notre serveur web et de l&rsquo;autre notre serveur de BDD. Jusque là pas de problème.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="614" height="474" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_001_iTop_schema.jpg" alt="" class="wp-image-1794" style="width:386px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_001_iTop_schema.jpg 614w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_001_iTop_schema-300x232.jpg 300w" sizes="auto, (max-width: 614px) 100vw, 614px" /></figure>
</div>


<p>Ce qui me gène dans l&rsquo;outil mise à disposition pour COMBODO, c&rsquo;est que le stockage des dumps se fait du côté où est exécuter la commande <strong>mysqldump</strong>. Soit côté Front et donc stocké dans le répertoire web itop (<strong>/var/www/html/portail.erwanguillemard.com/data/backups/</strong>).</p>



<p>En quoi ça te gène ? En réalité il y a plusieurs points.</p>



<ul class="wp-block-list">
<li><strong>Espace disque :</strong> Il existe un risque de saturation de l&rsquo;espace de stockage du serveur web et de la partition /var/. La saturation de la partition (ou du disque) peut (plutôt va) rendre inaccessible le portail web. (Tu connais les hardlinks ?)</li>



<li><strong>Sécurité :</strong> Stocker les dumps de la base de données de production sur le serveur front publié vers l&rsquo;extérieur représente un risque en cas d&rsquo;intrusion donc de vulnérabilité et de vol de données dans le pire des cas </li>



<li><strong>Granularité :</strong> Possible uniquement de ne garder que 5 points de rétentions du lundi au vendredi à partir de 23:30.</li>



<li><strong>Mécanisme :</strong> Ce dernier est propre à ITOP est non pas une couche hors de l&rsquo;application. Que se passe-t-il si le front reboot lors de la tâche de backup ou si le réseau est indisponible, si l&rsquo;application est indisponible ?</li>
</ul>



<p>Donc si nous te comprenons bien, la fonctionnalité est naze ? Non, loin de là. Au contraire, je trouve que c&rsquo;est une excellente fonctionnalité car elle permet pour les petites bases de données de réaliser un dump dans les meilleurs délais et de ne pas avoir à se connecter directement au serveur backend. De plus, il est possible de réaliser une restauration directement depuis le portail ITOP (webui).</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="935" height="662" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_002_iTop_DataBackup.jpg" alt="" class="wp-image-1795" style="width:451px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_002_iTop_DataBackup.jpg 935w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_002_iTop_DataBackup-300x212.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_002_iTop_DataBackup-768x544.jpg 768w" sizes="auto, (max-width: 935px) 100vw, 935px" /></figure>
</div>


<p>C&rsquo;est à partir de ce constat que j&rsquo;ai décidé d&rsquo;écrire ma lettre au Père Noël (ou Saint Nicolas suivant notre situation géographique).</p>



<pre class="wp-block-code"><code>Petit Papa Noël, 

J'ai été bien sage en ce début d'année 2019 même si j'ai fait une petite boulette. Afin de ne pas reproduire cette bêtise, je souhaiterai avoir une solution qui réalise les points suivants :
* Un outil qui réalise 2 dumps par jour ou plus (automatisation)
* Un outil qui envoi un mail en cas de succès ou d'erreur du dump
* Un outil qui puisse avoir une fonctionnalité de dump manuel
* Un outil qui soit <strong>GENERIQUE</strong> et s'adapte à n'importe quelle base de données MySQL/MariaDB.
* Un outil qui fonctionne sous GNU (RHEL et DEBIAN) en bash.

Merci Père Noël, je t'aime tu es le meilleur.

Bisous, 

Erwan</code></pre>



<p>Hélas, je n&rsquo;ai toujours pas eu de réponse à ma lettre. A croire que ma « boulette » n&rsquo;était pas si petite que ça&#8230; Ce n&rsquo;est pas grave&#8230; </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>Allez, on est pas des manches, on se relève les manches et&#8230; BANZAÏ !</em></p>
<cite>Merci Groland</cite></blockquote>



<h2 class="wp-block-heading">Configuration et installation du Script</h2>



<p>Bien qu&rsquo;initialement, l&rsquo;outil que j&rsquo;ai développé venait répondre à un besoin professionnel, la version présentée dans cette article a pour seul lien que le contexte et a été développé, testé sur mon temps personnel.</p>



<h3 class="wp-block-heading">Lecture du script</h3>



<p>Comme toujours nous positionnerons le script à la racine du système de notre<em><span style="text-decoration: underline;"> serveur SGBD</span></em> dans un répertoire à part avec des droits spécifiques. L’objectif étant de toujours garantir un niveau de sécurité suffisant et d’éviter une escalade potentielle des droits.</p>



<p>J&rsquo;insiste sur ce point, l&rsquo;ensemble des actions ci-dessous sont à réaliser sur le serveur backend.</p>



<pre class="wp-block-code"><code><strong>$ sudo mkdir /script</strong>
<strong>$ sudo mkdir /script/SS_015-LINUX_MYSQL_DUMP-BDD</strong></code></pre>



<p class="has-text-align-center">Editez le fichier ou copiez le fichier suivant&nbsp;: <em><strong>SS_015_E_LINUX_MYSQL_DUMP-BDD.sh</strong></em></p>



<p>A ce jour le fichier en version E est construit de la manière suivante&nbsp;:</p>



<ul class="wp-block-list">
<li>Les constantes</li>



<li>Une fonction vérifiant les prérequis</li>



<li>Une fonction réalisant le dump de la base de données</li>



<li>Une fonction assurant la rotation des fichiers de dumps suivant le nombre de points de rétention définit</li>



<li>Une fonction pour préparer le mail</li>



<li>Une fonction d’envoi de mail</li>



<li>Une fonction pour forger le mail en html</li>
</ul>



<p>Je vous propose de parcourir ensemble le script, fonction par fonction. L&rsquo;objectif étant de partager ce bout de code et peut être pouvoir le soir me coucher en me persuadant que quelques parts, sur le SI d&rsquo;une organisation ce bout de code, maigre contribution personnel fonctionne&#8230; Laissez moi un peu rêver ou alors dites vous que vous m&rsquo;en vendez (du rêve naturellement) !</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id1782_d242d2-52 kt-accordion-has-4-panes kt-active-pane-0 kt-accordion-block kt-pane-header-alignment-left kt-accodion-icon-style-basic kt-accodion-icon-side-right" style="max-width:none"><div class="kt-accordion-inner-wrap" data-allow-multiple-open="false" data-start-open="none">
<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-1 kt-pane1782_6207d4-32"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">1 &#8211; Les constantes</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner"><div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="633" height="427" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_003_iTop_Script_Constantes-3.png" alt="" class="wp-image-1829" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_003_iTop_Script_Constantes-3.png 633w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_003_iTop_Script_Constantes-3-300x202.png 300w" sizes="auto, (max-width: 633px) 100vw, 633px" /></figure>
</div>


<p>Les noms des variables sont normalement explicites. Pour éviter toutes ambiguïtés :</p>



<ul class="wp-block-list">
<li><strong>_modeHTML</strong> : Pour avoir des bô rapport en HTML</li>



<li><strong>_author</strong> : Pour afficher dans le rapport le nom du créateur</li>



<li><strong>_version</strong> : Pour la version du script</li>



<li><strong>_dateRelease</strong> : Pour la date du script (dernière modification)</li>



<li><strong>_mailTo</strong> : Contient l&#8217;email du destinataire qui va être spamé de mail</li>



<li><strong>_pathLogRepository</strong> : Emplacement où seront stockés les logs à chaque exécution du script.</li>



<li><strong>_pathLogFile</strong> : Nom du fichier de log</li>



<li><strong>_pathBDDRepository</strong> : Emplacement où seront stockées les dumps</li>



<li><strong>_nbRetention </strong>: Nombre de dump à conserver</li>



<li><strong>_dbName</strong> : Nom de la base de données concerné par le traitement</li>



<li><strong>_dbUser</strong> : Nom du compte Mariadb/MySQL qui sera autorisée à réaliser le dump de la BDD</li>



<li><strong>_dbPassword </strong>: Mot de passe du compte renseigné précédemment</li>
</ul>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane1782_bd139b-cc"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">2 &#8211; Fonction : Check Prérequis</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Cette fonction à pour objectif de vérifier et de contrôler que toutes les conditions nécessaires au bon déroulement du script soient présentes.</p>



<ul class="wp-block-list">
<li>Création du répertoire de log si absent</li>



<li>Création du fichier de log si absent ou différent</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="974" height="402" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_004_iTop_Script_Constantes.png" alt="" class="wp-image-1801" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_004_iTop_Script_Constantes.png 974w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_004_iTop_Script_Constantes-300x124.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_004_iTop_Script_Constantes-768x317.png 768w" sizes="auto, (max-width: 974px) 100vw, 974px" /></figure>
</div>


<ul class="wp-block-list">
<li>Création du répertoire des dumps 1/2 et 2/2 journalier</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="632" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_005_iTop_Script_Constantes-1024x632.png" alt="" class="wp-image-1802" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_005_iTop_Script_Constantes-1024x632.png 1024w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_005_iTop_Script_Constantes-300x185.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_005_iTop_Script_Constantes-768x474.png 768w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_005_iTop_Script_Constantes.png 1158w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>Si et seulement si les conditions sont présentes alors le script fera appel à la fonction suivante dumpCreate.</p>



<p class="has-text-align-center"><strong>« J&rsquo;ai une question bête ? C&rsquo;est quoi ta variable $codeArg et la commande tee ? »</strong></p>



<p class="has-text-align-left">Il est important de se rappeler « <em>il n&rsquo;y a pas de question bête, il n&rsquo;y a que des réponses stupides</em>« .</p>



<p>Lorsque j&rsquo;ai écrit ce bout de code il y a 4 ans, je souhaitais offrir la possibilité de réaliser l&rsquo;automatisation des dumps mais de garder la possibilité de lancer manuellement un dump sans à avoir à taper la commande mysqldump, le login et le mot de passe. </p>



<p>De ce fait, si nous appelons le script :</p>



<ul class="wp-block-list">
<li><span style="text-decoration: underline;">Sans argument :</span> Réalise un dump de la base de données à l&rsquo;instant T</li>



<li><span style="text-decoration: underline;">Avec argument (<strong>MidDay</strong> ou <strong>MidNight</strong>)</span> : Réalise un dump de la base de données dans un répertoire spécifique. A son intérêt si appelé dans une tâche planifiée.</li>
</ul>



<p>La commande <strong>tee</strong> offre un avantage car elle permet de retourner l&rsquo;affichage d&rsquo;un terminal dans un fichier. Ce qui permet de voir ce qui se passe lors de l&rsquo;exécution du script et de garder une trace de l&rsquo;ensemble des actions. D&rsquo;un côté cela reste plus lourd dans la syntaxe que le traditionnel <strong>2&gt;&amp;1</strong> qui ne gère que le <strong>stdout</strong> et <strong>stderr</strong>. Probablement qu&rsquo;aujourd&rsquo;hui je ferai différemment.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane1782_258d86-3d"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">3 &#8211; Fonction : Dump Create</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Nous rentrons dans le vif du sujet. Je réalise le dump de la base en deux temps.</p>



<ul class="wp-block-list">
<li>Export du dump .sql</li>



<li>Compression du dump .sql en .gzip</li>
</ul>



<p>Toujours en prenant en compte l&rsquo;argument passé lors de l&rsquo;appel du script pour positionner le dump dans le bon répertoire. Dans le cas contraire, le dump sera écrit à la racine du répertoire contenant les dumps.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="444" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_006_iTop_Script_Constantes-1024x444.png" alt="" class="wp-image-1804" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_006_iTop_Script_Constantes-1024x444.png 1024w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_006_iTop_Script_Constantes-300x130.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_006_iTop_Script_Constantes-768x333.png 768w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_006_iTop_Script_Constantes-1536x666.png 1536w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_006_iTop_Script_Constantes.png 1900w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>Dans cette fonction, les commandes les plus intéressantes sont bien entendu les commandes <strong>mysqldump</strong> et <strong>gzip</strong>.</p>



<p>Pourquoi faire en deux temps alors qu&rsquo;il est tout à fait possible de réaliser ces deux actions en une seule commande ?</p>



<p>Excellente question pour laquelle je ne me souviens plus pourquoi j&rsquo;ai fait ça. Peut-être pour le plaisir de chercher midi à quatorze heures que sait où mon côté néophyte ?</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="935" height="61" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_007_iTop_Script_mysqldump.png" alt="" class="wp-image-1805" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_007_iTop_Script_mysqldump.png 935w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_007_iTop_Script_mysqldump-300x20.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_007_iTop_Script_mysqldump-768x50.png 768w" sizes="auto, (max-width: 935px) 100vw, 935px" /></figure>
</div>


<p>Nous précisons l&rsquo;utilisateur qui va réaliser le dump de la BDD (attention au permission sur la base) ainsi que son mot de passe <strong>-u</strong> <strong>$_dbUser</strong> et <strong>-p$_dbPassword</strong>. L&rsquo;option <strong>&#8211;master-data</strong> permet de se positionner si une réplication SQL est se place sur la dernière position. L&rsquo;option <strong>&#8211;quick</strong> est utile dans le cas de BDDs importante. Cela va permettre de récupérer les lignes d&rsquo;une table, ligne par ligne, plutôt que de récupérer l&rsquo;intégralité de toutes les lignes et de les garder en mémoire avant de l&rsquo;écrire. L&rsquo;option <strong>&#8211;single-transaction</strong> qui est à mon sens l&rsquo;option la plus importante de notre ligne de commande puisque cette option permet de réaliser le dump de notre base de données à chaud sans verrouiller les tables ni bloquer l&rsquo;application. Pour faire plus simple, cela permet de garantir la consistance des données de notre DUMP. L&rsquo;option <strong>&#8211;verbose</strong> est quant à elle compréhensible. Nous indiquons la BDD dont nous souhaitons réaliser le dump <strong>$_dbName</strong>, redirigeons l&rsquo;ensemble des flux dans le répertoire adéquate puis l&rsquo;ensemble des flux dans notre fichier de log.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="936" height="44" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_008_iTop_Script_gzipSQL.png" alt="" class="wp-image-1806" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_008_iTop_Script_gzipSQL.png 936w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_008_iTop_Script_gzipSQL-300x14.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_008_iTop_Script_gzipSQL-768x36.png 768w" sizes="auto, (max-width: 936px) 100vw, 936px" /></figure>
</div>


<p>La compression est plus simple puisque nous appelons la commande gzip en indiquant que nous voulons de la verbe et que nous allons forcer la création de l&rsquo;archive. Comme pour la commande précédente, nous redirigerons l&rsquo;ensemble des flux dans notre fichier de log.</p>



<p>Et donc si nous souhaitons faire cette opération en une fois ?</p>



<p>Il suffirait de faire un pipe des deux commandes.</p>



<pre class="wp-block-code"><code><strong>$ sudo /usr/bin/mysqldump -u $_dbUser -p$_dbPassword --master-data --quick --single-transaction --verbose $_dbName &gt; $argDump/`date +"%Y-%m-%d"`-$_dbName.sql 2&gt;&gt;$_pathLogRepository/$_pathLogFile | /bin/gzip -f -v $_pathBDDRepository/`date +"%Y-%m-%d"`-$_dbName.sql 2&gt;&gt;$_pathLogRepository/$_pathLogFile</strong></code></pre>



<p>Je ne l&rsquo;ai toutefois pas testé. Donc à vérifier, mais il n&rsquo;y devrait pas avoir de raison que ça ne fonctionne pas. </p>



<p>Il y a toutefois une variation entre le commande présente dans le wiki de COMBODO et ma commande. Je ne précise pas les arguments <strong>&#8211;opt</strong>, <strong>&#8211;default-character-set=utf8</strong>, &#8211;<strong>-add-drop-database</strong>. Pourquoi cette prise de liberté soudaine ?</p>



<p>L&rsquo;option <strong>&#8211;opt </strong>est activé par défaut et si nous ne référons au manuel mysqldump, cette commande est un raccourcie de plusieurs autres commandes. Dans notre cas et si l&rsquo;installation de MySQL/MariaDB a été effectué comme dans un précédent article , la question ne se pose pas. A l&rsquo;inverse, nous ne spécifions pas l&rsquo;encodage des caractères &#8211;<strong>-default-character-set</strong>. Cela pourrait nous porter préjudice. Néanmoins et par défaut si ce dernier n&rsquo;est pas spécifier, <strong>mysqldump</strong> utilisera le type <strong>utf8mb4</strong>. On ne va pas se mentir, je ne suis pas super à l&rsquo;aise sur le sujet. Si ce n&rsquo;est que l&rsquo;utf8mb4 est plus récent que le format utf8 et prend en charge les emojis etc. Par expérience, tous les dumps que j&rsquo;ai dû réimporter jusqu&rsquo;à présent ont été réalisé sans spécifier le type d&rsquo;encodage utf8. Je n&rsquo;ai pas constaté d&rsquo;erreurs ou de dysfonctionnements. Moralité, je vais me mettre au diapason. (D&rsquo;un côté faut être <a href="https://www.youtube.com/watch?v=13dvENdB2rA&amp;ab_channel=DidierSuper-Topic">un peu c*n</a> pour dire j&rsquo;ai RTFM mais j&rsquo;ai pas appliqué les recommandations de l&rsquo;éditeur&#8230;).  </p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane1782_e84990-4c"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title">4 &#8211; Fonction : CleanUp Repository</span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Je vois déjà certains SysAdmins ou Dev se dire « <strong>Nan le gazié il est pas sérieux avec son _nbRetention, il a pas osé faire une fonction de rotation de ces fichiers .sql/.gzip </strong>?! » Et bien désolé de vous décevoir, la réponse est bien un énorme <strong>OUI</strong>, j&rsquo;ai osé.</p>



<p>Pourquoi ? Simplement pour me demander comment ferai je si je devais me passer de logrotate. Et le cas échéant, j&rsquo;ai appris quelques choses d&rsquo;autres et j&rsquo;ai donc un as dans ma manche si je dois faire une rotation de fichier un jour sans logrotate.</p>



<p>(<em>Comme déjà dit plusieurs fois, il est important de savoir se perdre de temps en temps.</em>)</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="933" height="254" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_009_iTop_Script_LogRotate.png" alt="" class="wp-image-1807" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_009_iTop_Script_LogRotate.png 933w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_009_iTop_Script_LogRotate-300x82.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_009_iTop_Script_LogRotate-768x209.png 768w" sizes="auto, (max-width: 933px) 100vw, 933px" /></figure>
</div>


<p>La commande <strong>find</strong> permet de lister l&rsquo;ensemble des éléments sur un critère. Dans notre usage, nous souhaitons lister tous les éléments (fichiers réguliers) d&rsquo;un des répertoires contenant nos Dumps <strong>-type f</strong> dont la dernière modification est inférieurs au nombre de point de rétention <strong>-mtime +$argNbRetention</strong>. (Notons que cela s&rsquo;exprime en jour donc 5 x 24heures). Les fichiers ne répondant pas au critère sont supprimés <strong>-delete</strong>. </p>
</div></div></div>
</div></div></div>



<p>Je passe mon tour sur les trois dernières fonctions qui sont ennuyeuse au possible et qui pour moi n&rsquo;apportent aucun intérêt dans le projet. Puisque cela concerne l&rsquo;envoi d&rsquo;un mail de notification de succès ou d&rsquo;échec de l&rsquo;archivage ou de la réalisation du dump.</p>



<p>Qui dit notification mail, dit serveur de messagerie (<a href="https://erwanguillemard.com/apps-mutt/">Apps &#8211; MUTT</a>).</p>



<p>Nous contrôlons les droits sur le fichier afin de s&rsquo;assurer que ce dernier est bien en <strong>700</strong> pour <strong>root:root</strong>.</p>



<pre class="wp-block-code"><code><strong>$ sudo ls -ahl /script/SS_015-LINUX_MYSQL_DUMP-BDD</strong></code></pre>



<p>Dans le cas contraire, il sera nécessaire de réaliser les opérations adéquates.</p>



<h3 class="wp-block-heading">Configuration du cron</h3>



<p>Perso, je souhaite avoir un delta de 6 heures maximum en cas de panne et donc (attention largage de gros mots dans deux secondes) dans RTO<sup data-fn="9f7e3b86-4a8f-40b7-ac86-170c2e700ec4" class="fn"><a href="#9f7e3b86-4a8f-40b7-ac86-170c2e700ec4" id="9f7e3b86-4a8f-40b7-ac86-170c2e700ec4-link">9</a></sup> de 1 heure ! Généralement, les entreprises travaillant de 8h00 à 18h00 du Lundi au Vendredi, nous allons automatiser nos dumps à 12h30 et à 18h30 sur les mêmes jours.  Libre à chacun de faire comme il le souhaite. (Attention toutefois si vous avez des jobs de sauvegardes en parallèle des dumps car les SEs n&rsquo;aiment pas ça, ni le matériel d&rsquo;ailleurs les I/O<sup data-fn="d0d50e59-dc19-4682-b0aa-391d08d39353" class="fn"><a href="#d0d50e59-dc19-4682-b0aa-391d08d39353" id="d0d50e59-dc19-4682-b0aa-391d08d39353-link">10</a></sup> un univers passionnant).</p>



<pre class="wp-block-code"><code><strong># vim /etc/crontab</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="63" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_010_iTop_Script_crontab-1024x63.png" alt="" class="wp-image-1809" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_010_iTop_Script_crontab-1024x63.png 1024w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_010_iTop_Script_crontab-300x19.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_010_iTop_Script_crontab-768x47.png 768w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_010_iTop_Script_crontab.png 1068w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>Ainsi, chaque Lundi au Vendredi à 12h30 en tant que root, le script stocké sous <strong>/script/SS_015-LINUX_MYSQL_DUMP-BDD/SS_015_E_LINUX_MYSQL_DUMP-BDD.sh</strong> avec l&rsquo;argument <strong>MidDay</strong> viendra générer un dump de la base de données compressée sous l’emplacement de stockage par défaut <strong>/midday/</strong>. Il sera de même à 18h30 mais avec l&rsquo;argument <strong>MidNight</strong>, sous l&#8217;emplacement <strong>/midgnight/</strong>.</p>



<h3 class="wp-block-heading">Configuration des logs</h3>



<p>Si vous avez déjà déployé l&rsquo;un de mes outils, vous devez déjà avoir la configuration de rotation des logs pour le contenu du répertoire /var/log/ERWAN.</p>



<p>Dans le cas contraire, éditez un fichier de rotation.</p>



<pre class="wp-block-code"><code><strong>$ sudo vim /etc/logrotate.d/rone_scripts</strong></code></pre>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color wp-elements-d6190da780a32c58f0a216807ba0e2f0"><code>/var/log/ERWAN/SS_015-LINUX_MYSQL_DUMP-BDD.log {
        daily
        rotate 7
        copytruncate
        missingok
        notifempty
}</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="934" height="110" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_011_iTop_Script_logrotate.png" alt="" class="wp-image-1823" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_011_iTop_Script_logrotate.png 934w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_011_iTop_Script_logrotate-300x35.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_011_iTop_Script_logrotate-768x90.png 768w" sizes="auto, (max-width: 934px) 100vw, 934px" /></figure>
</div>


<h3 class="wp-block-heading">Configuration de la BDD</h3>



<p class="has-text-align-center"><strong>Euh&#8230; Je veux bien que tu parles de backup, de dump, de SQL toussa toussa. Mais qu&rsquo;est ce que vient faire la configuration de la BDD dans cet article ?</strong></p>



<p>Je répondrai à cette question par une question me chuchote mon avocat. </p>



<p class="has-text-align-center"><strong>On lance le dump avec quel compte, le root ?</strong></p>



<p>Effectivement, vu sous cette angle c&rsquo;est moche. Qui peut le plus peut le moins. Mais le risque est de ne pas exposer d&rsquo;avantage notre système et de maitriser autant que faire se peu les utilisateurs et les privilèges qui leurs sont associés.</p>



<p>Alors nous allons créer un compte dédié pour la sauvegarde de nos bases MariaDB/MySQL. (D&rsquo;ailleurs saviez vous que le Dauphin de MySQL est une dédicace à la fille ainée de son fondateur et qu&rsquo;à la suite de son rachat par SUN puis ORACLE, il dédiera l&rsquo;Otarie à sa fille cadette ? Non ? Et bien voilà, nous mourrons moins c*n ce soir).</p>



<pre class="wp-block-code"><code><strong># mysql -u root -p</strong></code></pre>



<pre class="wp-block-code has-theme-palette-8-background-color has-background"><code><strong>&#91;(none)]&gt; CREATE USER `svc.backup`@'localhost' IDENTIFIED BY '5uZ9Bc5KLkIJ0io0Z_Px9';

&#91;(none)]&gt; GRANT LOCK TABLES, SELECT, PROCESS, SHOW VIEW, TRIGGER ON *.* TO '<strong>svc.backup</strong>'@'localhost';</strong>

<strong>&#91;(none)]&gt; FLUSH PRIVILEGES;</strong></code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="941" height="74" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_012_iTop_Script_USRSQL_permission-1.png" alt="" class="wp-image-1827" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_012_iTop_Script_USRSQL_permission-1.png 941w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_012_iTop_Script_USRSQL_permission-1-300x24.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_012_iTop_Script_USRSQL_permission-1-768x60.png 768w" sizes="auto, (max-width: 941px) 100vw, 941px" /></figure>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="941" height="64" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_013_iTop_Script_USRSQL_permission.png" alt="" class="wp-image-1828" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_013_iTop_Script_USRSQL_permission.png 941w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_013_iTop_Script_USRSQL_permission-300x20.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_013_iTop_Script_USRSQL_permission-768x52.png 768w" sizes="auto, (max-width: 941px) 100vw, 941px" /></figure>
</div>


<p>Dans les grandes lignes, nous créons notre utilisateur SQL (on pense à changer éventuellement le nom du user et le mot de passe), rien de bien compliqué. Ce qui nous intéresse en revanche se sont les permissions que nous attribuons à notre utilisateur :</p>



<ul class="wp-block-list">
<li><strong>LOCK TABLES</strong> : Parce que nous utilisons l&rsquo;argument <em>single-transaction</em> pour la consistance de la BDD</li>



<li><strong>SELECT</strong> : Pour dump les tables</li>



<li><strong>PROCESS</strong> : Dans le cas où nous viendrions à utiliser l&rsquo;argument <em>no-tablespaces</em>. Dans notre cas pratique, inutile mais peut-être pas pour d&rsquo;autres BDDs.</li>



<li><strong>TRIGGER</strong> : Pour dumps les tables TRIGGER de notre BDDs. Comme pour l&rsquo;option ci-dessous, ça serait dommage de ne sauvegarder qu&rsquo;un bout de notre BDD. Ca serait comme faire une soirée raclette mais en ne touchant pas au plateau de charcuterie. Aucun intérêt de faire une soirée raclette/dump. </li>



<li><strong>SHOW VIEW</strong> : Pour sauvegarder la table des VIEWS. Dans notre cas, nous les supprimerons si nous devons réaliser un dump de la BDD iTop. Toutefois, nous voulons <span style="text-decoration: underline;"><em>un backup complet en cas d&rsquo;avarie</em></span>.</li>
</ul>



<p>Allez, fermons notre connexion SQL et passons à l&rsquo;étape suivante. La princesse Peach nous attend, à moins que ce ne soit Peggy du Muppet Show. Je les confonds toutes les deux.</p>



<h3 class="wp-block-heading">Configuration du script</h3>



<p>Il sera nécessaire avant la configuration du script de dédié un disque pour nos dumps (comme indiqué plus haut). L&rsquo;une des grandes questions étant oui mais comment définir l&rsquo;espace de stockage afin de ne pas faire de surallocation de ressources ?</p>



<p>Il est toujours difficile d&rsquo;apporter une réponse empirique à cette question. J&rsquo;ai pour habitude de partir sur la formule suivante :</p>



<p class="has-text-align-center"><strong>DiskSize (Go) = (BDDSize (Go) * AVG Compression Rate * NBRetentionPoints) * 30 %</strong></p>



<p>Par exemple, si nous partons des données suivantes pour un total de deux jobs automatisés par jour sur 5 jours avec un taux de compressions de 46% et que notre BDD fait 2 Go :</p>



<p><strong>DiskSize (Go)</strong> = (2 Go * 0,46 * (2*5)) * 1,3</p>



<p><strong>DiskSize (Go)</strong> = 11,96 Go</p>



<p>Il nous faudrait donc un disque dédié de 12 Go. Nous avons prévu une marge de 30% d&rsquo;espace de stockage afin de ne pas avoir d&rsquo;alerte relative à notre supervision et saturer notre espace disque. Nous n&rsquo;avons ainsi pas la nécessité d&rsquo;étendre tous les deux jours ou quatre matins notre partition.</p>



<p>Attention à l&rsquo;évolution de notre base de données dans le temps. Si cette dernière « gonfle » rapidement, il sera nécessaire d&rsquo;engager les actions adéquates.</p>



<p>Optionnellement, si vous réalisez une sauvegarde de votre machine (ce qui est vivement recommandé) par une solution tierce (VEEAM, HYCU etc) vous aurez votre nombre de point de rétention de sauvegarde en dump plus votre notre de point de rétention max définit dans notre script. Cela nous fait une bonne assurance.</p>



<p>Pour la suite, je considère donc que nous avons monté un disque de 12 Go sous <strong>/mnt/backup/</strong>.</p>



<p>Les droits sur le répertoire /mnt/backup doivent être <strong>700</strong> pour l&rsquo;utilisateur <strong>root:root</strong>. N&rsquo;oublions pas qu&rsquo;en dehors de la sauvegarde, nous avons un autre backup de notre BDD. Il est donc logique de ne faire <strong><span style="text-decoration: underline;">confiance à personne</span></strong> d&rsquo;autre que root.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="545" height="25" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_012_iTop_Script_permission.png" alt="" class="wp-image-1824" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_012_iTop_Script_permission.png 545w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_012_iTop_Script_permission-300x14.png 300w" sizes="auto, (max-width: 545px) 100vw, 545px" /></figure>
</div>


<p>Editons notre script et modifions les variables suivantes.</p>



<pre class="wp-block-code"><code><strong>$ sudo vim /script/SS_015-LINUX_MYSQL_DUMP-BDD/SS_015_E_LINUX_MYSQL_DUMP-BDD.sh</strong></code></pre>



<ul class="wp-block-list">
<li><strong>_mailTo</strong> : préciser l&rsquo;adresse qui va recevoir les rapports de dump deux fois par jour.</li>



<li><strong>_pathBDDRepository</strong> : préciser le répertoire racine créé précédemment  qui va contenir nos sauvegardes <strong>/mnt/backup</strong>.</li>



<li><strong>_nbRetention</strong> : Le nombre de point que vous avez définit dans notre formule. Vous pouvez l&rsquo;augmenter ce dernier ou le diminuer à votre guise. Tant que l&rsquo;espace de stockage arrive à suivre, pas de problème.</li>



<li><strong>_dbName</strong> : Le nom de la database dont nous voulons réaliser le dump.</li>



<li><strong>_dbUser</strong> : Le compte SQL dédié uniquement à la réalisation des dumps.</li>



<li><strong>_dbPassword</strong> : Le mot de passe du compte SQL ci-haut.</li>
</ul>



<p>Et le reste, pas touche, sauvegarder les modifications.</p>



<p>Bon, plus qu&rsquo;à tester.</p>



<h2 class="wp-block-heading">Test, Let&rsquo;s the Rock of Begins</h2>



<p>Afin de vérifier que tout va bien nous allons exécuter un dump manuellement et simuler l&rsquo;automatisation d&rsquo;un dump.</p>



<pre class="wp-block-code"><code><strong># /script/SS_015-LINUX_MYSQL_DUMP-BDD/SS_015_E_LINUX_MYSQL_DUMP-BDD.sh

#/script/SS_015-LINUX_MYSQL_DUMP-BDD/SS_015_E_LINUX_MYSQL_DUMP-BDD.sh MidNight
</strong></code></pre>



<p>Normalement si nous avons bien fait les choses, nous devrions avoir dans notre console le retour suivant :</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="939" height="321" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_014_iTop_Script_tests.png" alt="" class="wp-image-1830" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_014_iTop_Script_tests.png 939w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_014_iTop_Script_tests-300x103.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_014_iTop_Script_tests-768x263.png 768w" sizes="auto, (max-width: 939px) 100vw, 939px" /></figure>
</div>


<p>Si nous laissons tourner notre script 24 heures, nous devrions avoir la structure suivante dans notre répertoire <strong>/mnt/backup</strong></p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="442" height="279" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_015_iTop_Script_tree.png" alt="" class="wp-image-1831" style="width:277px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_015_iTop_Script_tree.png 442w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_015_iTop_Script_tree-300x189.png 300w" sizes="auto, (max-width: 442px) 100vw, 442px" /></figure>
</div>


<p>Nous pourrions supprimer un sous répertoire, ce dernier sera recréé lors de la prochaine exécution du script dans le contrôle des prérequis. 🙂</p>



<p>Au début, je voulais joindre en pj le fichier de log. Mais tant que nous n&rsquo;avons pas une grosse BDDs ça passe, après c&rsquo;est plus délicat. Je dois faire des efforts dans ce sens pour mieux gérer la verbosité de mes journaux je crois.</p>



<p>Néanmoins, nous pouvons faire une tour dans le répertoire de log et consulter l&rsquo;ENSEMBLE de toutes les actions réalisées par le script.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="912" height="151" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_016_iTop_Script_logContent.png" alt="" class="wp-image-1832" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_016_iTop_Script_logContent.png 912w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_016_iTop_Script_logContent-300x50.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_016_iTop_Script_logContent-768x127.png 768w" sizes="auto, (max-width: 912px) 100vw, 912px" /></figure>
</div>


<p>Soit en petit échantillon.</p>



<figure class="wp-block-table aligncenter"><table><tbody><tr><td><img loading="lazy" decoding="async" width="500" height="270" class="wp-image-1833" style="width: 500px;" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_017_iTop_Script_logStart.png" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_017_iTop_Script_logStart.png 689w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_017_iTop_Script_logStart-300x162.png 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></td><td><img loading="lazy" decoding="async" width="500" height="121" class="wp-image-1834" style="width: 500px;" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_018_iTop_Script_logEnd.png" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_018_iTop_Script_logEnd.png 935w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_018_iTop_Script_logEnd-300x73.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_018_iTop_Script_logEnd-768x186.png 768w" sizes="auto, (max-width: 500px) 100vw, 500px" /></td></tr></tbody></table></figure>



<p>Et pour terminer, le plus important car nous ne sommes pas en permanence sur notre terminal putty, le petit mail nous informant du bon succès des opérations.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="769" height="362" src="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_019_iTop_Script_notifications.png" alt="" class="wp-image-1835" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_019_iTop_Script_notifications.png 769w, https://erwanguillemard.com/wp-content/uploads/2024/03/PP_002_019_iTop_Script_notifications-300x141.png 300w" sizes="auto, (max-width: 769px) 100vw, 769px" /></figure>
</div>


<h2 class="wp-block-heading">GitHub</h2>



<p>Le code source ? C&rsquo;est par là => <a href="https://github.com/EGuillemard/SS_015-LINUX_MYSQL_DUMP-BDD.git">LIEN</a> (Licence GNU).</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Il n&rsquo;y a rien de pire que l&rsquo;excès de confiance dans la profession d&rsquo;AdminSys. A la différence des chirurgiens et autres médecins qui sont en dessus des divinités, l&rsquo;AdminSys se voit vite revenir à la réalité. Je pense et s&rsquo;est ce que mes mentors m&rsquo;ont inculqués, peu importe la tâche nous devons être en permanence vigilant.</p>



<p>C&rsquo;est avec ce genre de situation que nous prenons pleinement conscience des manquements sur nos systèmes d&rsquo;informations et qu&rsquo;il est nécessaire de trouver des solutions palliatives, payantes ou homemade (bancales la plus part du temps mais qui font ce que nous attendons).</p>



<p>Dans mon cas et pour revenir à la situation initiale, je pense avoir répondu à ma problématique d&rsquo;indisponibilité des données entre deux points de sauvegarde (24h). Mais c&rsquo;est encore loin d&rsquo;être parfait. La solution est générique certes, mais elle pourrait tellement être optimisée, factorisée et simplifiée.</p>



<p>Pourtant nous ne sommes pas allés au bout de ce projet. Et j&rsquo;avoue que j&rsquo;étais partagé pour aborder ce point. Je traiterai ce dernier dans un autre billet. Mais ce que nous devons garder à l&rsquo;esprit c&rsquo;est que nous avons un dump de notre base de données SQL (que ce soit, ITOP, ZABBIX ou autres applications), <em><strong>qu&rsquo;est ce qui nous dit que le contenu de notre dump est intègre et fiable ?</strong></em> Il faudrait réimporter ce dernier dans un environnement de test et recetter le dump. Ainsi la boucle serait bouclée et nous validerions notre processus de reprise de données à partir d&rsquo;un dump de bout en bout. Cela viendra s&rsquo;inscrire dans le PAS<sup data-fn="59d94d9c-a390-4bdb-a952-00265825e3f6" class="fn"><a href="#59d94d9c-a390-4bdb-a952-00265825e3f6" id="59d94d9c-a390-4bdb-a952-00265825e3f6-link">11</a></sup> de notre application, organisation.</p>



<p>Le mot de la fin :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>Il était une petite requête, pirouette cacahouète. Il était une petite requête qui a fait une grosse boulette. </em></p>



<p><em>Pirouette, pas de caouhète. Vous passez en week end studieux sans apéro&#8230;</em></p>
<cite>Erwan GUILLEMARD</cite></blockquote>



<h2 class="wp-block-heading">Source</h2>



<ul class="wp-block-list">
<li><a href="https://www.man-linux-magique.net/man1/find.html">FIND</a></li>



<li><a href="https://man.cx/gzip(1)/fr">GZIP</a></li>



<li><a href="https://www.itophub.io/wiki/page?id=latest:admin:backup">ITOP &#8211; DataBackup (v3.X)</a></li>



<li><a href="https://www.itophub.io/wiki/page?id=2_7_0:admin:backup">ITOP &#8211; DataBackup (v2.7.X)</a></li>



<li><a href="https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html#option_mysqldump_master-data">MYSQLDUMP &#8211; master-data</a></li>



<li><a href="https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html#option_mysqldump_quick">MYSQLDUMP &#8211; quick</a></li>



<li><a href="https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html#option_mysqldump_single-transaction">MYSQLDUMP &#8211; single-transaction</a></li>



<li><a href="https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html">MYSQLDUMP &#8211; minimum privileges</a></li>



<li><a href="https://man7.org/linux/man-pages/man1/tee.1.html">TEE</a></li>
</ul>


<ol class="wp-block-footnotes"><li id="4f016091-caee-4b8c-a7e6-1b261affbaf7">ITSM : Information Technology Service Management <a href="#4f016091-caee-4b8c-a7e6-1b261affbaf7-link" aria-label="Aller à la note de bas de page 1">↩︎</a></li><li id="8379ab85-9658-4c5e-9828-433f56ea0c75">SQL : Structured Query Language <a href="#8379ab85-9658-4c5e-9828-433f56ea0c75-link" aria-label="Aller à la note de bas de page 2">↩︎</a></li><li id="5263c9bd-049e-413f-971a-20c0ee6c7e4b">OQL : Object Query Language  <a href="#5263c9bd-049e-413f-971a-20c0ee6c7e4b-link" aria-label="Aller à la note de bas de page 3">↩︎</a></li><li id="0895739d-0898-404b-9759-53df65cec194">WEBUI : WEB User Interface <a href="#0895739d-0898-404b-9759-53df65cec194-link" aria-label="Aller à la note de bas de page 4">↩︎</a></li><li id="ae4627e1-e11b-4cec-8fa2-b37da3573deb">SLA : Service Level Agreement  <a href="#ae4627e1-e11b-4cec-8fa2-b37da3573deb-link" aria-label="Aller à la note de bas de page 5">↩︎</a></li><li id="45db95fc-7d07-48d2-b8d8-be79e04986d3">OLA : Operational Level Agreement <a href="#45db95fc-7d07-48d2-b8d8-be79e04986d3-link" aria-label="Aller à la note de bas de page 6">↩︎</a></li><li id="4ba39691-0448-4c1f-bdc1-f2e4dfe0a212">SLR : Service Level Requirement <a href="#4ba39691-0448-4c1f-bdc1-f2e4dfe0a212-link" aria-label="Aller à la note de bas de page 7">↩︎</a></li><li id="12964d76-0031-4d00-b74e-5bcf426f014a">REX : Retour d&rsquo;EXpérience  <a href="#12964d76-0031-4d00-b74e-5bcf426f014a-link" aria-label="Aller à la note de bas de page 8">↩︎</a></li><li id="9f7e3b86-4a8f-40b7-ac86-170c2e700ec4">RTO : Recovery Time Objective (différent du RPO Recovey Point Objective) <a href="#9f7e3b86-4a8f-40b7-ac86-170c2e700ec4-link" aria-label="Aller à la note de bas de page 9">↩︎</a></li><li id="d0d50e59-dc19-4682-b0aa-391d08d39353">I/O : Input / Output <a href="#d0d50e59-dc19-4682-b0aa-391d08d39353-link" aria-label="Aller à la note de bas de page 10">↩︎</a></li><li id="59d94d9c-a390-4bdb-a952-00265825e3f6">PAS : Plan d&rsquo;Assurance Sécurité <a href="#59d94d9c-a390-4bdb-a952-00265825e3f6-link" aria-label="Aller à la note de bas de page 11">↩︎</a></li></ol>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>LINUX &#8211; Locked Account</title>
		<link>https://erwanguillemard.com/linux-locked-account/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Mon, 15 Jan 2024 22:27:55 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[MUTT]]></category>
		<category><![CDATA[Projet]]></category>
		<category><![CDATA[Securité]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=1335</guid>

					<description><![CDATA[La sécurité, c&#8217;est savoir regarder qui est devant sa porte. Avec l&#8217;évolution technologique, nous pouvons bénéficier depuis nos smartphones à l&#8217;intégralité de notre propriété et autres biens si nous avons choisi de souscrire à une entreprise de surveillance ou d&#8217;avoir déployer soit même quelques équipements. Ces Judas électroniques étaient inexistant il n&#8217;y a pas si...]]></description>
										<content:encoded><![CDATA[
<p>La sécurité, c&rsquo;est savoir regarder qui est devant sa porte. Avec l&rsquo;évolution technologique, nous pouvons bénéficier depuis nos smartphones à l&rsquo;intégralité de notre propriété et autres biens si nous avons choisi de souscrire à une entreprise de surveillance ou d&rsquo;avoir déployer soit même quelques équipements.</p>



<p>Ces Judas électroniques étaient inexistant il n&rsquo;y a pas si longtemps. A défaut d&rsquo;être chez soi et de lorgner dans le Judas pour vérifier qui frappe à la porte (ou s&rsquo;abandonner au plaisir solitaire du commérage), nous étions bien e******s quand nous n&rsquo;étions pas chez nous. D&rsquo;où les systèmes d&rsquo;alarmes, sirènes qui hurlent et c*****t les c******s du voisinage.</p>



<p>A partir de ce postulat et avec un peu d&rsquo;imagination, mon domicile c&rsquo;est mon serveur LINUX. Se pose la question de vérifier qui frappe à la porte, qui rentre, qui rentre pas. Qui se fait kick par <a href="https://www.youtube.com/watch?v=DOO5vuxizLM&amp;ab_channel=StupeflipOfficiel">Jean-Pierre, notre bon chien</a> (plus petit que Cerbère quand même car il bouffe ce c*n) quand je ne suis pas scotché sur mon système le nez dans mes journaux de log.</p>



<p>Une nouvelle fois je me suis tourné vers une solution purement personnelle. Pourquoi ?</p>



<p>Parce que j&rsquo;ai pas trouvé chaussure à mon pied&#8230;</p>



<p>Afin de répondre à cette question, je vais vérifier si des utilisateurs sont lock et envoyer une notification mail à l&rsquo;équipe en charge du MCO du serveur. Si ça ne suffit, pas, le mail reviendra tant que le compte n&rsquo;aura pas été unlock.</p>



<p>Plusieurs raisons peuvent être dû au verrouillage d&rsquo;un compte :</p>



<ul class="wp-block-list">
<li>Syndrome des doigts palmés</li>



<li>Oublie du login, password</li>



<li>Compte non habilité à se connecter</li>



<li>Tentative d&rsquo;intrusion</li>
</ul>



<p>Dans la majorité des cas, il résulte du syndrome du palmipède. Le compte est rapidement déverrouillé (par un autre compte ou par un autre biais). Dans le dernier cas, il convient d&rsquo;éplucher les journaux et de mettre rapidement des mesures pour isoler et interdire les IPs sources ayant tenter de s&rsquo;authentifier. D&rsquo;aller consulter son Responsable Sécurité pour engager les actions nécessaires en adéquations selon le risque couru.</p>





<h2 class="wp-block-heading">Prérequis</h2>



<ul class="wp-block-list">
<li>RHEL, Debian, Ubuntu</li>



<li>Mutt, cyrus-sasl-plain, Faillock</li>
</ul>



<h1 class="wp-block-heading">Locked Account &amp; Notifications</h1>



<h2 class="wp-block-heading">Installation et configuration de MUTT</h2>



<p>Concernant cette partie, je vous invite à parcourir la section déjà documentée dans l&rsquo;article <a href="https://erwanguillemard.com/apps-mutt/" data-type="link" data-id="https://erwanguillemard.com/apps-mutt/">Apps &#8211; MUTT</a>.</p>



<h2 class="wp-block-heading">Configuration de Faillock</h2>



<p>Le module faillock vient remplacer le module pam_tally2 devenu obsolète il y a un petit moment déjà. Il est présent nativement sur quasi tout les systèmes à ce jour.</p>



<p>Je ne traite pas volontairement dans cette partie de la politique de mot de passe. Cela fera parti d&rsquo;un autre article à la limite de l&rsquo;indigeste.</p>



<p>Il va être nécessaire de modifier les fichiers password-auth et system-auth du module d&rsquo;authentification.</p>



<h3 class="wp-block-heading">password-auth</h3>



<p>Editer le fichier password-auth</p>



<pre class="wp-block-code"><code><strong>$ sudo /etc/pam.d/password-auth</strong></code></pre>



<p>Ajouter les lignes suivantes dans le fichier</p>



<pre class="wp-block-code"><code>1) <strong>auth        required      pam_faillock.so preauth audit silent deny=5 unlock_time=900</strong>

2) <strong>auth        &#91;default=die] pam_faillock.so authfail audit deny=5 unlock_time=900</strong>

3) <strong>account     required      pam_faillock.so</strong></code></pre>



<p>La première ligne assure que l&rsquo;utilisateur à 5 tentatives de connexion avant de voir son compte verrouillé pour une durée de 15 minutes. Nous choisissons de logger l&rsquo;information et de ne pas indiquer que le compte est désactivé.</p>



<p>La seconde ligne indique qu&rsquo;en cas d&rsquo;échec de la ligne précédente, le compte sera locked.</p>



<p>La troisième ligne indique que le module d&rsquo;authentification faillock et requis.</p>



<h3 class="wp-block-heading">system-auth</h3>



<p>Editer le fichier system-auth</p>



<pre class="wp-block-code"><code><strong>$ sudo /etc/pam.d/system-auth</strong></code></pre>



<p>Ajouter les lignes suivantes dans le fichier</p>



<pre class="wp-block-code"><code>1) <strong>auth        required      pam_faillock.so preauth audit silent deny=5 unlock_time=900</strong>

2) <strong>auth        &#91;default=die] pam_faillock.so authfail audit deny=5 unlock_time=900</strong>

3) <strong>account     required      pam_faillock.so</strong></code></pre>



<p>Les explications sont les mêmes que pour le module précédent.</p>



<h3 class="wp-block-heading">Test</h3>



<p>Vérifions que les modifications apportées ont bien été prise en compte. Pour se faire nous allons vérifier l&rsquo;état des comptes Valid</p>



<pre class="wp-block-code"><code><strong>$ sudo faillock</strong></code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="896" height="89" src="https://erwanguillemard.com/wp-content/uploads/2024/01/006_3_faillock.png" alt="" class="wp-image-1374" srcset="https://erwanguillemard.com/wp-content/uploads/2024/01/006_3_faillock.png 896w, https://erwanguillemard.com/wp-content/uploads/2024/01/006_3_faillock-300x30.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/01/006_3_faillock-768x76.png 768w" sizes="auto, (max-width: 896px) 100vw, 896px" /></figure>



<p>Volontairement nous allons verrouiller le compte <strong>adm.r-one</strong>. Il est nécessaire d&rsquo;avoir un second shell d&rsquo;ouvert en parallèle pour déverrouiller le compte ou de passer par la console système en <strong>root</strong> directement. </p>



<p>Ou encore, en dernière option d&rsquo;attendre 15 minutes.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="847" height="533" src="https://erwanguillemard.com/wp-content/uploads/2024/01/006_4_faillock_locked.png" alt="" class="wp-image-1375" srcset="https://erwanguillemard.com/wp-content/uploads/2024/01/006_4_faillock_locked.png 847w, https://erwanguillemard.com/wp-content/uploads/2024/01/006_4_faillock_locked-300x189.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/01/006_4_faillock_locked-768x483.png 768w" sizes="auto, (max-width: 847px) 100vw, 847px" /></figure>



<p>Nous allons libérer l&rsquo;utilisateur <strong>adm.r-one</strong> puis vérifier que ce dernier est bien unlocked.</p>



<pre class="wp-block-code"><code><strong>$ sudo faillock --user adm.r-one --reset
$ sudo faillock</strong></code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="847" height="131" src="https://erwanguillemard.com/wp-content/uploads/2024/01/006_5_faillock_release.png" alt="" class="wp-image-1376" srcset="https://erwanguillemard.com/wp-content/uploads/2024/01/006_5_faillock_release.png 847w, https://erwanguillemard.com/wp-content/uploads/2024/01/006_5_faillock_release-300x46.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/01/006_5_faillock_release-768x119.png 768w" sizes="auto, (max-width: 847px) 100vw, 847px" /></figure>



<h2 class="wp-block-heading">Configuration et installation du Script</h2>



<p>J’ai toujours pour habitude de positionner mes scripts à la racine du système dans un répertoire à part avec des droits spécifiques. L’objectif étant de toujours garantir un niveau de sécurité suffisant et d’éviter une escalade potentiel des droits.</p>



<pre class="wp-block-code"><code><strong>$ sudo mkdir /script</strong>
<strong>$ sudo mkdir /script/SS_027-LINUX_LockAccount</strong></code></pre>



<p>Editez le fichier ou copiez le fichier suivant&nbsp;: <em>SS_027_D_LINUX_LockAccount.sh</em></p>



<p>A ce jour le fichier en version D est construit de la manière suivante&nbsp;:</p>



<ul class="wp-block-list">
<li>Les constantes</li>



<li>Une fonction vérifiant l’OS</li>



<li>Une fonction vérifiant les derniers logon authentifiés avec succès (utilisateurs et services)</li>



<li>Une fonction vérifiant les comptes verouillés</li>



<li>Une fonction pour préparer le mail</li>



<li>Une fonction d’envoi de mail</li>



<li>Une fonction pour forger le mail en html</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="849" height="1002" src="https://erwanguillemard.com/wp-content/uploads/2024/01/006_0_scriptCode.png" alt="" class="wp-image-1349" style="width:545px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/01/006_0_scriptCode.png 849w, https://erwanguillemard.com/wp-content/uploads/2024/01/006_0_scriptCode-254x300.png 254w, https://erwanguillemard.com/wp-content/uploads/2024/01/006_0_scriptCode-768x906.png 768w" sizes="auto, (max-width: 849px) 100vw, 849px" /></figure>
</div>


<p>Comme tous mes autres outils, les premiers échanges de mails se sont fait au format texte brut, puis pour un soucis de compréhension j&rsquo;ai dû passer au format HTML&#8230; </p>



<p>Il est encore trop tôt pour expliquer cette aversion personnel pour le monde du web&#8230; Mais passons, il est donc possible d&rsquo;envoyer les notifications sous les deux formats.</p>



<p>Pour le script, comme pour mon premier article sur le sujet je ne souhaite pas pour l&rsquo;instant rendre ce dernier accessible à la disposition de tous. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em><strong>Couvrez ce code que je ne saurais voir.</strong>&nbsp;<strong>Par de pareils objets les AdminSys sont blessées,</strong>&nbsp;<strong>Et cela fait venir de coupables pensées</strong></em>&#8230;</p>
<cite>Molière 2.0</cite></blockquote>



<p>Et surtout cela me demanderai de configurer mon GitHub, de soigner mon code etc.</p>



<p>So, comment le code fonctionne ? De la plus simple des façons.</p>



<p>Le code va vérifier la version du SE, puis vérifier si des comptes sont verrouillés ou non. Si un des comptes est verrouillés, nous récupérons ces derniers. Nous récupérons la date de la dernière fois que tous les comptes se sont connectés (afin de contrôler qu&rsquo;il n&rsquo;y a pas de Léviator sous Racaillou). S&rsquo;ensuit la préparation du mail, le « forgeage » puis l&rsquo;envoi.</p>



<p>Dans le cas où aucun compte n&rsquo;est verrouillé, le code ne fait rien.</p>



<p>Nous controllons les droits sur le fichier afin de s&rsquo;assurer que ce dernier est bien en 700 pour root:root.</p>



<pre class="wp-block-code"><code><strong>$ sudo ls -ahl /script/SS_027-LINUX_LockAccount/</strong>
</code></pre>



<p>Dans le cas contraire, il sera nécessaire de réaliser les opérations adéquates.</p>



<h2 class="wp-block-heading">Configuration du cron</h2>



<p>Comme nous voulons une alerte plutôt réactive, mais qui ne spam pas trop non plus, j&rsquo;aime par confort définir une vérification toutes les 3 minutes. Libre à chacun de faire comme il le souhaite.</p>



<pre class="wp-block-code"><code><strong># vim /etc/crontab</strong></code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="334" src="https://erwanguillemard.com/wp-content/uploads/2024/01/006_1_cron-1024x334.png" alt="" class="wp-image-1366" srcset="https://erwanguillemard.com/wp-content/uploads/2024/01/006_1_cron-1024x334.png 1024w, https://erwanguillemard.com/wp-content/uploads/2024/01/006_1_cron-300x98.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/01/006_1_cron-768x250.png 768w, https://erwanguillemard.com/wp-content/uploads/2024/01/006_1_cron.png 1052w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Ce qui nous donne dans notre BAL, lorsqu&rsquo;un compte est verrouillé la notification ci-dessous.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="556" height="755" src="https://erwanguillemard.com/wp-content/uploads/2024/01/006_2_notifications.png" alt="" class="wp-image-1371" srcset="https://erwanguillemard.com/wp-content/uploads/2024/01/006_2_notifications.png 556w, https://erwanguillemard.com/wp-content/uploads/2024/01/006_2_notifications-221x300.png 221w" sizes="auto, (max-width: 556px) 100vw, 556px" /></figure>
</div>


<h1 class="wp-block-heading">Conclusion</h1>



<p>La roue a dû encore une fois être réinventée. Mais cette solution me convient et répond à mon besoin.</p>



<p>Nous revenons toujours sur ce curseur bénéfices, risques que cette solution apporte.</p>



<p>Si niveau système, la configuration et l&rsquo;usage du module faillock dans les modules d&rsquo;authentifications relève de la bonne pratique, ma solution pose question.</p>



<p>Avantages</p>



<ul class="wp-block-list">
<li>Suivi des alertes quasi en temps réel sur lock du compte</li>
</ul>



<p>Inconvénients</p>



<ul class="wp-block-list">
<li>Utilise le compte root pour la tâche planifiée</li>



<li>Repose sur un paquet, application tiers « MUTT »</li>



<li>Doit être ajusté selon les SEs qui ne sont pas pris en charge</li>



<li>S’assurer que le script n’est pas altéré</li>
</ul>



<p>Au delà des axes récurrents d&rsquo;améliorations, nous comptons plus d&rsquo;inconvénients que d&rsquo;avantages. Le point le plus bloquant selon moi est que tout repose sur le daemon assurant les notifications mails. Si le daemon vient à planter ou à être la cible d&rsquo;un individu malveillant rendant ce dernier inopérant, l&rsquo;attaquant a le champ libre.</p>



<p>Dans un sens si nous revenons à notre analogie initiale du serveur et de notre maison, l&rsquo;individu malveillant nous à couper notre système d&rsquo;alarme, internet et électricité ect.</p>



<p>Nous devons donc coupler des mécanismes de sécurité supplémentaires en amont et aval de notre serveur.</p>



<p>Le mot de la fin&nbsp;:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>J&rsquo;Houdini ma twingo et pars avant l&rsquo;orage. Vous ne pouvez pas vous êtes faillock avec Francis Huster pendant deux madeleines</em></p>
<cite>Erwan GUILLEMARD</cite></blockquote>



<h2 class="wp-block-heading">Sources</h2>



<ul class="wp-block-list">
<li><a href="https://linux.die.net/man/8/faillock">Faillock</a></li>



<li><a href="https://erwanguillemard.com/apps-mutt/">Mutt</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
