<?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>Linux &#8211; erwan.guillemard</title>
	<atom:link href="https://erwanguillemard.com/category/linux/feed/" rel="self" type="application/rss+xml" />
	<link>https://erwanguillemard.com</link>
	<description>Blog personnel</description>
	<lastBuildDate>Sat, 15 Aug 2026 09:38:05 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://erwanguillemard.com/wp-content/uploads/2024/02/cropped-Logo-sans-baseline-32x32.png</url>
	<title>Linux &#8211; erwan.guillemard</title>
	<link>https://erwanguillemard.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Apps &#8211; GUACAMOLE</title>
		<link>https://erwanguillemard.com/apps-guacamole/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Sat, 15 Aug 2026 09:38:05 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[Bastion]]></category>
		<category><![CDATA[Guacamole]]></category>
		<category><![CDATA[Securité]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=3751</guid>

					<description><![CDATA[La prise en main à distance sur les SIs est un sujet qui questionne toujours. Certains vous diront qu&#8217;il est question de sécurité, d&#8217;autres de flexibilité ou encore de disponibilité&#8230; C&#8217;est ainsi qu&#8217;un certain nombres d&#8217;équipes informatiques utilisent : Je vois cela d&#8217;un autre regard et sous un autre angle. Je veux parler du regard...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">La prise en main à distance sur les SIs<sup data-fn="b23a0fec-6c5b-46e0-8d6e-eeece1a2f766" class="fn"><a href="#b23a0fec-6c5b-46e0-8d6e-eeece1a2f766" id="b23a0fec-6c5b-46e0-8d6e-eeece1a2f766-link">1</a></sup> est un sujet qui questionne toujours. Certains vous diront qu&rsquo;il est question de sécurité, d&rsquo;autres de flexibilité ou encore de disponibilité&#8230;</p>



<p class="wp-block-paragraph">C&rsquo;est ainsi qu&rsquo;un certain nombres d&rsquo;équipes informatiques utilisent :</p>



<ul class="wp-block-list">
<li>VPN SSL<sup data-fn="451eaba6-4b2d-47cd-87ad-683a8801b884" class="fn"><a href="#451eaba6-4b2d-47cd-87ad-683a8801b884" id="451eaba6-4b2d-47cd-87ad-683a8801b884-link">2</a></sup></li>



<li>RDS<sup data-fn="d2294f0d-f3f5-438c-8056-dee10df02f95" class="fn"><a href="#d2294f0d-f3f5-438c-8056-dee10df02f95" id="d2294f0d-f3f5-438c-8056-dee10df02f95-link">3</a></sup> via TSGW<sup data-fn="e0d3d39a-a480-46c8-a565-400c3e99f864" class="fn"><a href="#e0d3d39a-a480-46c8-a565-400c3e99f864" id="e0d3d39a-a480-46c8-a565-400c3e99f864-link">4</a></sup></li>



<li>Solution de prise en main à distance (TeamViewer, LogMeIn, NinjaRMM et j&rsquo;en passe)</li>
</ul>



<p class="wp-block-paragraph">Je vois cela d&rsquo;un autre regard et sous un autre angle. Je veux parler du regard du contrôle, de l&rsquo;audit et de la non-répudiation ! Du respect du RGPD<sup data-fn="ffad01f9-20fe-4d7a-b264-a5a83f01c0c6" class="fn"><a href="#ffad01f9-20fe-4d7a-b264-a5a83f01c0c6" id="ffad01f9-20fe-4d7a-b264-a5a83f01c0c6-link">5</a></sup> et des données stockées. Oui, je fais partie de ces SysAdmins là, ceux qui croient en l&rsquo;ISO27001 et HDS<sup data-fn="658f9d5f-2a83-4303-9299-6ace8b6ea93a" class="fn"><a href="#658f9d5f-2a83-4303-9299-6ace8b6ea93a" id="658f9d5f-2a83-4303-9299-6ace8b6ea93a-link">6</a></sup>, ceux qui croient au BASTION &lt;3</p>



<p class="wp-block-paragraph">Je ne vais pas cracher sur TeamViewer car je l&rsquo;ai longtemps utilisé à des fins personnelles pour me connecter à mon lab, mais bon niveau sécurité c&rsquo;est loin d&rsquo;être fou et encore une fois, où sont mes données ? Et il est toujours borderline dans son utilisation commerciale ou non&#8230;</p>



<p class="wp-block-paragraph">Dans le monde professionnel, j&rsquo;ai eu le loisir d&rsquo;utiliser et d&rsquo;implémenter une solution française de BASTION. Cette solution est super (je n&rsquo;ai pas d&rsquo;action chez eux mais c&rsquo;est avec grand plaisir que je réaliserais de nouveau l&rsquo;implémentation de cette solution) et les équipes support et commercial sont très compétentes.</p>



<p class="has-text-align-center wp-block-paragraph"><strong><em>Quoi ? Le nom de la solution ? Cleanroom/Cyberelement par SYSTANCIA</em></strong></p>



<p class="has-text-align-left wp-block-paragraph">Mais voilà. Bien qu&rsquo;une super solution, moi pauvre petit AdminSys je ne peux pas me payer la solution voyez vous et bonjour l&rsquo;usage pour du lab. C&rsquo;est alors que j&rsquo;ai dû me tourner vers le monde de l&rsquo;open source&#8230;</p>



<p class="has-text-align-left wp-block-paragraph">J&rsquo;ai fait fumer mes méninges et avec <a href="https://www.youtube.com/watch?v=y-ewGIghpyo&amp;list=RDy-ewGIghpyo&amp;start_radio=1">la grosse Adrienne de mon talant</a> (où Montalant ? 🙂 ) je me suis lancé dans l&rsquo;implémentation d&rsquo;un bastion GUACAMOLE ! OLE !</p>



<p class="has-text-align-left wp-block-paragraph">En réalité, ce n&rsquo;est pas ma première tentative d&rsquo;implémentation du bastion Guacamole, mais je n&rsquo;ai jamais aimé l&rsquo;approche Docker et je n&rsquo;ai jamais eu le temps de vraiment étudier la solution. Pis là bah, je me suis dit c&rsquo;est le moment de réaliser ce que je n&rsquo;ai jamais réussi à concrétiser 🙂</p>





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



<p class="wp-block-paragraph">Cet article va être plutôt conséquent. Donc il est préférable de se prendre un petit pack de cerveza (pourquoi petit ?) pour ne pas se déshydrater pendant ce billet.</p>



<p class="wp-block-paragraph">Pour rendre ce dernier plus digeste, j&rsquo;ai pris le parti de scinder quelques fonctionnalités dans des billets dédiés et de couper l&rsquo;article en plusieurs sous-articles. L&rsquo;implémentation d&rsquo;un bastion nécessite un certain nombre de composants tiers et surtout une grande réflexion quant à l&rsquo;architecture et aux fonctionnalités.</p>



<p class="wp-block-paragraph">Bref, j&rsquo;ai fait le choix encore une fois de partir sur un environnement LINUX, RHEL<sup data-fn="067f23cc-88b8-45bc-bf6b-6bbb5ac4899d" class="fn"><a href="#067f23cc-88b8-45bc-bf6b-6bbb5ac4899d" id="067f23cc-88b8-45bc-bf6b-6bbb5ac4899d-link">7</a></sup> comme OS<sup data-fn="2fe2ddbd-72f5-40e2-9044-cfc779fee5bd" class="fn"><a href="#2fe2ddbd-72f5-40e2-9044-cfc779fee5bd" id="2fe2ddbd-72f5-40e2-9044-cfc779fee5bd-link">8</a></sup> et d&rsquo;appliquer comme d&rsquo;accoutumée le durcissement de l&rsquo;ANSSI<sup data-fn="a3a92c34-9ce0-428f-a6f8-cd58c62c570f" class="fn"><a href="#a3a92c34-9ce0-428f-a6f8-cd58c62c570f" id="a3a92c34-9ce0-428f-a6f8-cd58c62c570f-link">9</a></sup> pour les systèmes GNU/LINUX. Le bastion doit être le seul point d&rsquo;entrée de notre SI pour accéder à nos ressources. C&rsquo;est pourquoi je veux qu&rsquo;il soit le plus sécurisé possible. Je vais donc aller relativement loin dans la sécurisation et il n&rsquo;est donc pas impossible de se perdre en route. C&rsquo;est toutefois comme ça qu&rsquo;on apprend ! <a href="https://www.youtube.com/watch?v=wtGAHjqlnmo&amp;list=RDwtGAHjqlnmo&amp;start_radio=1">Il faut pour se trouver savoir se perdre sur des chemins de traverse</a> 🙂</p>



<p class="wp-block-paragraph">J&rsquo;ai beaucoup appris et ainsi, je souhaite vous partager mon expérience. </p>



<p class="has-text-align-center wp-block-paragraph"><strong><em>Señor, Señora, Ándale Ándale Arriba</em></strong> <strong>!</strong></p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="696" height="392" src="https://erwanguillemard.com/wp-content/uploads/2026/05/AP_017_001_font.jpg" alt="" class="wp-image-3885" style="width:350px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/05/AP_017_001_font.jpg 696w, https://erwanguillemard.com/wp-content/uploads/2026/05/AP_017_001_font-300x169.jpg 300w" sizes="(max-width: 696px) 100vw, 696px" /></figure>
</div>


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



<ul class="wp-block-list">
<li><strong>SE :</strong> 
<ul class="wp-block-list">
<li>GNU/Linux RHEL</li>
</ul>
</li>



<li><strong>Apps :</strong>
<ul class="wp-block-list">
<li>Guacamole 1.6</li>



<li>Tomcat 9.X</li>



<li>MariaDB 15.X</li>



<li>Nginx</li>
</ul>
</li>



<li><strong>Autres :</strong>
<ul class="wp-block-list">
<li>Certificats</li>
</ul>
</li>
</ul>



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



<ul class="wp-block-list">
<li><a href="https://erwanguillemard.com/apps-guacamole-partie-1-theorie/"><strong>Partie 1 : Théorie</strong></a>
<ul class="wp-block-list">
<li>Définir ce qu&rsquo;est un bastion</li>



<li>Réflexion sur l&rsquo;architecture</li>
</ul>
</li>



<li><strong><a href="https://erwanguillemard.com/apps-guacamole-partie-2-pratique/">Partie 2 : Installation</a></strong>
<ul class="wp-block-list">
<li>Guide de déploiement</li>
</ul>
</li>



<li><a href="https://erwanguillemard.com/apps-guacamole-partie-3-securisation/"><strong>Partie 3: Sécurisation</strong></a>
<ul class="wp-block-list">
<li>Réseau</li>



<li>Système</li>



<li>Application</li>
</ul>
</li>



<li><strong><a href="https://erwanguillemard.com/apps-guacamole-partie-4-configuration/">Partie 4 : Configuration</a></strong>
<ul class="wp-block-list">
<li>Paramètres</li>



<li>Utilisateurs</li>



<li>Groupes</li>



<li>Ressources</li>
</ul>
</li>



<li><strong>Partie 5 : Démonstration</strong>
<ul class="wp-block-list">
<li>Présentation de la solution</li>
</ul>
</li>
</ul>



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



<p class="wp-block-paragraph">Il n&rsquo;est pas évident aujourd&rsquo;hui de garder la main sur nos environnements de manière sécurisée, comme il n&rsquo;est pas aisé de contrôler l&rsquo;ensemble des activités d&rsquo;un fournisseur ou prestataire sur notre SI. Même si la connexion est éphémère, nous nous devons de contrôler cette dernière. J&rsquo;ai repris la lecture des poèmes d&rsquo;Omar KHAYYÂM, et je suis tombé sur celui-ci que je trouve à la fois beau et adapté à la thématique de mon billet. (Je ne parle pas de politique et je lis depuis très longtemps cet ouvrage).</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-text-align-left wp-block-paragraph"><em>Considère ce vieux caravansérail qu’on nomme le monde,<br>dont les portes sont le Jour et la Nuit ;<br>des souverains y passent avec leur faste,<br>y demeurent une heure ou deux… puis s’en vont</em></p>
<cite>Omar KHAYYÂM &#8211; Robâiyât</cite></blockquote>



<p class="wp-block-paragraph">Nous pouvons alors facilement considérer que le caravansérail est notre bastion, les voyageurs nos sessions, les gardiens de la porte les administrateurs systèmes et réseaux&#8230;</p>



<p class="wp-block-paragraph">Les solutions de BASTION bien qu&rsquo;onéreuses viennent pallier à tous cela. Toutefois et c&rsquo;est souvent l&rsquo;argument le coût de la solution est difficilement supportable ce qui justifie l&rsquo;usage à tort et pour tout des VPN SSL, TS GW ou des outils de prise en main à distance. A l&rsquo;inverse GUACAMOLE répond à l&rsquo;ensemble des problématiques financières et technologiques. J&rsquo;ai un bastion gratuit et souverain sur mon SI que demander de mieux ? Ce n&rsquo;est malheureusement pas gratuit. Regardons de plus près le coût ETP<sup data-fn="cf376983-08ec-4d96-918a-505df778c0b1" class="fn"><a href="#cf376983-08ec-4d96-918a-505df778c0b1" id="cf376983-08ec-4d96-918a-505df778c0b1-link">10</a></sup> lié à la solution. Il faut installer, maintenir la solution au-delà de son contexte infrastructure mais également applicative. Et comme vous pouvez le constater, c&rsquo;est loin d&rsquo;une mince affaire pour qui souhaite bien faire les choses.</p>



<p class="wp-block-paragraph">Le choix de ne pas passer par la technologie docker m&rsquo;est propre. Je ne vois pas l&rsquo;utilité d&rsquo;une telle solution pour un projet de ce type. Docker reste pour moi un usage de développement et non de production. Je ne dis pas que c&rsquo;est mauvais, je dis que cela ne m&rsquo;est pas adapté. Un jour peut-être je changerai d&rsquo;avis, pour l&rsquo;instant la tête de cochon que je suis continuera de réaliser ces infrastructures en environnement non containerisé ! (GUILLEMARD ça rime avec tête de lard pour ne pas dire co**ard 🙂 )</p>



<p class="wp-block-paragraph">Je suis content d&rsquo;arriver au bout de cet article et de cet outil magnifique qu&rsquo;est GUACAMOLE. J&rsquo;aurai appris énormément de choses encore et cela faisait longtemps que je n&rsquo;avais pas passé des nuits blanches à cogiter sur des débugs et analyses. Je pense toutefois que la solution doit être sauvegardé au cas où et ce peu importe la solution utilisée. Si le bastion reste indisponible pour de bonnes et mauvaise raisons, il nous faut alors passer par la poterne de notre SI pour voir ce qu&rsquo;il se passe. Son usage doit être restreint au maximum et doit se faire qu&rsquo;en cas d&rsquo;extrême nécessité.</p>



<p class="wp-block-paragraph">La morale de ce billet se résumera à si j&rsquo;avais un budget je passerai sans hésiter par SYSTANCIA (non je n&rsquo;ai pas d&rsquo;action), solution française, support humain et sympathique et une analyse forte en cas d&rsquo;incident et de correctif applicatif de l&rsquo;ensemble de leurs solutions (<em><strong>Cleanroom </strong>devenu <strong>CyberElements</strong></em>). Malheureusement, je n&rsquo;ai pas le sou et donc je me rabat sur Apache GUACAMOLE et cela n&rsquo;est pas sans regrets 🙂</p>



<p class="wp-block-paragraph">Le mot de la fin :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>J&rsquo;initie une connexion guacamole sur fond de paddle. Votre avocat fait appel et vous informe que la balle est au centre. UN-DEUX-TROIS, on ne se bat pas ici ! Superbe relance de l&rsquo;ami Kaouette, une teq paf pour la 12.</em></p>
<cite>Erwan GUILLEMARD</cite></blockquote>



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



<ul class="wp-block-list">
<li><a href="https://guacamole.apache.org/releases/1.6.0/">GUACAMOLE : Download page</a></li>



<li><a href="https://guacamole.apache.org/doc/gug/guacamole-native.html">GUACAMOLE : Native Installation Guide</a></li>



<li><a href="https://www.systancia.com/">SYSTANCIA</a></li>
</ul>


<ol class="wp-block-footnotes"><li id="b23a0fec-6c5b-46e0-8d6e-eeece1a2f766"><strong>SI :</strong> Système d&rsquo;Information <a href="#b23a0fec-6c5b-46e0-8d6e-eeece1a2f766-link" aria-label="Aller à la note de bas de page 1">↩︎</a></li><li id="451eaba6-4b2d-47cd-87ad-683a8801b884"><strong>VPN SSL :</strong> Virtual Private Network Secure Socket Layer <a href="#451eaba6-4b2d-47cd-87ad-683a8801b884-link" aria-label="Aller à la note de bas de page 2">↩︎</a></li><li id="d2294f0d-f3f5-438c-8056-dee10df02f95"><strong>RDS :</strong> Remote Desktop Server <a href="#d2294f0d-f3f5-438c-8056-dee10df02f95-link" aria-label="Aller à la note de bas de page 3">↩︎</a></li><li id="e0d3d39a-a480-46c8-a565-400c3e99f864"><strong>TSGW :</strong> Terminal Server GateWay <a href="#e0d3d39a-a480-46c8-a565-400c3e99f864-link" aria-label="Aller à la note de bas de page 4">↩︎</a></li><li id="ffad01f9-20fe-4d7a-b264-a5a83f01c0c6"><strong>RGPD :</strong> Règlement Général de Protection des Données <a href="#ffad01f9-20fe-4d7a-b264-a5a83f01c0c6-link" aria-label="Aller à la note de bas de page 5">↩︎</a></li><li id="658f9d5f-2a83-4303-9299-6ace8b6ea93a"><strong>HDS :</strong> Hébergement de Données de Santé <a href="#658f9d5f-2a83-4303-9299-6ace8b6ea93a-link" aria-label="Aller à la note de bas de page 6">↩︎</a></li><li id="067f23cc-88b8-45bc-bf6b-6bbb5ac4899d"><strong>RHEL :</strong> RedHat Entreprise Linux <a href="#067f23cc-88b8-45bc-bf6b-6bbb5ac4899d-link" aria-label="Aller à la note de bas de page 7">↩︎</a></li><li id="2fe2ddbd-72f5-40e2-9044-cfc779fee5bd"><strong>OS :</strong> Operating System <a href="#2fe2ddbd-72f5-40e2-9044-cfc779fee5bd-link" aria-label="Aller à la note de bas de page 8">↩︎</a></li><li id="a3a92c34-9ce0-428f-a6f8-cd58c62c570f"><strong>ANSSI :</strong> Agence National de Sécurité des Systèmes d&rsquo;Information <a href="#a3a92c34-9ce0-428f-a6f8-cd58c62c570f-link" aria-label="Aller à la note de bas de page 9">↩︎</a></li><li id="cf376983-08ec-4d96-918a-505df778c0b1"><strong>ETP :</strong> Employé(e) Temps Plein <a href="#cf376983-08ec-4d96-918a-505df778c0b1-link" aria-label="Aller à la note de bas de page 10">↩︎</a></li></ol>


<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Apps &#8211; Tomcat</title>
		<link>https://erwanguillemard.com/apps-tomcat/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Sat, 08 Aug 2026 13:23:00 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[Tomcat]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=3761</guid>

					<description><![CDATA[C&#8217;est marrant, je veux parler d&#8217;une techno et voilà que je me retrouve à implémenter une serveur Tomcat. Je me dis « Nan mais ça va passer je vais pas faire un article&#8230; » Hé ba force est de constater que si, j&#8217;ai fait un article. Mais alors pourquoi faire un article sur Tomcat ? Parce que...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">C&rsquo;est marrant, je veux parler d&rsquo;une techno et voilà que je me retrouve à implémenter une serveur Tomcat. Je me dis « Nan mais ça va passer je vais pas faire un article&#8230; » Hé ba force est de constater que si, j&rsquo;ai fait un article.</p>



<p class="has-text-align-center wp-block-paragraph"><strong>Mais alors pourquoi faire un article sur Tomcat ?</strong></p>



<p class="wp-block-paragraph">Parce que premièrement cela aurait rendu l&rsquo;article indigeste déjà qu&rsquo;en temps normal ce n&rsquo;est pas ouf et que deuxièmement en creusant un peu le sujet cela ne se résume pas à juste un <strong><em>dnf install tomcat</em></strong>&#8230;</p>



<p class="wp-block-paragraph">Bref, ce billet sera technique car j&rsquo;ai hâte de revenir à mon article initial. Mais cela vaut le coup car j&rsquo;ai appris encore énormément de chose 🙂</p>



<p class="has-text-align-center wp-block-paragraph"><a href="https://www.youtube.com/watch?v=r4OhIU-PmB8&amp;list=RDr4OhIU-PmB8&amp;start_radio=1">Tommy the Cat is my name and I say unto thee</a></p>





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



<p class="wp-block-paragraph">L&rsquo;étude de Tomcat vient simplement de l&rsquo;implémentation d&rsquo;un billet qui sera publié prochainement qui nécessite la présence d&rsquo;un serveur d&rsquo;applet Java. Je garde volontairement une part de mystère, sinon ce n&rsquo;est pas marrant non ? 🙂</p>



<p class="wp-block-paragraph">De mon passé, d&rsquo;étudiant, j&rsquo;ai appris la POO<sup data-fn="16da1029-699d-4bca-a6e9-7768a7099ca3" class="fn"><a href="#16da1029-699d-4bca-a6e9-7768a7099ca3" id="16da1029-699d-4bca-a6e9-7768a7099ca3-link">1</a></sup> lors de mes études en BTS<sup data-fn="8fe03776-25cc-4570-88c0-2c285e68ced0" class="fn"><a href="#8fe03776-25cc-4570-88c0-2c285e68ced0" id="8fe03776-25cc-4570-88c0-2c285e68ced0-link">2</a></sup> d&rsquo;info industrielle sur C++. J&rsquo;avoue que je n&rsquo;ai pas bien saisie la pratique&#8230; C&rsquo;est lors de ma licence en sécu logicielle que j&rsquo;ai unlock et appliqué tous les pratiques de la POO sur le langage JAVA.</p>



<p class="has-text-align-center wp-block-paragraph"><strong><em>Cool ta life mon gars, ça aurait mérité un post Facebook en 2012 avec en premier commentaire « Ba moi hier j&rsquo;ai mangé une pomme »</em></strong></p>



<p class="wp-block-paragraph">Ouai peut-être mais cela a été pour moi une révélation. J&rsquo;ai trouvé ce langage magnifique et je pensais avoir trouvé ma voie. Et pourtant JAVA est loin d&rsquo;être un langage des plus fiable et ergonomique. Des IDEs<sup data-fn="6b0bb7de-b295-4951-b60c-c2f13e9cfca2" class="fn"><a href="#6b0bb7de-b295-4951-b60c-c2f13e9cfca2" id="6b0bb7de-b295-4951-b60c-c2f13e9cfca2-link">3</a></sup> NetBeans, Eclipse, Android Studio sans oublier le serveur d&rsquo;applet web GlassFish je trouvais ça top. Et puis je me suis rendu compte que les applets c&rsquo;étaient lourds, les applications Java difficilement ergonomique, des failles de sécurités qui doivent être patché avec des updates de la JDK<sup data-fn="af7fd030-5eb8-459c-b326-4cfe6ebc218e" class="fn"><a href="#af7fd030-5eb8-459c-b326-4cfe6ebc218e" id="af7fd030-5eb8-459c-b326-4cfe6ebc218e-link">4</a></sup> côté développeur de la JVM<sup data-fn="2c0f76eb-2466-4e3d-a508-12ed484fb0c7" class="fn"><a href="#2c0f76eb-2466-4e3d-a508-12ed484fb0c7" id="2c0f76eb-2466-4e3d-a508-12ed484fb0c7-link">5</a></sup>, JRE<sup data-fn="3767ce2d-4690-4d88-a81f-5a5abfb6e0ec" class="fn"><a href="#3767ce2d-4690-4d88-a81f-5a5abfb6e0ec" id="3767ce2d-4690-4d88-a81f-5a5abfb6e0ec-link">6</a></sup> côté client, le code qui ne devient plus compatible&#8230;</p>



<p class="wp-block-paragraph">Voilà, les raisons de pourquoi j&rsquo;ai délaissé mon amour de JAVA par dépit à la suite de ces frustrations. L&rsquo;une des autres raisons et la difficulté de jongler entre la sécurité des versions clients et les progicielles. Accepter de mettre à jour et ne plus travailler car au lancement de l&rsquo;application ou de fonctionnalité ça crash ou retourne des erreurs de stack traces dans tous les sens ou accepter d&rsquo;avoir des failles de sécurité partout et pouvoir travailler ? </p>



<p class="wp-block-paragraph">Bref, encore une fois, un article pour installer un service au premier abord simple mais qui nécessite d&rsquo;être bien sécurisé.</p>



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



<ul class="wp-block-list">
<li><strong>SE :</strong>
<ul class="wp-block-list">
<li>Rocky Linux 9.4 et versions ultérieures</li>
</ul>
</li>



<li><strong>Apps :&nbsp;</strong>
<ul class="wp-block-list">
<li>Tomcat 10.1.54</li>
</ul>
</li>



<li><strong>Autres :</strong>
<ul class="wp-block-list">
<li>Hardenned Linux</li>
</ul>
</li>
</ul>



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



<h3 class="wp-block-heading">Un peu d&rsquo;histoire</h3>



<p class="wp-block-paragraph"><em>Il était une fois, un meunier ne laissa pour tous biens, à trois enfants qu&rsquo;il avait, que son moulin, son âne et son chat.</em>.. </p>



<p class="wp-block-paragraph">Bien joué Charles 😉 Je ne vais pas vous compter le conte du Chat Botté de Perrault mais bien celle de Tomcat, je vous rassure, mais la tentation était trop grande &lt;3</p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>L&rsquo;objectif principal était de fournir une implémentation de référence pour JAVA Web (servlets et JSP<sup data-fn="5aa72831-364a-4813-a223-8651ecf90bfd" class="fn"><a href="#5aa72831-364a-4813-a223-8651ecf90bfd" id="5aa72831-364a-4813-a223-8651ecf90bfd-link">7</a></sup>). C&rsquo;est ainsi que James Duncan DAVIDSON créa Tomcat en 1998 sans lui donner encore de nom.<br><br>Le projet sera donné à la fondation Apache en 1999 qui le baptisera Tomcat et passera ce dernier sous licence OpenSource Apache.<br><br>Au cours des années 1999 à 2001, la première version stable de Tomcat est disponible pour principalement être utilisé comme moteur de servlet et est fortement lié au server web Apache.<br><br>Au fil des années, le projet Tomcat continuera d&rsquo;évoluer avec l&rsquo;âge d&rsquo;or d&rsquo;internet. A ce jour, la version la plus récente est la version 11 qui comme nous pouvons en douter à une optimisation pour le cloud et les micro services. (Il faut bien vivre avec son temps 🙂 ).<br></td><td class="has-text-align-center" data-align="center"><img decoding="async" width="550" height="679" class="wp-image-3804" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_001_font.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_001_font.jpg 735w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_001_font-243x300.jpg 243w" sizes="(max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Ce qu&rsquo;il est important de retenir, c&rsquo;est que ce dernier reste un projet OpenSource maintenu par une communauté très active. Tomcat reste également un serveur d&rsquo;application léger très populaire et de base (et c&rsquo;est pourquoi il est fortement lié à JAVA) la référence de l&rsquo;implémentation JAVA.</p>



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



<p class="wp-block-paragraph">Il est important comme pour toutes applications de savoir comment cette dernière est structurée et comment elle fonctionne.</p>



<p class="wp-block-paragraph">Ainsi, nous pouvons différencier 9 répertoires distincts au sein du daemon Tomcat :</p>



<ul class="wp-block-list">
<li><strong>bin :</strong> L&rsquo;ensemble des scripts et exécutables propre au daemon pour démarrer ou arrêter le serveur.</li>



<li><strong>common :</strong> Nous pourrions dire que ce répertoire contient le code (classes et méthodes) commun utilisé par le service Catalina et certaines applications web.</li>



<li><strong>conf :</strong> Le répertoire qui stocke les fichiers de configuration du server.</li>



<li><strong>lib :</strong> Répertoire qui stocke l&rsquo;ensembles des bibliothèques (les .jar)</li>



<li><strong>logs :</strong> Dossier qui va stocker l&rsquo;ensemble des journaux d&rsquo;événement. Attention à ce que ce dernier ne prenne pas trop de place sinon BOUM plus de service. Le mieux serait de le déplacer sur un disque dédié.</li>



<li><strong>server :</strong> Code contenant les méthodes et classes systèmes utilisés uniquement de Catalina.</li>



<li><strong>shared :</strong> Les classes partagées utilisées par toutes les applications</li>



<li><strong>webapps :</strong> Répertoire qui va contenir les applications web (le fichier .war)</li>



<li><strong>work :</strong> Répertoire qui va contenir les répertoires et fichiers temporaires (le cache)</li>
</ul>



<p class="wp-block-paragraph">Chacun des répertoires joue un rôle clé et donc selon le contexte doit être sécurisé.</p>



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



<p class="wp-block-paragraph">Le fonctionnement de Tomcat peut paraitre complexe au premier abord. Toutefois avec un bon schéma, cela devient aussi divin que les croquettes Ultima Saumon pour chat stérilisé (« <em><strong>Sale Histoire</strong></em> » que mon avocat garde sous silence en reprenant la citation d&rsquo;un membre de la famille).</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="873" height="449" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_002_lifecylce.jpg" alt="" class="wp-image-3809" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_002_lifecylce.jpg 873w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_002_lifecylce-300x154.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_002_lifecylce-768x395.jpg 768w" sizes="(max-width: 873px) 100vw, 873px" /></figure>
</div>


<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3761_7231f1-be 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-pane3761_d60c16-59"><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>Phase 1 : Le connecteur</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="wp-block-paragraph">L&rsquo;utilisateur exécute une requête <strong>HTTP</strong><sup data-fn="49aa99e2-1a30-4956-b8aa-08bef6ca1b65" class="fn"><a href="#49aa99e2-1a30-4956-b8aa-08bef6ca1b65" id="49aa99e2-1a30-4956-b8aa-08bef6ca1b65-link">8</a></sup>, cette même requête se présente au connecteur sur le port <strong>8080</strong>. Le connecteur va alors transformer la requête en objets JAVA, deux pour être précis :</p>



<ul class="wp-block-list">
<li>Les données entrantes : <strong>HttpServletRequest</strong></li>



<li>Les données sortantes : <strong>HttpServletResponse</strong></li>
</ul>



<p class="wp-block-paragraph">Les données sortantes sont vides et seront complétées à la fin du traitement de la requête d&rsquo;entrée.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3761_1ceabd-49"><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>Phase 2 : L&rsquo;engin Catalina</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="wp-block-paragraph">Les données d&rsquo;entrées sont soumises au moteur de décision de son petit nom <strong>Catalina</strong>. Il va analyser l&rsquo;en-tête de la requête (header) pour orienter cette dernière vers le bon host virtuel.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane3761_31c3e0-db"><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>Phase 3 : Host &amp; Context</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="wp-block-paragraph">Un peu comme la tour de contrôle, nous pouvons voir ce dernier comme un aiguillage. Ainsi, si nous avions plusieurs domaines, le host va identifier le bon domaine et aiguiller le flux vers l&rsquo;application, le context.</p>



<p class="wp-block-paragraph">C&rsquo;est l&rsquo;application web spécifique (le .war) qui va alors traiter la demande. Nous pouvons donc avoir une multitude d&rsquo;application sur le même serveur.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane3761_039b51-8c"><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>Phase 4 : L&rsquo;Exécution</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="wp-block-paragraph">Le <strong>wrapper </strong>va appeler notre <strong>servlet </strong>correspondant. Tomcat charge alors la <strong>classe </strong>JAVA, l&rsquo;instancie et appelle la méthode <strong>Service()</strong>, <strong>doGet()</strong> ou <strong>doPost()</strong>.</p>



<p class="wp-block-paragraph">Le code va alors s&rsquo;exécuter et retourner la réponse dans l&rsquo;objet en attente, <strong>HttpServletResponse </strong>dissocier de la requête à l&rsquo;étape 1.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-5 kt-pane3761_13b9e2-6d"><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>Phase 5 : La Réponse</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="wp-block-paragraph">Tomcat récupère l&rsquo;objet réponse et va alors transformer cette dernière en flux de données HTTP (texte, HTLM, JSON) et renvoyer par le biais du connecteur la réponse au navigateur du client.</p>
</div></div></div>
</div></div></div>



<p class="wp-block-paragraph"></p>



<p class="has-text-align-center wp-block-paragraph"><span style="text-decoration: underline;"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-13-color">/!\</mark> Attention :</strong></span> Cette architecture reste valable, mais Tomcat 10 a migré vers <strong>Jakarta EE</strong> en rendant incompatible les applications basées sur <strong>javax.servlet</strong>. Donc si usage des Servlets c&rsquo;est Tomcat 9&#8230;</p>



<p class="wp-block-paragraph">Pour faire simple, si lors du lancement de votre application ne se lance pas et que dans les logs localhost ou catalina vient fleurir l&rsquo;erreur <code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-13-color"><strong><em><span style="text-decoration: underline;">ClassNotFoundException: javax.servlet</span></em></strong></mark></code>, et bien c&rsquo;est que vous l&rsquo;avez dans l&rsquo;OS bien profond et que vous êtes marron&#8230; Votre application n&rsquo;est pas compatible Tomcat 10. Vous êtes bon pour un downgrade &lt;3 Ca fait du bien de temps en temps de se prendre un bon coup de nerf de bœuf sur l&rsquo;arrière train, ça fait circuler le sang !</p>



<p class="wp-block-paragraph">Cette structure modulaire d&rsquo;encapsulation, permet de garantir une certaine souplesse sans avoir à changer la logique des applications.</p>



<p class="wp-block-paragraph">Je pense qu&rsquo;il n&rsquo;y a pas besoin d&rsquo;en savoir plus pour installer le service sur notre serveur. Passe à la pratique.</p>



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



<p class="wp-block-paragraph">J&rsquo;ai pris le parti de sortir pour une nouvelle fois des sentiers battu et de ne pas me limiter à l&rsquo;installation de Tomcat depuis le repo source. J&rsquo;ai choisi de déployer ce dernier depuis le site officiel.</p>



<p class="wp-block-paragraph">Ce choix est motivé par les versions spécifiques nécessaire à certaines applications. De ce fait, l&rsquo;installation depuis le repo n&rsquo;est pas d&rsquo;une grande utilité. Et une nouvelle fois de par mon expérience, il est plus probable de passer par le site officiel.</p>



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



<p class="wp-block-paragraph">En termes de dépendance, ce n&rsquo;est pas bien compliqué, il nous faut la JDK pour faire tourner notre serveur Tomcat. Donc ?</p>



<p class="wp-block-paragraph">On installe la JDK 🙂</p>



<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-1"><code><strong>#Install Java
$ sudo dnf install java-21-openjdk-headless</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="940" height="656" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_100_install.jpg" alt="" class="wp-image-3785" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_100_install.jpg 940w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_100_install-300x209.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_100_install-768x536.jpg 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></figure>
</div>


<p class="wp-block-paragraph">Je passe encore et toujours mon tour sur cette étape qui devient un incontournable des billets que je rédige sous GNU/Linux.</p>



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



<p class="wp-block-paragraph">Bien. Maintenant que notre dépendance est installée, commençons par le début.</p>



<p class="wp-block-paragraph">Créons notre groupe <strong>tomcat </strong>et notre utilisateur de service <strong>tomcat</strong>. Pour répondre au bonne pratique, un service = un compte applicatif. Cela permet de faciliter le debug et surtout en termes de sécurité c&rsquo;est bien mieux que de tout faire tourner avec le compte root.</p>



<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-2"><code><strong>$ sudo groupadd tomcat
$ sudo useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat</strong></code></pre>



<p class="wp-block-paragraph">Naturellement, l&rsquo;utilisateur tomcat est membre du groupe tomcat&#8230;</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="941" height="42" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_101_groupserviceaccount.jpg" alt="" class="wp-image-3784" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_101_groupserviceaccount.jpg 941w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_101_groupserviceaccount-300x13.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_101_groupserviceaccount-768x34.jpg 768w" sizes="auto, (max-width: 941px) 100vw, 941px" /></figure>
</div>


<p class="wp-block-paragraph">L&rsquo;installation se fait de deux manières. Soit par la commande <strong>curl </strong>qui est nativement présente sur notre SE<sup data-fn="7e0a7bd5-b44e-4bc9-acf0-b0b5d4e1385c" class="fn"><a href="#7e0a7bd5-b44e-4bc9-acf0-b0b5d4e1385c" id="7e0a7bd5-b44e-4bc9-acf0-b0b5d4e1385c-link">9</a></sup>. Soit par <strong>wget </strong>qui devra être installé. Il conviendra d&rsquo;adapter l&rsquo;URL<sup data-fn="8d533817-d743-4f53-9f04-09b0d390cfa6" class="fn"><a href="#8d533817-d743-4f53-9f04-09b0d390cfa6" id="8d533817-d743-4f53-9f04-09b0d390cfa6-link">10</a></sup> selon la version recherchée. J&rsquo;ai décidé de télécharger le <strong>.tar.gz</strong> directement dans le répertoire <strong>/tmp</strong>.</p>



<p class="wp-block-paragraph">Créons-le répertoire <strong>/opt/tomcat</strong> puis décompressons notre archive stocké sous <strong>/tmp</strong> dans le répertoire fraichement créé.</p>



<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-3"><code><strong>$ curl -L --output-dir /tmp -O  https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.54/bin/apache-tomcat-10.1.54.tar.gz
$ mkdir /opt/tomcat
$ tar -xf /tmp/apache-tomcat-10.1.54.tar.gz -C /opt/tomcat --strip-components=1</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="939" height="216" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_102_getTomcat.jpg" alt="" class="wp-image-3783" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_102_getTomcat.jpg 939w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_102_getTomcat-300x69.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_102_getTomcat-768x177.jpg 768w" sizes="auto, (max-width: 939px) 100vw, 939px" /></figure>
</div>


<p class="wp-block-paragraph">Bon, si on regarde du côté de l&rsquo;ANSSI<sup data-fn="d2695521-2349-42a7-b9d8-98daece4022d" class="fn"><a href="#d2695521-2349-42a7-b9d8-98daece4022d" id="d2695521-2349-42a7-b9d8-98daece4022d-link">11</a></sup>, ces derniers nous recommandent que notre compte de service tomcat ne doit pas propriétaire des binaires (exécutables). Pourquoi ? Admettons qu&rsquo;il y est compromission, le compte ne sera pas en possibilité de s&rsquo;altérer lui-même. Ainsi, nous pouvons voir une sorte de silotage.</p>



<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-4"><code><strong>$ sudo chgrp -R tomcat /opt/tomcat
$ sudo chmod -R g+r /opt/tomcat/conf
$ sudo chmod g+x /opt/tomcat/conf
$ sudo chown -R tomcat /opt/tomcat/{webapps,work,temp,logs}</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="942" height="532" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_103_permissions.jpg" alt="" class="wp-image-3782" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_103_permissions.jpg 942w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_103_permissions-300x169.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_103_permissions-768x434.jpg 768w" sizes="auto, (max-width: 942px) 100vw, 942px" /></figure>
</div>


<p class="wp-block-paragraph">Le groupe utilisateur <strong>tomcat </strong>a donc les droits de lecture et d&rsquo;exécution sur l&rsquo;ensemble des sous éléments du répertoire <strong>/opt/tomcat</strong>. L&rsquo;utilisateur <strong>tomcat </strong>sera propriétaire uniquement des sous répertoires et leurs contenus :</p>



<ul class="wp-block-list">
<li><strong><span style="text-decoration: underline;">webapps :</span></strong> Répertoire qui va contenir les applications web (le fichier .war)</li>



<li><strong><span style="text-decoration: underline;">work :</span></strong> Répertoire qui va contenir les répertoires et fichiers temporaires (le cache) persistant. C&rsquo;est à dire utiliser par les servlets.</li>



<li><strong><span style="text-decoration: underline;">temp :</span></strong> Le répertoire va stocker les fichiers à déplacer. Il joue le rôle de passe plat. Les fichiers qui viendraient à persister sont automatiquement supprimés à chaque redémarrage du service.</li>



<li><strong><span style="text-decoration: underline;">logs :</span></strong> Les journaux d&rsquo;événements, il faut bien que le service puisse écrire ce qui se passe non ?</li>
</ul>



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



<p class="wp-block-paragraph">Niveau sécurité, les actions vont se concentrer et se définir dans le fichier server.xml ainsi que dans le fichier web.xml.</p>



<p class="wp-block-paragraph">L&rsquo;objectif sera de se prémunir des attaques classiques MIM<sup data-fn="6ba62ef7-23e3-40d7-9103-43c42443f43d" class="fn"><a href="#6ba62ef7-23e3-40d7-9103-43c42443f43d" id="6ba62ef7-23e3-40d7-9103-43c42443f43d-link">12</a></sup>, Clickjacking, XSS<sup data-fn="c7fe5ad0-6ab5-4d69-ae4a-8da0bea8e4b6" class="fn"><a href="#c7fe5ad0-6ab5-4d69-ae4a-8da0bea8e4b6" id="c7fe5ad0-6ab5-4d69-ae4a-8da0bea8e4b6-link">13</a></sup> et de masquer l&rsquo;identité de notre serveur le plus possible. Parce qu&rsquo;on ne dévoile pas tout le premier soir 😉</p>



<h4 class="wp-block-heading">Audit et divulgation d&rsquo;identité</h4>



<p class="wp-block-paragraph">Commençons par éditer le fichier server.xml.</p>



<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-5"><code><strong>$ sudo vim /opt/tomcat/conf/server.xml</strong></code></pre>



<p class="wp-block-paragraph">Un truc qui pourrait être tout bête, appliquons le principe : </p>



<p class="has-text-align-center wp-block-paragraph"><strong><em>Vivons heureux, Vivons cachés ! </em></strong></p>



<p class="wp-block-paragraph">C&rsquo;est à dire outre mon langage (car peu parle le Erwan première langue), masquons la version de notre serveur tomcat dans les trames d&rsquo;entêtes (le header&#8230;) HTTP. Ainsi il est possible de savoir que je suis un serveur tomcat, mais de connaitre ma version. 🙂</p>



<p class="has-text-align-center wp-block-paragraph"><strong>Malinx le Lynx. D&rsquo;un autre côté c&rsquo;est Tomcat&#8230; Voilà voilà, il est content de sa vanne&#8230;</strong></p>



<p class="has-text-align-center wp-block-paragraph">Dans le connecteur HTTP, ajouter <strong>server= » « </strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td class="has-text-align-center" data-align="center"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-13-color">Avant</mark></strong></td><td class="has-text-align-center" data-align="center"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-11-color">Après</mark></strong></td></tr><tr><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="308" height="98" class="wp-image-3787" style="width: 308px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_104_serverON.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_104_serverON.jpg 406w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_104_serverON-300x95.jpg 300w" sizes="auto, (max-width: 308px) 100vw, 308px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="235" class="wp-image-3788" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_105_serverOFF.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_105_serverOFF.jpg 401w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_105_serverOFF-300x128.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Tiens, tu ajoutes un <strong>secure= »true »</strong>. C&rsquo;est cool, du coup tu forces les connexions chiffrées ? 🙂 Et bien pas du tout ! Je me suis fait k*n aussi. Je suis allé regarder la documentation pour mieux comprendre. Par défaut, secure est à false. Nos applications par le biais de notre server peuvent refuser de délivrer les cookies sensibles ou vouloir rediriger les utilisateurs vers le protocole HTTPS<sup data-fn="f00b61b2-171d-465a-96ff-80a705088787" class="fn"><a href="#f00b61b2-171d-465a-96ff-80a705088787" id="f00b61b2-171d-465a-96ff-80a705088787-link">14</a></sup>. Dans le meilleur des cas ça créé des lenteurs au pire c&rsquo;est l&rsquo;infinity loop&#8230; Alors que si nous le forçons à <strong>true</strong>, Tomcat va confirmer auprès de l&rsquo;application que la requête vient d&rsquo;un canal sécurisé (ce qui n&rsquo;est pas le cas. Où le vilain menteur !) même s&rsquo;il vient d&rsquo;un canal non sécurisé.</p>



<p class="wp-block-paragraph">De toute façon, nous allons passer par un reverse proxy <strong>nginx </strong>et en frontal nous aurons une publication avec une règle de proxy.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="756" height="378" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_003_lifecylce.jpg" alt="" class="wp-image-3811" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_003_lifecylce.jpg 756w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_003_lifecylce-300x150.jpg 300w" sizes="auto, (max-width: 756px) 100vw, 756px" /></figure>
</div>


<p class="wp-block-paragraph">Toutefois cela ne suffit pas. Quand est-il des pages d&rsquo;erreurs ? En creusant un peu il va falloir fermer les valves&#8230; 🙂</p>



<p class="wp-block-paragraph">L&rsquo;objectif est de supprimer la mention « <strong>Apache Tomcat/&lt;version&gt;</strong> » dans les pages d&rsquo;erreurs ainsi que la description des erreurs (la <strong>stacktrace</strong>. Que de nostalgie&#8230;). L&rsquo;objectif est de donner le moins d&rsquo;information possible à un potentiel attaquant qui souhaiterai exploiter une CVE<sup data-fn="5523c1bf-ded6-4124-9e1d-b2fc579b24a2" class="fn"><a href="#5523c1bf-ded6-4124-9e1d-b2fc579b24a2" id="5523c1bf-ded6-4124-9e1d-b2fc579b24a2-link">15</a></sup> en relation avec la version de notre produit. L&rsquo;objectif est de rendre aveugle l&rsquo;attaquant le temps que les mécanismes en place ce déclenche ou nous alertes.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="875" height="441" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_107_Valve.jpg" alt="" class="wp-image-3789" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_107_Valve.jpg 875w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_107_Valve-300x151.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_107_Valve-768x387.jpg 768w" sizes="auto, (max-width: 875px) 100vw, 875px" /></figure>
</div>


<p class="wp-block-paragraph">Niveau Audit, nous pouvons également renforcer la verbosité si nous suivons les recommandations de l&rsquo;ANSSI.</p>



<pre class="wp-block-code"><code><strong>&lt;Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &amp;quot;%r&amp;quot; %s %b %D &amp;quot;%{User-Agent}i&amp;quot;" /></strong>
</code></pre>



<ul class="wp-block-list">
<li><strong>%h :</strong> l&rsquo;adresse IP distante</li>



<li><strong>%l :</strong> Identifiant logique</li>



<li><strong>%u : </strong>Utilisateur authentifié</li>



<li><strong>%t :</strong> horodatage</li>



<li><strong>%r :</strong> Ligne de requête (la méthode et l&rsquo;URL appelé)</li>



<li><strong>%s :</strong> Code de retour du protocole HTTP</li>



<li><strong>%b :</strong> Taille de la réponse en octet</li>



<li><strong>%D :</strong> Le temps de traitement en ms</li>



<li><strong>%i : </strong>Le User-Agent pour repérer les outils automatisés (nmap et autres) et surtout les navigateurs « chelou » comme diraient mes enfants&#8230;</li>
</ul>



<p class="wp-block-paragraph">Par exemple :</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="937" height="69" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_112_audit.jpg" alt="" class="wp-image-3780" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_112_audit.jpg 937w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_112_audit-300x22.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_112_audit-768x57.jpg 768w" sizes="auto, (max-width: 937px) 100vw, 937px" /></figure>
</div>


<p class="wp-block-paragraph"><span style="text-decoration: underline;"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-13-color">/!\</mark></strong></span> <strong><span style="text-decoration: underline;">Attention :</span> L&rsquo;activation de l&rsquo;audit n&rsquo;est pas anodine en termes d&rsquo;espace. Il faut penser à mettre en place une rotation des logs. Sinon&#8230; BOUM !!!</strong></p>



<p class="wp-block-paragraph">Toutes les applications par défaut, ça dégage ! Pourquoi garder les éléments de bases qui sont d&rsquo;autant plus des vecteurs d&rsquo;attaque et des points de vulnérabilité ?</p>



<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-6"><code><strong>$ sudo rm -Rf /opt/tomcat/webapps/*</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="693" height="299" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_108_webapps.jpg" alt="" class="wp-image-3781" style="aspect-ratio:2.31779257849667;width:535px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_108_webapps.jpg 693w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_108_webapps-300x129.jpg 300w" sizes="auto, (max-width: 693px) 100vw, 693px" /></figure>
</div>


<p class="wp-block-paragraph">Un truc que je ne connaissais pas et que j&rsquo;ai trouvé en étudiant Tomcat, c&rsquo;est le cas de « Protection du Shutdown ». Au premier abord, je me suis demandé qu&rsquo;est-ce que c&rsquo;est que ce truc. Le paramètre <strong>shutdown</strong> est explicite. Et bien voyez-vous c&rsquo;est marrant, c&rsquo;est une commande qui permet d&rsquo;éteindre le daemon. Alors certes, par défaut il est sur le port <strong>8005/tcp</strong> et normalement accessible qu&rsquo;en local. Mais tapons shutdown et pouf ! Notre daemon il va à la niche.</p>



<p class="wp-block-paragraph">Donc, on change le port et pour le mot de passe on utilise le bon vieux <strong>Soleil123!</strong> . Vous m&rsquo;avez compris non ? 🙂</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="448" height="24" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_109_shutdown.jpg" alt="" class="wp-image-3792" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_109_shutdown.jpg 448w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_109_shutdown-300x16.jpg 300w" sizes="auto, (max-width: 448px) 100vw, 448px" /></figure>
</div>


<pre class="wp-block-code"><code><strong>&lt;Server port="-1" shutdown="y2Fxg@kLx4:If2L0_MD1Ccz"&gt;</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="592" height="25" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_109_shutdown_1.jpg" alt="" class="wp-image-3791" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_109_shutdown_1.jpg 592w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_109_shutdown_1-300x13.jpg 300w" sizes="auto, (max-width: 592px) 100vw, 592px" /></figure>
</div>


<h4 class="wp-block-heading">Prévention des attaques</h4>



<p class="wp-block-paragraph">Ouvrons le fichier web.xml.</p>



<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-7"><code><strong>$ sudo vim /opt/tomcat/conf/web.xml</strong></code></pre>



<p class="wp-block-paragraph">A la fin de la section &lt;filter&gt;, ajoutons les lignes suivantes :</p>



<pre class="wp-block-code"><code>&lt;!-- Begin R-ONE Modification -->
        &lt;filter>
                &lt;filter-name>httpHeaderSecurity&lt;/filter-name>
                &lt;filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter&lt;/filter-class>
                &lt;async-supported>true&lt;/async-supported>

                &lt;init-param>
                        &lt;param-name>hstsMaxAgeSeconds&lt;/param-name>
                        &lt;param-value>31536000&lt;/param-value>
                &lt;/init-param>

                &lt;init-param>
                        &lt;param-name>antiClickJackingOption&lt;/param-name>
                        &lt;param-value>DENY&lt;/param-value>
                &lt;/init-param>

                &lt;init-param>
                        &lt;param-name>blockContentTypeSniffingEnabled&lt;/param-name>
                        &lt;param-value>true&lt;/param-value>
                &lt;/init-param>
        &lt;/filter>
&lt;!-- End Modification -->
</code></pre>



<p class="wp-block-paragraph">Parcourons en détails chaque ligne pour comprendre ce que nous sécurisons avec les filtres. (Normal c&rsquo;est du café de Java&#8230; Franchement, il ne mérite pas d&rsquo;aller jouer sur l&rsquo;autoroute à contre sens pour bien voir le danger ? L&rsquo;auteur de ce billet est bof, il fait triste à voir.)</p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>L&rsquo;usage du filtre de sécurité « <strong>HttpHeaderSecurityFilter</strong> » permet d&rsquo;ajouter des réponses dans le header des requetes HTTP pour protéger les utilisateurs et les applications des attaques mentionnées ci haut.<br><br>Ainsi pour une défense en profondeur l&rsquo;activation de ces options sont primordiales.<br><br><strong>hstsMaxAgeSeconds</strong> indique que le site ne peut être consulté uniquement via le protocole HTTPS et force ainsi le navigateur à chiffrer les requêtes. Cela permet donc de prévenir des attaques d&rsquo;interception SSL (SSL stripping).<br><br><strong>antiClickJackingOption</strong> aussi connu sous le nom de X-Frame-Options. Cela permet au site de ne pas intégrer l&rsquo;application dans une balise html iframe et donc de faire une superposition d&rsquo;interface invisible et valider une action non voulue.<br><br><strong>blockContentTypeSniffingEnabled</strong> ou X-Content-Type-Options: nosniff permet <s>de blague censurée</s> de forcer le navigateur à respecter le type MIME envoyé par le serveur. L&rsquo;objectif et de se prémunir des attaques XSS.</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="283" class="wp-image-3793" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_114_filter.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_114_filter.jpg 943w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_114_filter-300x154.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_114_filter-768x395.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="109" class="wp-image-3794" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_115_filter-mapping.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_115_filter-mapping.jpg 683w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_115_filter-mapping-300x59.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td><td>Il nous reste un dernier point, les cookies. Afin que ces derniers ne soient pas volés par Cookie Monster par exemple, il est primordial d&rsquo;interdire l&rsquo;accès au cookie via JavaScript (d&rsquo;où la présence du <strong>http-only</strong> à <strong>true</strong>. Nous bloquons ainsi le vol de session via XSS. L&rsquo;usage de <strong>secure</strong> va faire en sorte que le cookie n&rsquo;est envoyé si et seulement si la connexion est sécurisée.</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<pre class="wp-block-code"><code><strong>&lt;!-- Modification R-ONE -->
        &lt;filter-mapping>
                &lt;filter-name>httpHeaderSecurity&lt;/filter-name>
                &lt;url-pattern>/*&lt;/url-pattern>
        &lt;/filter-mapping>
&lt;!-- End Modification --></strong></code></pre>



<p class="wp-block-paragraph">Un truc c*n qui m&rsquo;a fait perdre une nuit de sommeil. J&rsquo;avais cette put**n d&rsquo;erreur&#8230; A devenir fou !</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="409" height="131" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_115_Error.jpg" alt="" class="wp-image-3822" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_115_Error.jpg 409w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_115_Error-300x96.jpg 300w" sizes="auto, (max-width: 409px) 100vw, 409px" /></figure>
</div>


<p class="wp-block-paragraph">Après pas mal de recherche, c&rsquo;est un truc simple. Franchement je suis vraiment un c*n&#8230; Mon nouveau fichier de conf, avait pour owner<strong> root:root</strong> et non <strong>tomcat:tomcat</strong>. La haine, vraiment. Pensez donc à bien set de nouveau les bons droits&#8230;</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="640" height="360" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_002_font.gif" alt="" class="wp-image-3834" style="width:505px;height:auto"/></figure>
</div>


<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-8"><code><strong>$ sudo chown tomcat:tomcat -R /opt/tomcat/conf/</strong></code></pre>



<p class="wp-block-paragraph">Un petit test avant, après ?</p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td class="has-text-align-center" data-align="center"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-13-color">Avant</mark></strong></td><td class="has-text-align-center" data-align="center"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-11-color">Après</mark></strong></td></tr><tr><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="161" class="wp-image-3823" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_118_0_securityOff.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_118_0_securityOff.jpg 654w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_118_0_securityOff-300x88.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="213" class="wp-image-3824" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_118_1_securityOn.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_118_1_securityOn.jpg 654w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_118_1_securityOn-300x116.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<h4 class="wp-block-heading">Daemon Firewall</h4>



<p class="wp-block-paragraph">Côté firewall il faut publier le port <strong>8080/tcp</strong></p>



<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-9"><code><strong>$ sudo firewall-cmd --permanent --add-port=8080/tcp
$ sudo firewall-cmd --reload</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="814" height="86" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_110_firewall.jpg" alt="" class="wp-image-3796" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_110_firewall.jpg 814w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_110_firewall-300x32.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_110_firewall-768x81.jpg 768w" sizes="auto, (max-width: 814px) 100vw, 814px" /></figure>
</div>


<p class="wp-block-paragraph">Toutefois ça ne fonctionnera pas NANANANERE ! Et pourquoi ? Hein, pourquoi ? A cause du SELinux ventrebleu !</p>



<p class="wp-block-paragraph">Par défaut le port 8080 n&rsquo;est pas autorisé dans le SELinux pour la communication HTTP. Il est donc nécessaire de lui dire qu&rsquo;il en fait partie.</p>



<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-10"><code><strong>$ sudo semanage port -a -t http_port_t -p tcp 8080</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="800" height="41" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_111_semanage.jpg" alt="" class="wp-image-3797" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_111_semanage.jpg 800w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_111_semanage-300x15.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_111_semanage-768x39.jpg 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>
</div>


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



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



<p class="wp-block-paragraph">Créons et éditons le fichier de rotation propre à <strong>tomcat </strong>sous <strong>/etc/logrotate.d</strong>.</p>



<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-11"><code><strong>$ sudo vim /etc/logrotate.d/tomcat</strong></code></pre>



<p class="wp-block-paragraph">Nous allons spécifier dans notre fichier que nous souhaitons effectuer la rotation du fichier <strong>catalina.out</strong>, les fichiers <strong>localhost_access_log*.txt</strong> ainsi que l&rsquo;ensemble des fichiers d&rsquo;extensions .log.</p>



<p class="wp-block-paragraph">C&rsquo;est dernier afin de ne pas impacter la production seront vidé à chaud (<strong>copytruncate</strong>) de manière journalière en gardant 30 jours de rétention (histoire de faciliter les investigations en cas de suspicion). Nous compresserons les points de rétentions si pas de fichier nous ne faisons rien ni si les fichiers sont vides. Nous recréerons les fichiers avec les droits <strong>0640</strong> avec en groupe et propriétaire le compte de service <strong>tomcat</strong>.</p>



<pre class="wp-block-code"><code>/opt/tomcat/logs/catalina.out
/opt/tomcat/logs/localhost_access_log*.txt
/opt/tomcat/logs/*.log {
    copytruncate
    daily
    rotate 30
    compress
    missingok
    notifempty
    create 0640 tomcat tomcat
}</code></pre>



<p class="wp-block-paragraph">Une commande que je ne connaissais pas. C&rsquo;est en me replongeant dans la documentation de logrotate que j&rsquo;ai découvert qu&rsquo;il existait un mode debug qui vient simuler notre fichier de rotation. C&rsquo;est vraiment cool.</p>



<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-12"><code><strong>$ sudo logrotate -d /etc/logrotate.d/tomcat</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="938" height="904" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_117_logrotate_0.jpg" alt="" class="wp-image-3778" style="aspect-ratio:1.037616803769667;width:557px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_117_logrotate_0.jpg 938w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_117_logrotate_0-300x289.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_117_logrotate_0-768x740.jpg 768w" sizes="auto, (max-width: 938px) 100vw, 938px" /></figure>
</div>


<p class="wp-block-paragraph">Bon ba fonctionne pas. Que pasa ? Ca ne serait pas encore un coup du SELinux ? Mais si, Mais si j&rsquo;ai cru voir un SELinux !</p>



<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-13"><code><strong>$ ls -Zd /opt/tomcat/logs</strong>
<strong>$ sudo semanage fcontext -a -t var_log_t "/opt/tomcat/logs(/.*)?"
$ sudo restorecon -Rv /opt/tomcat/logs</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="938" height="317" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_117_logrotate_1.jpg" alt="" class="wp-image-3779" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_117_logrotate_1.jpg 938w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_117_logrotate_1-300x101.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_117_logrotate_1-768x260.jpg 768w" sizes="auto, (max-width: 938px) 100vw, 938px" /></figure>
</div>


<p class="wp-block-paragraph">Après vérification du contexte de sécurité, il s&rsquo;avère que <strong>logrotate </strong>est bloqué par le SELinux lorsqu&rsquo;il essai d&rsquo;écrire dans le répertoire <strong>/opt/tomcat/logs</strong>. Il convient donc alors d&rsquo;ajouter le contexte et de restaurer le contexte de sécurité sur le répertoire <strong>/opt/tomcat/logs</strong>. 🙂</p>



<p class="has-text-align-center has-small-font-size wp-block-paragraph"><strong><em>Tu vois Monsieur CHAPPINION, je ne laisse pas la sécurité au hasard et des backdoors partout comme tu aimes le crier haut et fort en te pavanant. Continu de cracher ton VENIN avec ta clic&#8230; #bisous #gratuit #faitdubien 🙂</em></strong></p>



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



<p class="wp-block-paragraph">Comme j&rsquo;ai choisi l&rsquo;installation depuis le package et non depuis le repo, il faut se farcir à la main le fichier de service. Cela dit, c&rsquo;est plutôt intéressant de se pencher sur le cas. Encore une fois et c&rsquo;est mon point de vue, c&rsquo;est agréable de savoir cuisiner que d&rsquo;acheter des produits transformés tous les jours.</p>



<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-14"><code><strong>$ sudo vim /etc/systemd/system/tomcat.service</strong></code></pre>



<pre class="wp-block-code"><code><strong>&#91;Unit]
Description=Apache Tomcat Web Application Container
After=network.target

&#91;Service]
Type=forking

User=tomcat
Group=tomcat

Environment="JAVA_HOME=/usr/lib/jvm/jre"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_BASE=/opt/tomcat"

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

# Sécurité Systemd (Sandboxing)
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
NoNewPrivileges=true

&#91;Install]
WantedBy=multi-user.target</strong></code></pre>



<p class="wp-block-paragraph">Normalement maintenant c&rsquo;est le moment de vérité&#8230; Démarrons notre service. Si tout va bien, pas d&rsquo;erreur. Sinon c&rsquo;est parti pour du début et avec Java ça peut vite devenir pénible et encore le paroxysme est loin. Mais je ne veux pas vous décourager&#8230;</p>



<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-15"><code><strong>$ sudo systemctl start tomcat
$ sudo systemctl status tomcat</strong></code></pre>



<p class="wp-block-paragraph">Si c&rsquo;est ok, le service peut être actif au démarrage du système. Ce dernier se lancera après le service réseau (cf la conf du service).</p>



<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-16"><code><strong>$ systemctl enable tomcat</strong></code></pre>



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



<p class="wp-block-paragraph">Pour vérifier que tout est fonctionnel, il est nécessaire comme nous avons supprimé l&rsquo;intégralité du contenu de notre répertoire <strong>/webapps/</strong> de générer un fichier de test :</p>



<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-17"><code><strong>$ sudo mkdir /opt/tomcat/webapps/ROOT
$ sudo echo "OK FINAL ROOT" &gt; /opt/tomcat/webapps/ROOT/index.html
$ chown tomcat:tomcat -R /opt/tomcat/webapps/ROOT
$ sudo systemctl restart tomcat</strong></code></pre>



<p class="wp-block-paragraph">Maintenant depuis un navigateur web, sous réserve d&rsquo;avoir créé la règle sur votre UTM<sup data-fn="51bcd054-ce7e-4f90-9836-c2d17c3c8b5b" class="fn"><a href="#51bcd054-ce7e-4f90-9836-c2d17c3c8b5b" id="51bcd054-ce7e-4f90-9836-c2d17c3c8b5b-link">16</a></sup> si vous n&rsquo;êtes pas dans le même subnet rendez-vous sur l&rsquo;URL <strong>http://&lt;SERVER&gt;:8080</strong> ou depuis directement depuis votre server curl <strong>http://127.0.0.1:8080</strong> vous devriez avoir en retour :</p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>Remote</strong></td><td class="has-text-align-center" data-align="center"><strong>Local</strong></td></tr><tr><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="222" class="wp-image-3825" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_119_0_Remote.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_119_0_Remote.jpg 441w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_119_0_Remote-300x121.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="41" class="wp-image-3826" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_119_1_Remote.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_119_1_Remote.jpg 621w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_119_1_Remote-300x22.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Je pense que nous avons clôt ce billet. Nous voilà avec un server Tomcat sécurisé et fonctionnel&#8230; 🙂</p>



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



<p class="wp-block-paragraph">Je me suis arraché les cheveux sur ce billet.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Ecoute ma bonne Catalina, tu un engine modèle, mais si tu n&rsquo;as que des qualités et en termes de verbosité tu es resté comme je l&rsquo;espérai, c&rsquo;est le bonheur rangé dans une armoire. Tu vois si c&rsquo;était à refaire, je t&rsquo;installerai de nouveau mais tu m&#8217;emmerdes !</em></p>
<cite>Erwan Guillemard, revisite d&rsquo;<span style="text-decoration: underline;"><a href="https://www.youtube.com/watch?v=ZywHVw_WIaA">Un singe en hiver</a> d&rsquo;Henri VERNEUIL</span></cite></blockquote>



<p class="wp-block-paragraph">Mais alors pourquoi je tiens ces propos ? Je me suis une nouvelle fois aventuré dans la <strong>stacktrace </strong>et dans les logs à la suite d&rsquo;un <strong>404 Not Found</strong>. D&rsquo;erreur dans le fichier de configuration car sensible à la case sur UN caractère. L&rsquo;absence de log par moment&#8230; Tout ce que j&rsquo;aime avec JAVA, ou du moins j&rsquo;aimais&#8230; Imaginons maintenant une montée de version ? J&rsquo;espère que votre formulaire de CAB<sup data-fn="3aa5110f-a4b9-4a7d-afe0-234fc96d5687" class="fn"><a href="#3aa5110f-a4b9-4a7d-afe0-234fc96d5687" id="3aa5110f-a4b9-4a7d-afe0-234fc96d5687-link">17</a></sup> est à jour et que vous avez un environnement de production iso à votre production.</p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>JAVA et Tomcat c&rsquo;est un peu comme regardez notre bonne vieille boite de Schrödinger. Le service est démarré, mais cela ne fonctionne. Le chat, c&rsquo;est notre Tomcat numérique (C&rsquo;est surtout la faute du mec entre le clavier et la chaise qui est dans un état quantique oui !).</td><td><img loading="lazy" decoding="async" width="350" height="467" class="wp-image-3840" style="width: 350px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_003_font-scaled.jpeg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_003_font-scaled.jpeg 1920w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_003_font-225x300.jpeg 225w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_003_font-768x1024.jpeg 768w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_003_font-1152x1536.jpeg 1152w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_016_003_font-1536x2048.jpeg 1536w" sizes="auto, (max-width: 350px) 100vw, 350px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><a href="https://www.google.com/search?sca_esv=042d98b02a14ad67&amp;rlz=1C1VDKB_frFR1007FR1007&amp;sxsrf=ANbL-n5g0SGLR_FWDKmUlxRKrbUzg2m9Fw:1776192360032&amp;q=schrodinger&amp;si=AL3DRZHSpE0pse5fJpxwjTYaymAaGmMpRhbxpA7uMSemdL5dKZeVcKV4-oc58az3G7fIb7JrAUZtKhLoqaP4Xh3erRAOpS2vbpdBPWfMAVztgIr6WaS5Ss0%3D&amp;sa=X&amp;ved=2ahUKEwjDpLCVgO6TAxXPU6QEHTMgGXUQyNoBKAB6BAgeEAA&amp;ictx=1"></a>Enfin passons, si j&rsquo;ai fait un billet sur Tomcat, c&rsquo;est que je vais surtout en avoir besoin dans l&rsquo;article prochain et qu&rsquo;il était vraiment important d&rsquo;étudier en profondeur ce produit de la gamme Apache. Il faut reconnaitre tout de même qu&rsquo;en terme de serveur web il y a bien pire 🙂</p>



<p class="wp-block-paragraph">Rien que les notions de sécurité, nous revenons une nouvelle fois autour des mêmes notions conceptuelles, moindre privilège, réduction de la surface d&rsquo;attaque, audit, chiffrement et isolation. Ces points sont primordiaux pour Tomcat.</p>



<p class="wp-block-paragraph">Pourquoi me direz-vous ? Parce que nous publions un service Web qui exécute du code JAVA qui si mal isolé, croyez-moi peut faire énormément de dégât dans un système d&rsquo;information. Il serait bien de porter si vous utiliser ce dernier renforcer la vigilance sur ce dernier avec votre SIEM<sup data-fn="3d2466aa-4353-4408-a243-6def2b5bade4" class="fn"><a href="#3d2466aa-4353-4408-a243-6def2b5bade4" id="3d2466aa-4353-4408-a243-6def2b5bade4-link">18</a></sup> (c&rsquo;est marrant, je n&rsquo;en ai pas 🙂 )&#8230;</p>



<p class="wp-block-paragraph">Le mot de la fin :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Le chat botté chevauche Tomcat pendant que Charles Perrault configure du HSTS dans une cafetière. Arabica mon chers Watson, je danse la JAVA de Broadway. A non, il y a Catalina en travers sur une requête HTTP, le firewall vous fait chapeau bas !</em></p>
<cite>Erwan GUILLEMARD</cite></blockquote>



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



<ul class="wp-block-list">
<li><a href="https://messervices.cyber.gouv.fr/documents-guides/anssi-guide-recommandations_mise_en_oeuvre_site_web_maitriser_standards_securite_cote_navigateur-v2.0.pdf">ANSSI : Standards de sécurité côté navigateur</a></li>



<li><a href="https://linux.die.net/man/8/logrotate">Logrotate : Man</a></li>



<li><a href="https://linux.die.net/man/1/curl">Curl : Man</a></li>



<li><a href="https://fr.wikipedia.org/wiki/Apache_Tomcat">Wikipédia : Apache Tomcat</a></li>



<li><a href="https://ipweb.univ-evry.fr/docs/">Tomcat : Documentation</a></li>
</ul>


<ol class="wp-block-footnotes"><li id="16da1029-699d-4bca-a6e9-7768a7099ca3"><strong>POO :</strong> Programmation Orientée Objet <a href="#16da1029-699d-4bca-a6e9-7768a7099ca3-link" aria-label="Aller à la note de bas de page 1">↩︎</a></li><li id="8fe03776-25cc-4570-88c0-2c285e68ced0"><strong>BTS :</strong> Brevet de Technicien Supérieur <a href="#8fe03776-25cc-4570-88c0-2c285e68ced0-link" aria-label="Aller à la note de bas de page 2">↩︎</a></li><li id="6b0bb7de-b295-4951-b60c-c2f13e9cfca2"><strong>IDE :</strong> Integrated Environment Development <a href="#6b0bb7de-b295-4951-b60c-c2f13e9cfca2-link" aria-label="Aller à la note de bas de page 3">↩︎</a></li><li id="af7fd030-5eb8-459c-b326-4cfe6ebc218e"><strong>JDK :</strong> JAVA Development Tools <a href="#af7fd030-5eb8-459c-b326-4cfe6ebc218e-link" aria-label="Aller à la note de bas de page 4">↩︎</a></li><li id="2c0f76eb-2466-4e3d-a508-12ed484fb0c7"><strong>JVM :</strong> JAVA Virtual Machine <a href="#2c0f76eb-2466-4e3d-a508-12ed484fb0c7-link" aria-label="Aller à la note de bas de page 5">↩︎</a></li><li id="3767ce2d-4690-4d88-a81f-5a5abfb6e0ec"><strong>JRE :</strong> JAVA Runtime Environment <a href="#3767ce2d-4690-4d88-a81f-5a5abfb6e0ec-link" aria-label="Aller à la note de bas de page 6">↩︎</a></li><li id="5aa72831-364a-4813-a223-8651ecf90bfd"><strong>JSP :</strong> JAVA Server Pages <a href="#5aa72831-364a-4813-a223-8651ecf90bfd-link" aria-label="Aller à la note de bas de page 7">↩︎</a></li><li id="49aa99e2-1a30-4956-b8aa-08bef6ca1b65"><strong>HTTP :</strong> HyperText Transfert Protocol <a href="#49aa99e2-1a30-4956-b8aa-08bef6ca1b65-link" aria-label="Aller à la note de bas de page 8">↩︎</a></li><li id="7e0a7bd5-b44e-4bc9-acf0-b0b5d4e1385c"><strong>SE </strong>: Système d&rsquo;Exploitation <a href="#7e0a7bd5-b44e-4bc9-acf0-b0b5d4e1385c-link" aria-label="Aller à la note de bas de page 9">↩︎</a></li><li id="8d533817-d743-4f53-9f04-09b0d390cfa6"><strong>URL :</strong> Uniform Resource Locator <a href="#8d533817-d743-4f53-9f04-09b0d390cfa6-link" aria-label="Aller à la note de bas de page 10">↩︎</a></li><li id="d2695521-2349-42a7-b9d8-98daece4022d"><strong>ANSSI :</strong> Agence National de Sécurité des Systèmes d&rsquo;Information <a href="#d2695521-2349-42a7-b9d8-98daece4022d-link" aria-label="Aller à la note de bas de page 11">↩︎</a></li><li id="6ba62ef7-23e3-40d7-9103-43c42443f43d"><strong>MIM :</strong> Man In the Middle <a href="#6ba62ef7-23e3-40d7-9103-43c42443f43d-link" aria-label="Aller à la note de bas de page 12">↩︎</a></li><li id="c7fe5ad0-6ab5-4d69-ae4a-8da0bea8e4b6"><strong>XSS :</strong> Cross Site Scripting <a href="#c7fe5ad0-6ab5-4d69-ae4a-8da0bea8e4b6-link" aria-label="Aller à la note de bas de page 13">↩︎</a></li><li id="f00b61b2-171d-465a-96ff-80a705088787"><strong>HTTPS :</strong> Secure HyperText Transfert Protocol  <a href="#f00b61b2-171d-465a-96ff-80a705088787-link" aria-label="Aller à la note de bas de page 14">↩︎</a></li><li id="5523c1bf-ded6-4124-9e1d-b2fc579b24a2"><strong>CVE :</strong> Common Vulnerabilities and Exposures <a href="#5523c1bf-ded6-4124-9e1d-b2fc579b24a2-link" aria-label="Aller à la note de bas de page 15">↩︎</a></li><li id="51bcd054-ce7e-4f90-9836-c2d17c3c8b5b"><strong>UTM :</strong> Unified Threat Management  <a href="#51bcd054-ce7e-4f90-9836-c2d17c3c8b5b-link" aria-label="Aller à la note de bas de page 16">↩︎</a></li><li id="3aa5110f-a4b9-4a7d-afe0-234fc96d5687"><strong>CAB :</strong> Change Advisory Board  <a href="#3aa5110f-a4b9-4a7d-afe0-234fc96d5687-link" aria-label="Aller à la note de bas de page 17">↩︎</a></li><li id="3d2466aa-4353-4408-a243-6def2b5bade4"><strong>SIEM :</strong> Security Information and Event Management <a href="#3d2466aa-4353-4408-a243-6def2b5bade4-link" aria-label="Aller à la note de bas de page 18">↩︎</a></li></ol>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Apps &#8211; VEEAM Repo &#038; MinIO Object Storage</title>
		<link>https://erwanguillemard.com/apps-minio-object-storage/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Sun, 26 Jul 2026 14:39:05 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[MINIO]]></category>
		<category><![CDATA[S3]]></category>
		<category><![CDATA[VEEAM]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=2198</guid>

					<description><![CDATA[L’immuabilité prend bien des formes. Si j’ai abordé dans un billet précédent l’immuabilité au sens SE du terme intégré avec VEEAM, aujourd’hui je me suis tourné vers l’immuabilité au sens S3, toujours interfacée avec l’application tierce VEEAM. Difficile néanmoins de progresser vite sur cette technologie puisque je suis Candide. M&#8217;enfin comme l&#8217;écrivait Franquin, je vais...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">L’immuabilité prend bien des formes. Si j’ai abordé dans un billet précédent l’immuabilité au sens SE<sup data-fn="5daf5660-def4-42b2-81fc-7381fb71f8eb" class="fn"><a href="#5daf5660-def4-42b2-81fc-7381fb71f8eb" id="5daf5660-def4-42b2-81fc-7381fb71f8eb-link">1</a></sup> du terme intégré avec VEEAM, aujourd’hui je me suis tourné vers l’immuabilité au sens S3<sup data-fn="64126bc5-ea68-4702-914c-0c2efa484ca6" class="fn"><a href="#64126bc5-ea68-4702-914c-0c2efa484ca6" id="64126bc5-ea68-4702-914c-0c2efa484ca6-link">2</a></sup>, toujours interfacée avec l’application tierce VEEAM.</p>



<p class="wp-block-paragraph">Difficile néanmoins de progresser vite sur cette technologie puisque je suis Candide. M&rsquo;enfin comme l&rsquo;écrivait Franquin, je vais essayer de décortiquer la techno et son fonctionnement et de présenter ma compréhension de la chose. L&rsquo;objectif étant naturellement de prouver s&rsquo;il est possible d&rsquo;altérer l&rsquo;inaltérable du stockage objet.</p>





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



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



<li><strong>Apps : </strong>VEEAM B&amp;R 12.1</li>



<li><strong>Autres : </strong>
<ul class="wp-block-list">
<li><a href="https://erwanguillemard.com/linux/">Environnement GNU LINUX Durci</a></li>



<li><a href="https://erwanguillemard.com/windows-veeam-backup-replication/">VEEAM B&amp;R 12.1 et versions ultérieures</a></li>



<li>License VEEAM Entreprise</li>
</ul>
</li>
</ul>



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



<p class="wp-block-paragraph">Nous allons commencer par un petit brin d&rsquo;histoire sur l&rsquo;interface S3.</p>



<p class="wp-block-paragraph">Qu&rsquo;est ce que signifie l&rsquo;interface S3 ? Il signifie Amazon Simple Storage Service (et oui, Jeff BEZOS in da house !). Contrairement à ce que j&rsquo;ai pu penser, l&rsquo;interface n&rsquo;est pas toute jeune (quoi que vous me direz, le temps c&rsquo;est relatif, non ?). L&rsquo;API S3 a été officiellement mis sur le marché en 2006 par Amazon.</p>



<p class="wp-block-paragraph">L&rsquo;objectif initial était et reste de proposer à des entreprises un service de stockage de données dans le nuage et de s&rsquo;assurer de la disponibilité et de l&rsquo;intégrité de ces dernières. Ouai mais bon en 2006, le cloud c&rsquo;est pas trop d&rsquo;actualité, c&rsquo;est plus l&rsquo;ère du Personal Computer ? Pour la plèbe, oui, mais nous avons toujours un train de retard avec les grands GAFAM<sup data-fn="ebd22563-41db-4ad8-b047-7f3efb5205e5" class="fn"><a href="#ebd22563-41db-4ad8-b047-7f3efb5205e5" id="ebd22563-41db-4ad8-b047-7f3efb5205e5-link">3</a></sup> et autres sociétés de la tech 🙂</p>



<p class="wp-block-paragraph">Bref, certaines entreprises décident de stocker leurs données chez Amazon à travers ce nouveau service pour s&rsquo;affranchir des coûts et inconvénients d&rsquo;un SI local. En contrepartie, Amazon facture ces dites entreprises au stockage (Go) ainsi qu&rsquo;au trafic internet à destination de ces données. Depuis, l&rsquo;usage a littéralement explosé puisque nous ne parlons plus en Gigaoctet, mais de manière commune en Téraoctet voir Pétaoctet et certains plus consommateurs que d&rsquo;autres en Exaoctet (1 Eo = 1 000 000 000 Go) puisque l&rsquo;usage du cloud n&rsquo;est plus restreint à un besoin professionnel mais orienté comme un service à destination des usagers (coucou NETFLIX, SPOTIFY, FACEBOOK, X etc).</p>



<p class="wp-block-paragraph">La base de l&rsquo;API S3 est donc de fournir une disponibilité de la data la plus haute possible de manière sécurisé tout en restant le plus flexible possible. L&rsquo;objectif étant de stocker des quantités phénoménales de données. Dans certains cas, il n&rsquo;est pas rare de parler de DataLake (Lac de données).</p>



<p class="wp-block-paragraph">Oui mais alors qu&rsquo;est ce qu&rsquo;on stocke ? Principalement tout et rien, c&rsquo;est à dire des données de sauvegarde, d&rsquo;archive, des applications, sites webs, contenu multimédia, bases de données, etc. Cependant tous ces types de données pour la plupart répondent à un même usage, le WORM<sup data-fn="67827f4e-9213-452a-be37-7b3f023820e9" class="fn"><a href="#67827f4e-9213-452a-be37-7b3f023820e9" id="67827f4e-9213-452a-be37-7b3f023820e9-link">4</a></sup>. (C&rsquo;est un super jeu avec des vers qui se tirent dessus ? Non ça c&rsquo;est <a href="https://www.youtube.com/watch?v=WamGYvnAgxo&amp;ab_channel=Team17">WORMS</a> 🙂 )</p>



<p class="wp-block-paragraph">WORM signifie Write Once Read Many. Soit dans les faits j&rsquo;écris une fois les données et je les consulte énormément. Par exemple, je charge une photo sur un réseau social. Je vais l&rsquo;écrire une fois sur le système puis cette dernière sera visible et accessible de tous. La donnée ne va pas vivre. Sur ce principe, il va alors être possible de définir des algorithmes de segmentation de cette donnée pour garantir un gain d&rsquo;espace, d&rsquo;évolutivité, la sécurité de la donnée ainsi que sa disponibilité.</p>



<p class="wp-block-paragraph">Si nous regardons à la loupe les 4 critères ces derniers permettent :</p>



<ul class="wp-block-list">
<li><strong>Gain d&rsquo;espace :</strong> Compression de la données avec déduplication et dans certains cas de l&rsquo;eraser coding</li>



<li><strong>Evolutivité :</strong> Possibilité de définir un nouveau stockage et de joindre celui ci au système existant à travers internet. </li>



<li><strong>Sécurité :</strong> Les données sont traduites en objets et stockées à plusieurs emplacements de stockage permettant de reconstruire la donnée en cas de corruption d&rsquo;un ou plusieurs stockages (sur la base de la reconstruction par parité). Il sera également possible de définir une durée de vie à cette donnée (coucou immutability). J&rsquo;ai vulgarisé. En réalité, l&rsquo;objet étant une entité logique, ce dernier est stocké sous forme de fragment&#8230; Complexe d&rsquo;un coup non ? 🙂</li>



<li><strong>Disponibilité</strong> : A partir du critère précédent, si un des serveurs où se trouve ma donnée est HS ou momentanément inaccessible, ma donnée continue d&rsquo;être disponible car ces données en tant qu&rsquo;objet sont fragmentées sur d&rsquo;autres serveurs.</li>
</ul>



<p class="wp-block-paragraph">Avant d&rsquo;aller plus loin, il est important de comprendre que l&rsquo;interface S3 a tout son sens en tant que SaaS<sup data-fn="6e7f7b72-5d59-45a2-9059-bf1e1e4b7b6e" class="fn"><a href="#6e7f7b72-5d59-45a2-9059-bf1e1e4b7b6e" id="6e7f7b72-5d59-45a2-9059-bf1e1e4b7b6e-link">5</a></sup>. Néanmoins, cela implique de souscrire à ce service chez Amazon par exemple. Ce n&rsquo;est pas objectif car je recherche une solution OnPremise pour construire et éventuellement proposer ce service dans mon catalogue de service. C&rsquo;est pourquoi il a été compliqué de trouver une solution S3 OnPremise totalement « open ». L’une des forces du stockage objet (S3) est sa flexibilité. L’un des inconvénients (selon moi) est comment s&rsquo;assurer que les données (mes datas à moi) ne sont pas utilisées par autrui, sont bien supprimées etc ? Il faut faire confiance mais aujourd&rsquo;hui cela ne suffit pas&#8230;</p>



<p class="wp-block-paragraph">Bref, en cherchant un petit peu mais pas trop, j&rsquo;ai identifié une solution opensource MinIO. C&rsquo;est avec cette dernière que je vais m&rsquo;amuser avec le stockage objet.</p>



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



<p class="wp-block-paragraph">L&rsquo;une des premières questions que nous pouvons nous poser, Linux Hardened VS S3 ?</p>



<p class="wp-block-paragraph">Comme j&rsquo;ai pu le présenter dans un <a href="https://erwanguillemard.com/apps-veeam-repo-backup-hardened/">article précédent</a>, l&rsquo;immuabilité au sens hardened du terme est portée par l&rsquo;OS<sup data-fn="3af07056-54d6-45db-ad01-36f5f0a26035" class="fn"><a href="#3af07056-54d6-45db-ad01-36f5f0a26035" id="3af07056-54d6-45db-ad01-36f5f0a26035-link">6</a></sup> nativement. Toutefois, ce dernier est plus adapté pour la protection des fichiers que des données et le risque se trouve au niveau du compte système (Root). S&rsquo;il y a escalade des droits et donc contournement des mécanismes de sécurité, il est possible de supprimer les données en retirant l&rsquo;attribut « <strong>i</strong>« .</p>



<p class="wp-block-paragraph">Dans le cas de S3, l&rsquo;approche est différente car c&rsquo;est le moteur S3 qui gère l&rsquo;immuabilité et les données ne sont pas stockées sous forme de fichier mais d&rsquo;objet. Ainsi, pas possible de supprimer la donnée peu importe que nous soyons administrateur, Trump, Gourou d&rsquo;une secte ou même une divinité. Toutefois, un acte physique devrait faire y arriver&#8230;</p>



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



<p class="wp-block-paragraph">Comme toujours, mon côté père castor il est important de s&rsquo;intéresser à l&rsquo;histoire de MinIO.</p>



<p class="wp-block-paragraph">MionIO a été fondé en 2014 par Arnand Badu Periasamy, Garima Kapoor et Harshavardhana. L&rsquo;objectif du projet est de démocratiser le stockage cloud autour de la technologie de stockage objet dans le vaste univers de la communauté OpenSource. C&rsquo;est ainsi que naît Minimal Object Storage » ou MinIO :).</p>



<p class="wp-block-paragraph">Une première release ou version voit le jour courant 2017. Durant cette période un changement de licence va être réalisé suite à son essor auprès de la communauté. L&rsquo;ensemble des technologies est alors protégé par la licence GNU-AGPLv3. L&rsquo;objectif étant de se prémunir des géants de la tech.</p>



<p class="wp-block-paragraph">Par la suite, le bras de fer et les contentieux vont commencer. MinIO avec la montée en puissance de KUBERNETES est perçu comme une licorne. MinIO ira jusqu&rsquo;à révoquer les droits d&rsquo;usage de NUTANIX sur son service NUTANIX Objects pour violation de licence&#8230; Quand il y a du pognon en jeu, cela devient vite le bordel, je l&rsquo;ai toujours dit&#8230; M&rsquo;enfin. Le pourquoi ? L&rsquo;usage commercial sans paiement, ça ne passe pas&#8230;</p>



<p class="wp-block-paragraph">2025, MinIO cesse la publication d&rsquo;images Docker et des binaires précompilés pour les versions communautaires. MinIO devient MinIO AIStor.</p>



<p class="wp-block-paragraph">Malheureusement, c&rsquo;est le cas classique d&rsquo;un projet formidable ouvert à tous qui avec le temps s&rsquo;enferme dans la génération de profit, de protection intellectuelle. MinIO souhaite avoir comme tous les acteurs de ce monde une part du gateau CLOUD+IA.</p>



<h3 class="wp-block-heading">S3 versus Linux Hardening</h3>



<p class="wp-block-paragraph">Dans un billet précédent, je ventais par Mont et par Vaux les mérites et robustesses du hardening linux, mais qu&rsquo;en est il du hardening S3 ?</p>



<p class="wp-block-paragraph">Je pense que pour répondre à cette magnifique question, il est nécessaire de passer par un tableau (oui j&rsquo;aime rédiger sous la forme de tableau).</p>


<div class="kb-table-container kb-table-container2198_7a89b4-99 wp-block-kadence-table"><table class="kb-table kb-table2198_7a89b4-99">
<tr class="kb-table-row kb-table-row2198_51501e-33">
<th  scope="col" class="kb-table-data kb-table-data2198_1a17ae-53">

<p class="has-text-align-center has-theme-palette-2-background-color has-background wp-block-paragraph">Critères</p>

</th>

<th  scope="col" class="kb-table-data kb-table-data2198_fcfba2-6e">

<p class="has-text-align-center has-theme-palette-2-background-color has-background wp-block-paragraph">S3</p>

</th>

<th  scope="col" class="kb-table-data kb-table-data2198_4f9074-1c">

<p class="has-text-align-center has-theme-palette-2-background-color has-background wp-block-paragraph">Hardening</p>

</th>
</tr>

<tr class="kb-table-row kb-table-row2198_617253-d2">
<td  class="kb-table-data kb-table-data2198_9b3fc2-41">

<p class="has-text-align-center wp-block-paragraph"><strong>Technologies</strong></p>

</td>

<td  class="kb-table-data kb-table-data2198_ac18e8-ef">

<p class="wp-block-paragraph">S3 se place comme une solution applicative qui empêche la suppression de données.<br>Deux modes :</p>



<ul class="wp-block-list">
<li><strong>Compliance :</strong> Personne ne peut supprimer les datas, il faut attendre la fin de la période de rétention</li>



<li><strong>Governance :</strong> Seuls les utilisateurs avec des droits spéciaux peuvent supprimer les données</li>
</ul>

</td>

<td  class="kb-table-data kb-table-data2198_57c614-a0">

<p class="wp-block-paragraph">Le hardening Linux se place comme une solution OS, système de fichiers qui empêche la suppression des données au niveau du noyau.<br>Généralement, l&rsquo;usage de l&rsquo;immuabilité est utilisé pour protéger les éléments sensibles de la suppression ou modification accidentelle ou malveillante.</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_700d94-d5">
<td  class="kb-table-data kb-table-data2198_8e0ae8-a8">

<p class="has-text-align-center wp-block-paragraph"><strong>Niveau</strong></p>

</td>

<td  class="kb-table-data kb-table-data2198_d753ff-cc">

<p class="wp-block-paragraph">Applicatif (MinIO)</p>

</td>

<td  class="kb-table-data kb-table-data2198_85add3-25">

<p class="wp-block-paragraph">Système de Fichiers Linux</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_6256f9-14">
<td  class="kb-table-data kb-table-data2198_243d9a-f5">

<p class="has-text-align-center wp-block-paragraph"><strong>Portée</strong></p>

</td>

<td  class="kb-table-data kb-table-data2198_493236-e5">

<p class="wp-block-paragraph">Les objets (data)</p>

</td>

<td  class="kb-table-data kb-table-data2198_7ff0fc-87">

<p class="wp-block-paragraph">Les fichiers (data, configuration, binaire)</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_7baa03-5f">
<td  class="kb-table-data kb-table-data2198_dc2b63-72">

<p class="has-text-align-center wp-block-paragraph"><strong>Gestion</strong></p>

</td>

<td  class="kb-table-data kb-table-data2198_6d213f-9e">

<p class="wp-block-paragraph">Applicatif (MinIO)</p>

</td>

<td  class="kb-table-data kb-table-data2198_f6ca88-b0">

<p class="wp-block-paragraph">Root Linux (<strong>chattr</strong>)</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_a3d6ae-c8">
<td  class="kb-table-data kb-table-data2198_80ca32-4f">

<p class="has-text-align-center wp-block-paragraph"><strong>Durée</strong></p>

</td>

<td  class="kb-table-data kb-table-data2198_f426a5-8e">

<p class="wp-block-paragraph">Temporaire (rétention définie)</p>

</td>

<td  class="kb-table-data kb-table-data2198_a80eb8-6a">

<p class="wp-block-paragraph">Permanente jusqu&rsquo;au retrait de l&rsquo;immuabilité (<strong>chattr -i</strong>)</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_d3ed8c-98">
<td  class="kb-table-data kb-table-data2198_c326ed-fc">

<p class="has-text-align-center wp-block-paragraph"><strong>Contournable</strong></p>

</td>

<td  class="kb-table-data kb-table-data2198_ba6007-87">

<p class="wp-block-paragraph">Non si en mode Compliance</p>

</td>

<td  class="kb-table-data kb-table-data2198_dbe490-fc">

<p class="wp-block-paragraph">Non (nécessite de retirer l&rsquo;attribut <strong>i</strong>)</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_f5420f-4a">
<td  class="kb-table-data kb-table-data2198_45ff81-cc">

<p class="has-text-align-center wp-block-paragraph"><strong>Usage</strong></p>

</td>

<td  class="kb-table-data kb-table-data2198_dae217-ee">

<p class="wp-block-paragraph">WORM, conformité légale</p>

</td>

<td  class="kb-table-data kb-table-data2198_4b0860-27">

<p class="wp-block-paragraph">Hardening Server</p>

</td>
</tr>
</table></div>


<p class="wp-block-paragraph">Ce que nous pouvons conclure de cette analyse, S3 est plus à même de protéger les données que le hardening LINUX. S3 permettant une meilleure immuabilité dans le temps et ce dernier est prévu pour cet usage précis. Même si cela fonctionne avec la gestion de l&rsquo;immuabilité LINUX. </p>



<p class="wp-block-paragraph">Vous lecteurs, ne pouvez pas savoir la souffrance que cela m&rsquo;apporte d&rsquo;écrire de tels mots. J&rsquo;ai toujours défendu bec et ongles le hardening linux et voyez vous, force est de constater que je suis dans le déni. Tel Pierre CAMBRONNE à la bataille de WATERLOO :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>La garde meurt mais ne se rend pas.</em></p>
<cite>Pierre CAMBRONNE</cite></blockquote>



<p class="wp-block-paragraph">  Même si dans mon cas c&rsquo;est un peu exagéré (mais juste un iota hein 🙂 )</p>



<h3 class="wp-block-heading">Mécanisme S3</h3>



<p class="wp-block-paragraph">Maintenant que nous savons faire la différence entre le hardening et l&rsquo;API S3, intéressons nous à comment l&rsquo;objet est rendu immuable 🙂 Chose que j&rsquo;ai mise un certain temps à assimiler personnellement et qui je le pense ne doit pas forcément être très claire pour bon nombre d&rsquo;entre nous.</p>



<h4 class="wp-block-heading">S3 Comment ça marche ?</h4>



<p class="wp-block-paragraph">Pour faire simple car je rentre dans le détail dans la sous partie suivante, lorsque nous envoyons un fichier vers un média S3, le service S3 va générer un fichier de metadata qui va contenir toutes les informations de la donnée. Puis le fichier va être découpé suivant l&rsquo;algorithme d&rsquo;Erasure coding paramétré afin de définir notre donnée avec des blocs de données puis de parité.</p>



<p class="wp-block-paragraph">Le moteur va alors stocker les donnée en respectant les contraintes de restauration et de disponibilité de la données sur chaque disque puis retournera à l&rsquo;utilisateur le succès ou non de l&rsquo;opération. Le stockage des données va se faire dans des Buckets.</p>



<p class="wp-block-paragraph">La durée de vie de la donnée sera stockée dans le fichier de métadonnées. Ainsi, si je souhaite supprimer une donnée pour laquelle la durée de rétention n&rsquo;est pas atteinte, lors de l&rsquo;appel de l&rsquo;opération de suppression, le moteur va lire le fichier de donnée puis me retourner une erreur 403 Forbidden car je ne réponds pas à la condition d&rsquo;altération de la donnée.</p>



<p class="wp-block-paragraph">Plutôt simple non ?</p>



<h4 class="wp-block-heading">Déroulé d&rsquo;un appel S3</h4>


<div class="kb-table-container kb-table-container2198_c56ad5-a8 wp-block-kadence-table"><table class="kb-table kb-table2198_c56ad5-a8">
<tr class="kb-table-row kb-table-row2198_c21824-a0">
<td  class="kb-table-data kb-table-data2198_9f2f64-f3">

<p class="wp-block-paragraph">Dans un premier temps, nous l&rsquo;application (interne ou externe) va émettre une requête HTTP standard conforme à l&rsquo;API S3. Un PUT pour écrire, un GET pour lire, un DELETE ou LIST pour gérer les objets. Dans les headers, nous devons retrouver les valeurs suivantes (x-amz-*).</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">L&rsquo;authentification est réalisée pour chaque requête côté client à travers une clé. MinIO vérifie la signature et va consulter les politiques IAM afin de définir si oui ou non l&rsquo;opération est autorisée. Dans le cas contraire, nous aurons un joli 403 Forbidden.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">MinIO va parser l&rsquo;URL afin de router la requête vers la bonne donnée objet dans le bon bucket ainsi que le header pour identifier l&rsquo;opération à réaliser :</p>



<p class="wp-block-paragraph"></p>



<ul class="wp-block-list">
<li>Ecriture simple ?</li>



<li>Multipart upload ?</li>



<li>Téléchargement ?</li>



<li>Suppression avec versionning ?</li>



<li>Liste des objets ?</li>
</ul>



<p class="wp-block-paragraph">C&rsquo;est au niveau du moteur objet, coeur de l&rsquo;application que tout va se jouer. Pour chaque Objet, MinIO va générer un fichier de métadonnée (x.meta) qui va contenir :</p>



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



<li>Le Etag</li>



<li>La version</li>



<li>La carte de blocks</li>
</ul>



<p class="wp-block-paragraph">C&rsquo;est alors l&rsquo;Erasor Coding qui va découper la donnée en blocs de données et de parité.</p>



<p class="wp-block-paragraph">Les blocs sont distribués sur les disques selon la politique d&rsquo;EC défini.</p>



<p class="wp-block-paragraph">Si c&rsquo;est un succès, MinIO retournera le code HTTP 200/204 avec l&rsquo;Etag de l&rsquo;objet ainsi qu&rsquo;un identifiant de requête. </p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Dans le cas contraire (une surcharge par exemple ou un bucket qui n&rsquo;existe pas) nous aurons un code HTTP 4XX ou 5XX avec un message compatible S3.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Le chiffrement (SSE-S3 ou TLS), le versionning, les lifecycle rules et la réplication asynchrone fonctionnent de manière transparente sur toutes les opérations.</p>

</td>

<td  class="kb-table-data kb-table-data2198_e98ea3-d0">

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="669" height="824" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_102_Schema.jpg" alt="" class="wp-image-4248" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_102_Schema.jpg 669w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_102_Schema-244x300.jpg 244w" sizes="auto, (max-width: 669px) 100vw, 669px" /></figure>

</td>
</tr>
</table></div>


<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">Architecture S3</h3>



<p class="wp-block-paragraph">Dans la logique, l&rsquo;architecture que nous devrions mettre en place est la suivante :</p>



<ul class="wp-block-list">
<li>Infrastructure Clustérisé pour MinIO (ring)</li>



<li>Protection par un certificat si publication du service</li>



<li>Mise en place de NAT <sup data-fn="b243a23f-4d53-4e0b-a631-32d9433a3b01" class="fn"><a href="#b243a23f-4d53-4e0b-a631-32d9433a3b01" id="b243a23f-4d53-4e0b-a631-32d9433a3b01-link">7</a></sup>+ PAT<sup data-fn="bd5e85eb-9910-4b06-a8c6-3c0ecd0abd88" class="fn"><a href="#bd5e85eb-9910-4b06-a8c6-3c0ecd0abd88" id="bd5e85eb-9910-4b06-a8c6-3c0ecd0abd88-link">8</a></sup></li>



<li>Configuration de l&rsquo;Eraser Coding</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="903" height="401" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_100_Schema.jpg" alt="" class="wp-image-4240" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_100_Schema.jpg 903w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_100_Schema-300x133.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_100_Schema-768x341.jpg 768w" sizes="auto, (max-width: 903px) 100vw, 903px" /></figure>
</div>


<p class="wp-block-paragraph">Vous comprendrez qu&rsquo;il n&rsquo;est pas possible chez moi d&rsquo;établir un ring.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Un seul argument s&rsquo;y oppose, un seul ! C&rsquo;est dangereux. Bah ceux qui n&rsquo;aiment pas le danger, faut qu&rsquo;ils choisissent une autre activité.</em></p>
<cite>Nicolas SARKOZY</cite></blockquote>



<p class="wp-block-paragraph">En l&rsquo;occurrence, le danger étant ma formidable épouse, je vais choisir une autre solution. Je lui ai déjà pris une partie de son dressing, de la buanderie, je ne suis pas venu ici pour souffrir okay ? 🙂 (Je t&rsquo;aime chérie, promis je vais faire le ménage).</p>



<p class="wp-block-paragraph">Donc, pas de VM que du physique. Toutefois, je vous parle d&rsquo;Eraser Coding. Qu&rsquo;est que cela vient faire la dedans ? Je pense qu&rsquo;une sous partie va être nécessaire.</p>



<h4 class="wp-block-heading">Eraser Coding</h4>



<p class="wp-block-paragraph">L&rsquo;Eraser Coding est un moyen de protection des données par calcul mathématique plutôt que la copie des données. Cette technologie est bien plus efficace en terme de stockage que le RAID ou la réplication.</p>



<p class="wp-block-paragraph">Voyons plutôt.</p>



<p class="wp-block-paragraph">Une donnée est découpée par N blocs de données et M blocs de parité. La configuration EC:M définit alors le nombre de blocs de parité. Exemple : EC:2, 2 blocs de parité.</p>



<p class="wp-block-paragraph">Chaque bloc de parité est une combinaison linéaire des blocs de données calculée. Ainsi, n&rsquo;importe quels N blocs parmi les N+M suffisent à reconstruire l&rsquo;objet entier, que ce soit des blocs de parité ou de données. Si nous avons 4 blocs de données et 2 de parité, 4 blocs sur 6 permettent de reconstruire la donnée.</p>



<p class="wp-block-paragraph">Les systèmes vont alors distribuer la donnée aléatoirement sur les disques de l&rsquo;erasure définit. Soit un seul bloc par disque par objet. Aucun disque ne doit contenir deux blocs du même objet, puisque en cas de panne d&rsquo;un disque, les blocs restants sur les autres disques doivent permettre de recalculer le bloc manquant.</p>



<p class="wp-block-paragraph">Faisons une petite comparaison avec un RAID5 et RAID6.</p>


<div class="kb-table-container kb-table-container2198_3d6060-86 wp-block-kadence-table"><table class="kb-table kb-table2198_3d6060-86">
<tr class="kb-table-row kb-table-row2198_1213b4-86">
<th  scope="col" class="kb-table-data kb-table-data2198_29d1a1-04">

<p class="wp-block-paragraph"></p>

</th>

<th  scope="col" class="kb-table-data kb-table-data2198_f81253-77">

<p class="has-text-align-center wp-block-paragraph">RAID5</p>

</th>

<th  scope="col" class="kb-table-data kb-table-data2198_2b8fba-85">

<p class="has-text-align-center wp-block-paragraph">RAID6</p>

</th>

<th  scope="col" class="kb-table-data kb-table-data2198_9e17c0-c4">

<p class="has-text-align-center wp-block-paragraph">EC:2<br>(8 disques)</p>

</th>
</tr>

<tr class="kb-table-row kb-table-row2198_5eeaea-07">
<th  scope="row" class="kb-table-data kb-table-data2198_012438-d9">

<p class="has-text-align-center wp-block-paragraph">Tolérance de pannes</p>

</th>

<td  class="kb-table-data kb-table-data2198_68eaca-25">

<p class="has-text-align-center wp-block-paragraph">1 Disque</p>

</td>

<td  class="kb-table-data kb-table-data2198_e61bed-3f">

<p class="has-text-align-center wp-block-paragraph">2 Disques</p>

</td>

<td  class="kb-table-data kb-table-data2198_6f9c20-70">

<p class="has-text-align-center wp-block-paragraph">2 Disques</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_7863ae-a4">
<th  scope="row" class="kb-table-data kb-table-data2198_e4b0f1-9b">

<p class="has-text-align-center wp-block-paragraph">Granularité</p>

</th>

<td  class="kb-table-data kb-table-data2198_aa6218-c7">

<p class="has-text-align-center wp-block-paragraph">Volume entier</p>

</td>

<td  class="kb-table-data kb-table-data2198_c0fb03-fa">

<p class="wp-block-paragraph">Volume entier</p>

</td>

<td  class="kb-table-data kb-table-data2198_a3a029-3c">

<p class="has-text-align-center wp-block-paragraph">Par objet</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_24394c-22">
<th  scope="row" class="kb-table-data kb-table-data2198_0358a8-60">

<p class="has-text-align-center wp-block-paragraph">Overhead</p>

</th>

<td  class="kb-table-data kb-table-data2198_e85433-bc">

<p class="has-text-align-center wp-block-paragraph">1 Disque</p>

</td>

<td  class="kb-table-data kb-table-data2198_aa1e9e-c2">

<p class="has-text-align-center wp-block-paragraph">2 Disques</p>

</td>

<td  class="kb-table-data kb-table-data2198_eac735-31">

<p class="has-text-align-center wp-block-paragraph">2 sur 8 Disques (25%)</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_fb8a87-0c">
<th  scope="row" class="kb-table-data kb-table-data2198_6ad695-23">

<p class="has-text-align-center wp-block-paragraph">Rebuild</p>

</th>

<td  class="kb-table-data kb-table-data2198_246639-50">

<p class="has-text-align-center wp-block-paragraph">Lent</p>

</td>

<td  class="kb-table-data kb-table-data2198_e7ee56-9a">

<p class="has-text-align-center wp-block-paragraph">Très lent</p>

</td>

<td  class="kb-table-data kb-table-data2198_c8b229-cb">

<p class="has-text-align-center wp-block-paragraph">Rapide</p>



<p class="has-text-align-center wp-block-paragraph">(objet par objet)</p>

</td>
</tr>
</table></div>


<p class="wp-block-paragraph">Là on n&rsquo;y voit plus clair, pourtant, il existe une relation à bien assimiler entre le nombre de parités possibles par rapport au nombre de disques. Cette règle est fondamentale et doit être acquise.</p>



<p class="has-text-align-center wp-block-paragraph"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-10-color">Disques Utilisables</mark> = <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">Disques Totaux</mark> &#8211; <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-13-color">Blocs de Parité</mark></strong></p>



<p class="has-text-align-center wp-block-paragraph"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-10-color">Espace Utilisables</mark> = (<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">Disques Totaux</mark> &#8211; EC:N) / <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color">Disques Totaux</mark></strong></p>


<div class="kb-table-container kb-table-container2198_aa84f3-26 wp-block-kadence-table"><table class="kb-table kb-table2198_aa84f3-26">
<tr class="kb-table-row kb-table-row2198_e901f0-eb">
<th  scope="col" class="kb-table-data kb-table-data2198_b873e7-c1">

<p class="wp-block-paragraph">Disques</p>

</th>

<th  scope="col" class="kb-table-data kb-table-data2198_e43d51-4d">

<p class="wp-block-paragraph">EC</p>

</th>

<th  scope="col" class="kb-table-data kb-table-data2198_6e0a9e-8d">

<p class="wp-block-paragraph">Disques Data</p>

</th>

<th  scope="col" class="kb-table-data kb-table-data2198_bdb8be-34">

<p class="wp-block-paragraph">Tolérances Pannes</p>

</th>

<th  scope="col" class="kb-table-data kb-table-data2198_83ff11-24">

<p class="wp-block-paragraph">Espace Utilisable</p>

</th>
</tr>

<tr class="kb-table-row kb-table-row2198_ef9a8a-e6">
<td  class="kb-table-data kb-table-data2198_8f10e5-4b">

<p class="has-text-align-center wp-block-paragraph">4</p>

</td>

<td  class="kb-table-data kb-table-data2198_448acc-bb">

<p class="has-text-align-center wp-block-paragraph">EC:1</p>

</td>

<td  class="kb-table-data kb-table-data2198_d7d712-76">

<p class="has-text-align-center wp-block-paragraph">3</p>

</td>

<td  class="kb-table-data kb-table-data2198_a560af-30">

<p class="has-text-align-center wp-block-paragraph">1</p>

</td>

<td  class="kb-table-data kb-table-data2198_67fefc-07">

<p class="has-text-align-center wp-block-paragraph">75%</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_b92adf-04">
<td  class="kb-table-data kb-table-data2198_8f8478-3b">

<p class="has-text-align-center wp-block-paragraph">4</p>

</td>

<td  class="kb-table-data kb-table-data2198_da63af-cc">

<p class="has-text-align-center wp-block-paragraph">EC:2</p>

</td>

<td  class="kb-table-data kb-table-data2198_4aa570-bb">

<p class="has-text-align-center wp-block-paragraph">2</p>

</td>

<td  class="kb-table-data kb-table-data2198_e1643c-60">

<p class="has-text-align-center wp-block-paragraph">2</p>

</td>

<td  class="kb-table-data kb-table-data2198_3691cf-33">

<p class="has-text-align-center wp-block-paragraph">50%</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_22da70-59">
<td  class="kb-table-data kb-table-data2198_24314f-2a">

<p class="has-text-align-center wp-block-paragraph">6</p>

</td>

<td  class="kb-table-data kb-table-data2198_9328e3-da">

<p class="has-text-align-center wp-block-paragraph">EC:2</p>

</td>

<td  class="kb-table-data kb-table-data2198_199a91-12">

<p class="has-text-align-center wp-block-paragraph">4</p>

</td>

<td  class="kb-table-data kb-table-data2198_980fcb-69">

<p class="has-text-align-center wp-block-paragraph">2</p>

</td>

<td  class="kb-table-data kb-table-data2198_ea59a0-72">

<p class="has-text-align-center wp-block-paragraph">67%</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_3ae00a-12">
<td  class="kb-table-data kb-table-data2198_e41800-13">

<p class="has-text-align-center wp-block-paragraph">8</p>

</td>

<td  class="kb-table-data kb-table-data2198_63c866-ba">

<p class="has-text-align-center wp-block-paragraph">EC:2</p>

</td>

<td  class="kb-table-data kb-table-data2198_e98c67-fc">

<p class="has-text-align-center wp-block-paragraph">6</p>

</td>

<td  class="kb-table-data kb-table-data2198_7e3217-de">

<p class="has-text-align-center wp-block-paragraph">2</p>

</td>

<td  class="kb-table-data kb-table-data2198_6e4ceb-dc">

<p class="has-text-align-center wp-block-paragraph">75%</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_735c15-0b">
<td  class="kb-table-data kb-table-data2198_69dc91-09">

<p class="has-text-align-center wp-block-paragraph">8</p>

</td>

<td  class="kb-table-data kb-table-data2198_0d3eec-18">

<p class="has-text-align-center wp-block-paragraph">EC:4</p>

</td>

<td  class="kb-table-data kb-table-data2198_2e33b7-1b">

<p class="has-text-align-center wp-block-paragraph">4</p>

</td>

<td  class="kb-table-data kb-table-data2198_c5409f-99">

<p class="has-text-align-center wp-block-paragraph">4</p>

</td>

<td  class="kb-table-data kb-table-data2198_71d2b0-0a">

<p class="has-text-align-center wp-block-paragraph">50%</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_6398f6-ba">
<td  class="kb-table-data kb-table-data2198_b2998a-47">

<p class="has-text-align-center wp-block-paragraph">16</p>

</td>

<td  class="kb-table-data kb-table-data2198_0f7ffe-1d">

<p class="has-text-align-center wp-block-paragraph">EC:4</p>

</td>

<td  class="kb-table-data kb-table-data2198_2206ae-4b">

<p class="has-text-align-center wp-block-paragraph">12</p>

</td>

<td  class="kb-table-data kb-table-data2198_3fdc99-7b">

<p class="has-text-align-center wp-block-paragraph">4</p>

</td>

<td  class="kb-table-data kb-table-data2198_d196c2-aa">

<p class="has-text-align-center wp-block-paragraph">75%</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_173338-69">
<td  class="kb-table-data kb-table-data2198_862d9c-b2">

<p class="has-text-align-center wp-block-paragraph">16</p>

</td>

<td  class="kb-table-data kb-table-data2198_67ec7d-fb">

<p class="has-text-align-center wp-block-paragraph">EC:8</p>

</td>

<td  class="kb-table-data kb-table-data2198_4438e3-09">

<p class="has-text-align-center wp-block-paragraph">8</p>

</td>

<td  class="kb-table-data kb-table-data2198_4124f6-60">

<p class="has-text-align-center wp-block-paragraph">8</p>

</td>

<td  class="kb-table-data kb-table-data2198_3d7bff-96">

<p class="has-text-align-center wp-block-paragraph">50%</p>

</td>
</tr>
</table></div>


<p class="wp-block-paragraph">Donc on ne définit pas au doigt mouillé la parité de notre EC. </p>



<p class="wp-block-paragraph">Je pense (comme dans tous mes billets lorsque j&rsquo;arrive à la fin de la partie théorique) que nous sommes suffisamment armés pour nous lancer dans la partie pratique. J&rsquo;ai choisi d&rsquo;implémenter un stockage S3 pour mon serveur VEEAM.</p>



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



<p class="wp-block-paragraph">Nous considérons que nous possédons déjà un Serveur VEEAM ainsi qu&rsquo;un serveur physique de préférence (mais virtuel fonctionne aussi bien) RHEL<sup data-fn="bbd16f7c-6276-4d33-a765-0d3a85e4a505" class="fn"><a href="#bbd16f7c-6276-4d33-a765-0d3a85e4a505" id="bbd16f7c-6276-4d33-a765-0d3a85e4a505-link">9</a></sup> ou UBUNTU/DEBIAN durci au préalable pour notre stockage objet.</p>



<p class="wp-block-paragraph">Egalement, notre futur serveur de stockage objet (compatible S3) aura une partition dédiée au stockage montée et formatée au format XFS.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="806" height="434" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_101_Schema.jpg" alt="" class="wp-image-4239" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_101_Schema.jpg 806w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_101_Schema-300x162.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_101_Schema-768x414.jpg 768w" sizes="auto, (max-width: 806px) 100vw, 806px" /></figure>
</div>


<p class="wp-block-paragraph">Brouillon enregistré.</p>



<p class="wp-block-paragraph">Naturellement, cela va être un peu short niveau ressource donc je vais adapter en conséquence les paramètres de ma VM à défaut d&rsquo;avoir un serveur physique dédié pour le stockage S3.</p>



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



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



<h5 class="wp-block-heading">Serveur</h5>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id2198_74ab24-dc 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-pane2198_1ef866-8d"><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>1 &#8211; Download me</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="wp-block-paragraph">Il sera nécessaire d&rsquo;ajouter les sources de l&rsquo;éditeur en téléchargeant le package RPM puis d&rsquo;installer celui-ci.</p>



<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-18"><code><strong>## Community Edition
# wget https://dl.min.io/server/minio/release/linux-amd64/minio-20250907161309.0.0-1.x86_64.rpm -O minio.rpm

or

## AGPL License
# wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20240613225353.0.0-1.x86_64.rpm -O minio.rpm</strong></code></pre>



<p class="wp-block-paragraph"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-13-color">/!\</mark> Attention</strong>, ne privilégiez pas la Community Edition, sauf si vous savez ce que vous faites&#8230; Perso, nous partirons sur la version sous licence AGPL, bien plus complète.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="785" height="282" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_001_wget.png" alt="" class="wp-image-2206" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_001_wget.png 785w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_001_wget-300x108.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_001_wget-768x276.png 768w" sizes="auto, (max-width: 785px) 100vw, 785px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane2198_aa26a6-e9"><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>2 &#8211; Install me</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">
<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-19"><code><strong># dnf install minio.rpm</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="797" height="274" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_002_install.png" alt="" class="wp-image-2207" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_002_install.png 797w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_002_install-300x103.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_002_install-768x264.png 768w" sizes="auto, (max-width: 797px) 100vw, 797px" /></figure>
</div></div></div></div>
</div></div></div>



<p class="wp-block-paragraph"></p>



<h5 class="wp-block-heading">Client</h5>



<p class="wp-block-paragraph">Le client va nous permettre d&rsquo;interagir directement avec notre daemon en ligne de commande.</p>



<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-20"><code><strong># </strong>curl -L -o /usr/local/bin/mc https://dl.min.io/client/mc/release/linux-amd64/mc

# chmod +x /usr/local/bin/mc
# /usr/local/bin/mc --version</code></pre>



<h4 class="wp-block-heading">Configuration Système</h4>



<p class="wp-block-paragraph">J&rsquo;enfonce une porte ouverte. Mais cette étape est importante car elle représente un enjeu majeur de la sécurité de notre serveur de stockage dédié à la sauvegarde et donc de notre système d&rsquo;exploitation.</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id2198_a96a22-46 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-pane2198_656681-fe"><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>1 &#8211; Compte dédié</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="wp-block-paragraph">Dans le respect des bonnes pratiques ANSSI nous allons créer un compte système sans home et groupe dédié au service MinIO.</p>



<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-21"><code><strong># groupadd -r minio
# useradd -M -r -g minio minio</strong></code></pre>



<p class="wp-block-paragraph">Nous définissions les droits sur notre répertoire (point de montage naturellement) ainsi que les permissions adéquates.</p>



<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-22"><code><strong># chown minio:minio /mnt/minio
# chmod 700 /mnt/minio
# ls -al /mnt/minio</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="605" height="196" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_003_users_groups.png" alt="" class="wp-image-2208" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_003_users_groups.png 605w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_003_users_groups-300x97.png 300w" sizes="auto, (max-width: 605px) 100vw, 605px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane2198_5c1a1c-b1"><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>2 &#8211; Setting MinIO Systemd Service File</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="wp-block-paragraph">Créons le fichier qui va nous permettre de lancer notre daemon MinIO au démarrage de notre système.</p>



<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-23"><code><strong># vim /usr/lib/systemd/system/minio.service</strong></code></pre>



<pre class="wp-block-code has-small-font-size"><code><strong>&#91;Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

&#91;Service]
Type=notify

WorkingDirectory=/usr/local

User=minio
Group=minio
ProtectProc=invisible

EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if &#91; -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=1048576

# Turn-off memory accounting by systemd, which is buggy.
MemoryAccounting=no

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutSec=infinity

SendSIGKILL=no

&#91;Install]
WantedBy=multi-user.target

# Built for ${project.name}-${project.version} (${project.name})</strong>
</code></pre>



<p class="wp-block-paragraph">Attention de bien remplacer la valeur des variables <em>User</em> et <em>Group</em> par celles que nous avons créées précédemment.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="937" height="880" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_004_minioservices.png" alt="" class="wp-image-2209" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_004_minioservices.png 937w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_004_minioservices-300x282.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_004_minioservices-768x721.png 768w" sizes="auto, (max-width: 937px) 100vw, 937px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane2198_710135-63"><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>3 &#8211; Variable d&rsquo;environnement</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="wp-block-paragraph">Créons maintenant le fichier contenant nos variables d&rsquo;environnement qui sera utilisé par notre service.</p>



<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-24"><code><strong># vim /etc/default/minio</strong></code></pre>



<p class="wp-block-paragraph">Prenez le temps de définir le nom ainsi que le mot de passe du compte super administrateur qui permettra de s&rsquo;authentifier à l&rsquo;interface WEBUI. L&rsquo;accès à l&rsquo;interface se fera sur le port <strong>9001</strong>.</p>



<pre class="wp-block-code has-theme-palette-7-background-color has-background"><code><strong># MINIO_ROOT_USER and MINIO_ROOT_PASSWORD sets the root account for the MinIO server.
# This user has unrestricted permissions to perform S3 and administrative API operations on any resource in the deployment.
# Omit to use the default values 'minioadmin:minioadmin'.
# MinIO recommends setting non-default values as a best practice, regardless of environment

MINIO_ROOT_USER=adm.minio
MINIO_ROOT_PASSWORD=***********************

# MINIO_VOLUMES sets the storage volume or path to use for the MinIO server.

MINIO_VOLUMES="/mnt/minio"

# MINIO_OPTS sets any additional commandline options to pass to the MinIO server.
# For example, `--console-address :9001` sets the MinIO Console listen port
MINIO_OPTS="--console-address :9001"
</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="940" height="363" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_005_varfileenv.png" alt="" class="wp-image-2210" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_005_varfileenv.png 940w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_005_varfileenv-300x116.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_005_varfileenv-768x297.png 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></figure>
</div>


<p class="wp-block-paragraph">En termes de permission sur le fichier, ces derniers sont en modification uniquement par le compte root. Donc nous sommes rassurés.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane2198_2d18da-15"><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>4 &#8211; Manivelle et Service au démarrage</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="wp-block-paragraph">Comme toujours, nous allons faire en sorte que notre daemon démarre lors de la mise sous tension de notre serveur.</p>



<p class="wp-block-paragraph">Pour ce faire, vérifions dans un premier temps que le service se lance bien.</p>



<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-25"><code><strong># systemctl start minio.service
# systemctl status minio.service</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="605" height="149" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_006_systemctlminio.png" alt="" class="wp-image-2211" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_006_systemctlminio.png 605w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_006_systemctlminio-300x74.png 300w" sizes="auto, (max-width: 605px) 100vw, 605px" /></figure>
</div>


<p class="wp-block-paragraph">Puis comme d&rsquo;accoutumé</p>



<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-26"><code><strong># systemctl enable minio.service</strong></code></pre>



<p class="wp-block-paragraph"></p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-5 kt-pane2198_ffcf31-3d"><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>5 -Firewall</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="wp-block-paragraph">Il y a deux choses à bien différencier quant à notre service MinIO. La partie console d&rsquo;administration et la partie API pour le flux de données.</p>



<ul class="wp-block-list">
<li>Console WEBUI : Port 9001/tcp</li>



<li>Protocol S3 : Port 9000/tcp</li>
</ul>



<p class="wp-block-paragraph">Il est donc nécessaire d&rsquo;ouvrir les flux sur notre firewall.</p>



<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-27"><code><strong># firewall-cmd --permanent --add-port=9001/tcp
# firewall-cmd --permanent --add-port=9000/tcp
# firewall-cmd --reload</strong></code></pre>



<p class="wp-block-paragraph">Naturellement, si nous souhaitons publier notre service de stockage S3 sur le WEB, il conviendrait de faire un SPAT de IP_PUB:443 à destination de notre IP_LOCAL_MINIO:9000. Pour renforcer la sécurité, nous implémenterons IPS, Géolocalisation, Application Control et filtrage sur les IPs Publics entrantes habilitées uniquement.</p>
</div></div></div>
</div></div></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Il nous reste alors à créer notre règle sur notre firewall pour accéder à notre interface web. Puis depuis notre navigateur favori d&rsquo;accéder à notre interface (pour l&rsquo;instant en http).</p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="594" class="wp-image-4269" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_007_Install_1.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_007_Install_1.jpg 959w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_007_Install_1-278x300.jpg 278w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_007_Install_1-948x1024.jpg 948w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_007_Install_1-768x830.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="594" class="wp-image-4268" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_007_Install_2.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_007_Install_2.jpg 960w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_007_Install_2-278x300.jpg 278w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_007_Install_2-949x1024.jpg 949w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_007_Install_2-768x829.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">A partir de maintenant, nous allons attaquer les choses sérieuses. C&rsquo;est parti pour les buckets et l&rsquo;assaut du Colonel Kentucky !</p>



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



<p class="wp-block-paragraph">Naturellement il va falloir que l&rsquo;on sécurise un minimum nos services web. Par défaut MinIO utilise le protocole HTTP<sup data-fn="012490a3-ac71-4235-bc22-07bcaf1ff0b8" class="fn"><a href="#012490a3-ac71-4235-bc22-07bcaf1ff0b8" id="012490a3-ac71-4235-bc22-07bcaf1ff0b8-link">10</a></sup>. Pour ce faire je vais me simplifier la tâche en utilisant un certificat auto-signé. J&rsquo;ai la flemme monstrueuse de passer par un let&rsquo;s encrypt de me taper des règles de PAT<sup data-fn="d22eba11-5291-4a7f-8c9f-fad2e712216f" class="fn"><a href="#d22eba11-5291-4a7f-8c9f-fad2e712216f" id="d22eba11-5291-4a7f-8c9f-fad2e712216f-link">11</a></sup> entre ma box, mon UTM<sup data-fn="94404204-8ddc-4807-95d0-736e3657862b" class="fn"><a href="#94404204-8ddc-4807-95d0-736e3657862b" id="94404204-8ddc-4807-95d0-736e3657862b-link">12</a></sup>&#8230;</p>



<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-28"><code><strong># vim openssl.cnf</strong></code></pre>



<p class="wp-block-paragraph">Pour ne pas me prendre la tête, je passe dorénavant par des fichiers de configuration tout prêts. Les données les plus importantes étant comme nous pouvons nous en douter les SANs<sup data-fn="ef3f562d-2ef3-476e-843b-f1a800b5139a" class="fn"><a href="#ef3f562d-2ef3-476e-843b-f1a800b5139a" id="ef3f562d-2ef3-476e-843b-f1a800b5139a-link">13</a></sup> (et là je ne parle pas stockage, bande de petits malins).</p>



<pre class="wp-block-code"><code><strong>&#91;req]
default_bits = 4096
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext

&#91;dn]
C = FR
ST = France
L = MACON
O = RONELAB
CN = egapl-minio-01.ronelab.lan

&#91;req_ext]
subjectAltName = @alt_names

&#91;alt_names]
DNS.1 = egapl-minio-01.ronelab.lan
IP.1 = 10.127.252.250</strong></code></pre>



<p class="wp-block-paragraph">Nous générons notre clé privée et notre certificat public avec notre bon vieux openssl des familles.</p>



<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-29"><code><strong># openssl req -x509 -nodes -newkey rsa:4096 -days 3650 -keyout private.key -out public.crt -config openssl.cnf</strong></code></pre>



<p class="wp-block-paragraph">Nous créons si ce n&rsquo;est pas le cas le répertoire home de notre utilisateur de service dédié à MinIO (dans mon cas « minio »), et reste à déplacer les fichiers générés ainsi que l&rsquo;attribution des permissions pour garantir un minimum de sécurité.</p>



<pre class="wp-block-code"><code><strong># mkdir -p /home/minio
# mkdir -p /home/minio/.minio
# mkdir -p /home/minio/.minio/certs

# mv public.crt /home/minio/.minio/certs/
# mv private.key /home/minio/.minio/certs/

# chown -R minio:minio /home/minio</strong>
<strong># chown -R 700 /home/minio
# chown 600 /home/minio/.minio/certs/private.key
# chown 644 /home/minio/.minio/certs/public.crt</strong></code></pre>



<p class="wp-block-paragraph">Ne reste alors plus qu&rsquo;à restart notre daemon et avanti !</p>



<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-30"><code><strong># systemctl restart minio</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="825" height="790" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_011_certificat.jpg" alt="" class="wp-image-4286" style="aspect-ratio:1.044321940463065;width:523px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_011_certificat.jpg 825w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_011_certificat-300x287.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_011_certificat-768x735.jpg 768w" sizes="auto, (max-width: 825px) 100vw, 825px" /></figure>
</div>


<p class="wp-block-paragraph">Une chose de plus en moins à réaliser. Passons à la suite. 🙂</p>



<h4 class="wp-block-heading">Configuration Bucket</h4>



<p class="wp-block-paragraph">La première question est qu&rsquo;est ce qu&rsquo;un bucket ? Et je ne parle pas du saut de poulet spaghetti que l&rsquo;on trouve à KFC M&rsquo;sieurs Dames. Un peu de sérieux ! (Dixit le gars&#8230; C&rsquo;est le camembert qui dit au curé qu&rsquo;il est communiste ?)</p>



<p class="wp-block-paragraph">Un bucket, est un conteneur logique qui va stocker des objets (fichiers et les métadatas). Si nous faisons une comparaison avec un système de fichiers classique nous aurions :</p>


<div class="kb-table-container kb-table-container2198_fc4211-54 wp-block-kadence-table"><table class="kb-table kb-table2198_fc4211-54">
<tr class="kb-table-row kb-table-row2198_4f3e70-6d">
<th  scope="col" class="kb-table-data kb-table-data2198_b42e4a-34">

<p class="wp-block-paragraph">Système de Fichiers</p>

</th>

<th  scope="col" class="kb-table-data kb-table-data2198_21453a-6d">

<p class="wp-block-paragraph">S3</p>

</th>
</tr>

<tr class="kb-table-row kb-table-row2198_d99ed0-cd">
<td  class="kb-table-data kb-table-data2198_74a708-69">

<p class="has-text-align-center wp-block-paragraph">Disque</p>

</td>

<td  class="kb-table-data kb-table-data2198_4c8f2a-bc">

<p class="has-text-align-center wp-block-paragraph">Serveur S3</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_3911bc-64">
<td  class="kb-table-data kb-table-data2198_6368d0-57">

<p class="has-text-align-center wp-block-paragraph">Répertoire Racine</p>

</td>

<td  class="kb-table-data kb-table-data2198_b5abbf-c2">

<p class="has-text-align-center wp-block-paragraph">Bucket</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_51c220-ac">
<td  class="kb-table-data kb-table-data2198_a5879a-87">

<p class="has-text-align-center wp-block-paragraph">Dossier</p>

</td>

<td  class="kb-table-data kb-table-data2198_110545-ef">

<p class="has-text-align-center wp-block-paragraph">Préfixe dans une clé</p>

</td>
</tr>

<tr class="kb-table-row kb-table-row2198_1bff11-4a">
<td  class="kb-table-data kb-table-data2198_4a1a01-be">

<p class="has-text-align-center wp-block-paragraph">Fichier</p>

</td>

<td  class="kb-table-data kb-table-data2198_8e5f78-9b">

<p class="has-text-align-center wp-block-paragraph">Objet</p>

</td>
</tr>
</table></div>


<p class="wp-block-paragraph">Chaque bucket a sa propre configuration comme :</p>



<ul class="wp-block-list">
<li>Les droits d&rsquo;accès</li>



<li>Le chiffrement des objets qui le compose</li>



<li>Le versionning</li>



<li>Les règles de cycle de vie (suppression, archivage etc)</li>
</ul>



<p class="wp-block-paragraph">Là où nous allons devoir être vigilants va se trouver sur la méthode de création du bucket. En GUI<sup data-fn="bb9026cc-6808-403e-b2ec-4ae6ad07b929" class="fn"><a href="#bb9026cc-6808-403e-b2ec-4ae6ad07b929" id="bb9026cc-6808-403e-b2ec-4ae6ad07b929-link">14</a></sup> et CLI<sup data-fn="51523e5a-c67d-4757-a737-5a5e08fc388e" class="fn"><a href="#51523e5a-c67d-4757-a737-5a5e08fc388e" id="51523e5a-c67d-4757-a737-5a5e08fc388e-link">15</a></sup>, nous n&rsquo;avons pas les mêmes options et cela va avoir un impact sur certaines applications et dans mon cas un impact sur VEEAM.<br>Je ne présenterai que la partie CLI. La partie GUI, il faut RTFM<sup data-fn="128d73cd-33da-42d4-b2fd-72375a3e9720" class="fn"><a href="#128d73cd-33da-42d4-b2fd-72375a3e9720" id="128d73cd-33da-42d4-b2fd-72375a3e9720-link">16</a></sup>&#8230; 🙂</p>



<h5 class="wp-block-heading"><strong>CLI</strong></h5>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id2198_c230ff-59 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-pane2198_06cb65-2c"><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>1 &#8211; Alias ou AKA</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="wp-block-paragraph">Avant de créer notre bucket il va être nécessaire de créer un alias.</p>



<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-31"><code><strong># mc alias list
# mc alias set ronelab http://127.0.0.1:9000 adm.minio 'MyPassword_define_in_file'</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="986" height="928" src="https://erwanguillemard.com/wp-content/uploads/2024/06/Capture-decran-2026-07-26-105603.jpg" alt="" class="wp-image-4274" style="aspect-ratio:1.0625087635660002;width:415px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/Capture-decran-2026-07-26-105603.jpg 986w, https://erwanguillemard.com/wp-content/uploads/2024/06/Capture-decran-2026-07-26-105603-300x282.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/Capture-decran-2026-07-26-105603-768x723.jpg 768w" sizes="auto, (max-width: 986px) 100vw, 986px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane2198_713fcd-46"><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>2 &#8211; Bucket</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="wp-block-paragraph">Une fois notre alias défini nous allons pouvoir créer notre bucket pour VEEAM. Il est important de préciser l&rsquo;argument <strong>-l</strong>.</p>



<p class="wp-block-paragraph">L&rsquo;argument signifie que ce bucket à l&rsquo;ObjectLock d&rsquo;activé. Ce qui va permettre de gérer l&rsquo;immuabilité des données sur une durée définie.</p>



<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-32"><code><strong># /usr/local/bin/mc mb -l ronelab/veeambucket</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="594" height="46" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_009_Bucket_CUI_0.jpg" alt="" class="wp-image-4275" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_009_Bucket_CUI_0.jpg 594w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_009_Bucket_CUI_0-300x23.jpg 300w" sizes="auto, (max-width: 594px) 100vw, 594px" /></figure>
</div>


<p class="wp-block-paragraph">Nous pouvons également voir les statistiques liées à notre bucket ainsi que sa configuration.</p>



<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-33"><code><strong># /usr/local/bin/mc stat ronelab/veeambucket</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="586" height="614" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_009_Bucket_CUI_1.jpg" alt="" class="wp-image-4276" style="width:456px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_009_Bucket_CUI_1.jpg 586w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_009_Bucket_CUI_1-286x300.jpg 286w" sizes="auto, (max-width: 586px) 100vw, 586px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane2198_f61582-8a"><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>3 &#8211; Account Keys &amp; Policy</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">
<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-34"><code><strong># mc admin user add ronelab veeamuser 'MyVeeamPassword'</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="924" height="48" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_010_AccessKey_CUI_0.jpg" alt="" class="wp-image-4280" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_010_AccessKey_CUI_0.jpg 924w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_010_AccessKey_CUI_0-300x16.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_010_AccessKey_CUI_0-768x40.jpg 768w" sizes="auto, (max-width: 924px) 100vw, 924px" /></figure>
</div>


<p class="wp-block-paragraph">Définissons la politique qui va être attachée à notre utilisateur. Dans notre cas, les droits de lecture et écriture.</p>



<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-35"><code><strong># mc admin policy attach ronelab readwrite --user veeamuser</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="924" height="66" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_010_AccessKey_CUI_1.jpg" alt="" class="wp-image-4281" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_010_AccessKey_CUI_1.jpg 924w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_010_AccessKey_CUI_1-300x21.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_010_AccessKey_CUI_1-768x55.jpg 768w" sizes="auto, (max-width: 924px) 100vw, 924px" /></figure>
</div>


<p class="wp-block-paragraph">Vérifions que tout est bon.</p>



<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-36"><code><strong># mc admin user info ronelab veeamuser</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="678" height="108" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_010_AccessKey_CUI_2.jpg" alt="" class="wp-image-4282" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_010_AccessKey_CUI_2.jpg 678w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_010_AccessKey_CUI_2-300x48.jpg 300w" sizes="auto, (max-width: 678px) 100vw, 678px" /></figure>
</div>


<p class="wp-block-paragraph">L&rsquo;utilisateur étant créé, nous pouvons générer notre clé d&rsquo;accès qui servira plus tard à l&rsquo;authentification de l&rsquo;application VEEAM.</p>



<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-37"><code><strong># mc admin user svcacct add ronelab veeam-minio</strong></code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="763" height="89" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_010_AccessKey_CUI_4.jpg" alt="" class="wp-image-4283" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_010_AccessKey_CUI_4.jpg 763w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_010_AccessKey_CUI_4-300x35.jpg 300w" sizes="auto, (max-width: 763px) 100vw, 763px" /></figure>
</div></div></div>
</div></div></div>



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



<p class="wp-block-paragraph">L&rsquo;article à la base, je l&rsquo;avais commencé sur VBR<sup data-fn="d1678b38-e8c5-4b7e-9671-72916cb7f12b" class="fn"><a href="#d1678b38-e8c5-4b7e-9671-72916cb7f12b" id="d1678b38-e8c5-4b7e-9671-72916cb7f12b-link">17</a></sup> 12.1 courant 2024.  Puis ayant dû me focaliser sur ma vie professionnelle et personnelle par la suite, je me dois de refaire l&rsquo;intégralité de l&rsquo;intégration sur VEEAM 13.0.X, et plus particulièrement sur la VSA<sup data-fn="0383aeba-7f53-46aa-8ef7-f9ef47d0b47e" class="fn"><a href="#0383aeba-7f53-46aa-8ef7-f9ef47d0b47e" id="0383aeba-7f53-46aa-8ef7-f9ef47d0b47e-link">18</a></sup> 13.0.X &lt;3</p>



<h4 class="wp-block-heading">S3-Repository</h4>



<p class="wp-block-paragraph">Comme toujours avant de créer un job, il est nécessaire de passer par la phase d&rsquo;ajout d&rsquo;un nouveau backup repository.</p>



<p class="wp-block-paragraph">Dans <strong>Backup Infrastructure</strong>, sélectionnez <strong>Backup Repositories</strong> et avec votre plus beau clic droit, choisissez <strong>Add</strong>&#8230; Le type de backup sera de nature <strong>Object storage</strong>. Il est important de choisir <strong>S3 Compatible</strong> puis de choisir de nouveau ce dernier (je pense que MinIO est en capacité de prendre en charge du S3 Glacier, mais dans le doute je ne vais pas m&rsquo;avancer&#8230;).</p>


<div class="kb-gallery-wrap-id-2198_c68aec-c2 alignnone wp-block-kadence-advancedgallery"><div class="kb-gallery-ul kb-gallery-non-static kb-gallery-type-slider kb-gallery-id-2198_c68aec-c2 kb-gallery-caption-style-bottom-hover kb-gallery-filter-none" data-image-filter="none" data-lightbox-caption="true"><div class="kt-blocks-carousel splide kt-carousel-container-dotstyle-dark kt-carousel-arrowstyle-whiteondark kt-carousel-dotstyle-dark kb-slider-group-arrow kb-slider-arrow-position-center" data-slider-anim-speed="400" data-slider-scroll="1" data-slider-arrows="true" data-slider-fade="true" data-slider-dots="true" data-slider-type="slider" data-slider-hover-pause="false" data-slider-auto="" data-slider-speed="7000" data-show-pause-button="false"><div class="splide__track"><ul class="kt-blocks-carousel-init kb-blocks-slider splide__list"><li class="kb-slide-item kb-gallery-slide-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain kadence-blocks-gallery-intrinsic kb-gallery-image-ratio-land32 kb-has-image-ratio-land32" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_001-1024x579.jpg" width="1024" height="579" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_001.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_001.jpg" data-id="4287" class="wp-image-4287 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_001-1024x579.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_001-300x170.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_001-768x434.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_001.jpg 1219w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-slide-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain kadence-blocks-gallery-intrinsic kb-gallery-image-ratio-land32 kb-has-image-ratio-land32" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_002.jpg" width="703" height="629" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_002.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_002.jpg" data-id="4288" class="wp-image-4288 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_002.jpg 703w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_002-300x268.jpg 300w" sizes="auto, (max-width: 703px) 100vw, 703px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-slide-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain kadence-blocks-gallery-intrinsic kb-gallery-image-ratio-land32 kb-has-image-ratio-land32" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_003.jpg" width="705" height="634" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_003.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_003.jpg" data-id="4289" class="wp-image-4289 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_003.jpg 705w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_003-300x270.jpg 300w" sizes="auto, (max-width: 705px) 100vw, 705px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-slide-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain kadence-blocks-gallery-intrinsic kb-gallery-image-ratio-land32 kb-has-image-ratio-land32" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_004.jpg" width="709" height="636" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_004.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_004.jpg" data-id="4290" class="wp-image-4290 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_004.jpg 709w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_004-300x269.jpg 300w" sizes="auto, (max-width: 709px) 100vw, 709px" /></div></div></figure></div></div></li></ul></div></div></div></div>


<p class="wp-block-paragraph">Une fois cette étape passée, nous voilà enfin dans le Wizard pour configurer notre repo S3.</p>



<p class="wp-block-paragraph">Honnêtement, rien ne change vraiment de l&rsquo;ajout d&rsquo;un repo classique mais je trouve toujours sympa d&rsquo;illustrer mes actions. Cela me donne un côté sérieux. Toujours dans les limites de mon infra, j&rsquo;ai limité le nombre de tâches parallèles à 1.</p>



<p class="wp-block-paragraph">Le gros du travail se situe à l&rsquo;étape 2 Account. Là en tant que <strong>service point</strong>, saisissez l&rsquo;url de votre serveur <strong>https://egapl-minio-01.ronelab.lan:9000</strong> [<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-13-color">/!\</mark> Attention :</strong> <em>Je me suis encore fait avoir sur la capture d&rsquo;écran&#8230; Le port pour l</em>&lsquo;API<em> S3 est <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-2-color"><strong>9000</strong></mark> et non <strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-13-color">9001</mark></strong>. A bon entendeur..</em>]. Renseignez la location et complétez les credentials. Pour cette étape, lors de notre création en ligne de commande précédemment, les informations vous ont été retournées. Ce sont ces dernières qui sont attendues. Lorsque vous cliquerez sur suivant, dans le cas de certificat SSC<sup data-fn="102b0213-94e3-47fa-ac9f-4c8ebc8eb724" class="fn"><a href="#102b0213-94e3-47fa-ac9f-4c8ebc8eb724" id="102b0213-94e3-47fa-ac9f-4c8ebc8eb724-link">19</a></sup>, il faudra accepter comme d&rsquo;accoutumé le certificat.</p>



<p class="wp-block-paragraph">La partie 3, Bucket est la dernière étape qui diffère d&rsquo;un ajout classique. Il faudra choisir le bucket à partir du bouton Browse. Si par pur hasard vous obtenez un message d&rsquo;erreur de la part de VEEAM c&rsquo;est que vous avez surement utilisé le port 9001 et non 9000 :). Choisissez également le répertoire. Si aucun n&rsquo;est présent, créez en un depuis le wizard. Il est important de comprendre que l&rsquo;immuabilité est portée par VEEAM et non par MinIO. C&rsquo;est pourquoi c&rsquo;est à vous de cocher la fonctionnalité <strong>Immutability Settings</strong> et de définir la <strong>période d&rsquo;immuabilitée</strong>.</p>



<p class="wp-block-paragraph">Pour les autres étapes du Wizard, c&rsquo;est de la rando. Je vous laisse poursuivre.</p>


<div class="kb-gallery-wrap-id-2198_e7fc0d-42 alignnone wp-block-kadence-advancedgallery"><div class="kb-gallery-ul kb-gallery-non-static kb-gallery-type-fluidcarousel kb-gallery-id-2198_e7fc0d-42 kb-gallery-caption-style-bottom-hover kb-gallery-filter-none" data-image-filter="none" data-lightbox-caption="true"><div class="kt-blocks-carousel splide kt-carousel-container-dotstyle-dark kt-carousel-arrowstyle-whiteondark kt-carousel-dotstyle-dark kb-slider-group-arrow kb-slider-arrow-position-center" data-slider-anim-speed="400" data-slider-scroll="1" data-slider-arrows="true" data-slider-dots="true" data-slider-hover-pause="false" data-slider-auto="" data-slider-speed="7000" data-slider-type="fluidcarousel" data-slider-center-mode="true" data-slider-gap="10px" data-slider-gap-tablet="10px" data-slider-gap-mobile="10px" data-show-pause-button="false"><div class="splide__track"><ul class="kt-blocks-carousel-init kb-blocks-fluid-carousel splide__list"><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_010.jpg" width="885" height="623" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_010.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_010.jpg" data-id="4292" class="wp-image-4292 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_010.jpg 885w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_010-300x211.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_010-768x541.jpg 768w" sizes="auto, (max-width: 885px) 100vw, 885px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_011.jpg" width="885" height="625" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_011.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_011.jpg" data-id="4293" class="wp-image-4293 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_011.jpg 885w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_011-300x212.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_011-768x542.jpg 768w" sizes="auto, (max-width: 885px) 100vw, 885px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_012.jpg" width="883" height="625" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_012.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_012.jpg" data-id="4294" class="wp-image-4294 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_012.jpg 883w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_012-300x212.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_012-768x544.jpg 768w" sizes="auto, (max-width: 883px) 100vw, 883px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_013.jpg" width="916" height="661" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_013.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_013.jpg" data-id="4295" class="wp-image-4295 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_013.jpg 916w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_013-300x216.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_013-768x554.jpg 768w" sizes="auto, (max-width: 916px) 100vw, 916px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_014.jpg" width="888" height="626" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_014.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_014.jpg" data-id="4296" class="wp-image-4296 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_014.jpg 888w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_014-300x211.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_014-768x541.jpg 768w" sizes="auto, (max-width: 888px) 100vw, 888px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_015.jpg" width="886" height="623" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_015.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_015.jpg" data-id="4297" class="wp-image-4297 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_015.jpg 886w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_015-300x211.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_015-768x540.jpg 768w" sizes="auto, (max-width: 886px) 100vw, 886px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_016.jpg" width="883" height="622" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_016.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_016.jpg" data-id="4298" class="wp-image-4298 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_016.jpg 883w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_016-300x211.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_016-768x541.jpg 768w" sizes="auto, (max-width: 883px) 100vw, 883px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_017.jpg" width="882" height="621" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_017.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_017.jpg" data-id="4299" class="wp-image-4299 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_017.jpg 882w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_017-300x211.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_017-768x541.jpg 768w" sizes="auto, (max-width: 882px) 100vw, 882px" /></div></div></figure></div></div></li></ul></div></div></div></div>


<p class="wp-block-paragraph">Une fois le wizard terminé, si nous regardons notre infrastructure, nous retrouvons bien notre nouveau repo 🙂 &lt;3</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="101" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_018-1024x101.jpg" alt="" class="wp-image-4300" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_018-1024x101.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_018-300x30.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_018-768x76.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_018.jpg 1120w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<h4 class="wp-block-heading">Job Configuration</h4>



<p class="wp-block-paragraph">Pour la création du job, cela va être exactement la même chose que la création d&rsquo;un job classique. Le seul point qui va diverger (Oh il a écrit verge&#8230; Okay cool&#8230;) va être le choix du repository S3, et c&rsquo;est tout&#8230;</p>



<p class="wp-block-paragraph">Toujours pour des problématiques d&rsquo;infrastructures j&rsquo;ai volontairement restreint la planification du job. De toute façon, l&rsquo;Appliance va être archivé d&rsquo;ici la fin de semaine donc OSEF j&rsquo;ai envie de vous dire&#8230;</p>


<div class="kb-gallery-wrap-id-2198_bf751a-e4 alignnone wp-block-kadence-advancedgallery"><div class="kb-gallery-ul kb-gallery-non-static kb-gallery-type-slider kb-gallery-id-2198_bf751a-e4 kb-gallery-caption-style-bottom-hover kb-gallery-filter-none" data-image-filter="none" data-lightbox-caption="true"><div class="kt-blocks-carousel splide kt-carousel-container-dotstyle-dark kt-carousel-arrowstyle-whiteondark kt-carousel-dotstyle-dark kb-slider-group-arrow kb-slider-arrow-position-center" data-slider-anim-speed="400" data-slider-scroll="1" data-slider-arrows="true" data-slider-fade="true" data-slider-dots="true" data-slider-type="slider" data-slider-hover-pause="false" data-slider-auto="" data-slider-speed="7000" data-show-pause-button="false"><div class="splide__track"><ul class="kt-blocks-carousel-init kb-blocks-slider splide__list"><li class="kb-slide-item kb-gallery-slide-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain kadence-blocks-gallery-intrinsic kb-gallery-image-ratio-land32 kb-has-image-ratio-land32" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_020.jpg" width="814" height="625" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_020.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_020.jpg" data-id="4303" class="wp-image-4303 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_020.jpg 814w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_020-300x230.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_020-768x590.jpg 768w" sizes="auto, (max-width: 814px) 100vw, 814px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-slide-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain kadence-blocks-gallery-intrinsic kb-gallery-image-ratio-land32 kb-has-image-ratio-land32" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_021.jpg" width="813" height="622" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_021.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_021.jpg" data-id="4304" class="wp-image-4304 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_021.jpg 813w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_021-300x230.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_021-768x588.jpg 768w" sizes="auto, (max-width: 813px) 100vw, 813px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-slide-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain kadence-blocks-gallery-intrinsic kb-gallery-image-ratio-land32 kb-has-image-ratio-land32" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_022.jpg" width="812" height="621" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_022.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_022.jpg" data-id="4305" class="wp-image-4305 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_022.jpg 812w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_022-300x229.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_022-768x587.jpg 768w" sizes="auto, (max-width: 812px) 100vw, 812px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-slide-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain kadence-blocks-gallery-intrinsic kb-gallery-image-ratio-land32 kb-has-image-ratio-land32" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_023.jpg" width="815" height="624" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_023.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_023.jpg" data-id="4306" class="wp-image-4306 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_023.jpg 815w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_023-300x230.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_023-768x588.jpg 768w" sizes="auto, (max-width: 815px) 100vw, 815px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-slide-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain kadence-blocks-gallery-intrinsic kb-gallery-image-ratio-land32 kb-has-image-ratio-land32" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_024.jpg" width="817" height="624" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_024.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_024.jpg" data-id="4307" class="wp-image-4307 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_024.jpg 817w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_024-300x229.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_024-768x587.jpg 768w" sizes="auto, (max-width: 817px) 100vw, 817px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-slide-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain kadence-blocks-gallery-intrinsic kb-gallery-image-ratio-land32 kb-has-image-ratio-land32" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_025.jpg" width="813" height="624" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_025.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_025.jpg" data-id="4308" class="wp-image-4308 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_025.jpg 813w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_025-300x230.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_025-768x589.jpg 768w" sizes="auto, (max-width: 813px) 100vw, 813px" /></div></div></figure></div></div></li></ul></div></div></div></div>


<p class="wp-block-paragraph">Notre job étant créé, place au test 🙂</p>



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



<p class="wp-block-paragraph">Le test est plutôt simple, je vais lancer un job et tenter de supprimer ce dernier depuis la console VEEAM.</p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>Début</strong></td><td class="has-text-align-center" data-align="center"><strong>Fin</strong></td></tr><tr><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="400" class="wp-image-4310" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_030.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_030.jpg 939w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_030-300x218.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_030-768x559.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="399" class="wp-image-4311" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_031.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_031.jpg 943w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_031-300x218.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_031-768x557.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">La sauvegarde s&rsquo;est bien déroulée, donc cela prouve qu&rsquo;avec le durcissement ANSSI<sup data-fn="538518c1-0a50-4ba8-a094-bb9d754f6ff0" class="fn"><a href="#538518c1-0a50-4ba8-a094-bb9d754f6ff0" id="538518c1-0a50-4ba8-a094-bb9d754f6ff0-link">20</a></sup> et notre configuration de MinIO je n&rsquo;ai pas fait de me**e. Regardons notre chaine de sauvegarde.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="190" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_032-1024x190.jpg" alt="" class="wp-image-4312" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_032-1024x190.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_032-300x56.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_032-768x143.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_032.jpg 1126w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">Si je choisis de supprimer le point, vais je pouvoir supprimer le backup ? La réponse est évidemment non mais nous nous devons de vérifier ce point.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="475" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_033-1024x475.jpg" alt="" class="wp-image-4313" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_033-1024x475.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_033-300x139.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_033-768x356.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_008_012_veeam_033.jpg 1120w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">J&rsquo;ai envie d&rsquo;écrire, la messe est dite. L&rsquo;immuabilité fonctionne.</p>



<p class="wp-block-paragraph">Je me suis posé la question comme pour la partie hardened de supprimer les données de mon serveur standalone. La réponse est évidemment oui si j&rsquo;ai les droits root. Je peux démonter le disque ou supprimer son contenu. Toutefois, et c&rsquo;est là que je n&rsquo;ai pas les ressources, mais si c&rsquo;était un ring je n&rsquo;aurais pas pu. </p>



<p class="wp-block-paragraph">J&rsquo;ai mentionné plus haut que même une divinité ne peut supprimer les données c&rsquo;est pourquoi je nuance mes écrits. Il sera toujours possible à l&rsquo;utilisateur, que dis-je administrateur qui a tous les accès de supprimer les données.</p>



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



<p class="wp-block-paragraph">Cet article fait partie des premiers que j&rsquo;ai commencé à écrire en 2024 et puis je l&rsquo;ai abandonné. Je pense par frustration à l&rsquo;époque.</p>



<p class="wp-block-paragraph">J&rsquo;ai toujours défendu bec et ongle l&rsquo;immuabilité hardened vis à vis de l&rsquo;immuabilité S3. Pourtant il convient de reconnaitre de ma part que le Storage S3 offre plus de sécurité. Néanmoins je reste convaincue qu&rsquo;un repo hardened répond très bien au ESN ayant aux moins deux sites et qui veulent arrêter de s&#8217;emm***er avec des rotations de disque dur externe (même si cela reste une solution viable et qui est toujours mieux que rien).</p>



<p class="wp-block-paragraph">Dans les deux cas, je trouve bien la possibilité dans ces deux cas de pouvoir recycler des équipements (serveurs) considérés comme obsolètes pour des environnements de production pour les utiliser comme repo S3 standalone ou hardened.</p>



<p class="has-text-align-center wp-block-paragraph"><strong>Si je devais faire un choix ?</strong></p>



<p class="wp-block-paragraph">Je répondrai en politicien, avec ma plus belle <a href="https://www.youtube.com/watch?v=hz5xWgjSUlk">langue de bois</a>. Cela dépendra du contexte. 🙂 Il faut garder à l&rsquo;esprit que le Hardened protège plus facilement des ransonmware, des erreurs humaines et des compromissions VEEAM. A l&rsquo;inverse, S3 est plus adapté contre la suppression logique, la conformité réglementaire, les suppressions depuis VEEAM. </p>



<p class="wp-block-paragraph">Toutefois, si j&rsquo;avais continué ma carrière en ESN, j&rsquo;implémenterais ce type de solution avec 3 nodes « obsolètes » sur le papier en conservant une extension de garantie des équipements et intégrerais MinIO au catalogue de service. Mais ça, c&rsquo;est si j&rsquo;étais toujours dans une ESN.</p>



<p class="wp-block-paragraph">L&rsquo;une des ouvertures et projet à venir serait de monter un ring sur 3 sites différents&#8230;</p>



<p class="wp-block-paragraph">Finalement, c&rsquo;est beau et bien de terminer un article plus de deux ans après&#8230; 🙂</p>



<p class="wp-block-paragraph">Le mot de la fin :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Je range un cadeau dans MinIO, le S3 applaudit en IPv6, le bucket éternue, et ma théière me retourne une Error 418. Très joli coup. Vous passez en case Jacob Delafonte.</em></p>
<cite>Erwan GUILLEMARD</cite></blockquote>



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



<ul class="wp-block-list">
<li><a href="https://docs.aws.amazon.com/fr_fr/AmazonS3/latest/userguide/Welcome.html">AMAZON S3</a></li>



<li><a href="https://erwanguillemard.com/apps-veeam-repo-backup-hardened/">Apps – VEEAM Repo &amp; Backup Hardened</a></li>



<li><a href="https://linux.die.net/man/8/useradd">LINUX &#8211; useradd Man</a></li>



<li><a href="https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-single-node-single-drive.html#minio-snsd">MinIO &#8211; Install Guide</a></li>



<li><a href="https://min.io/docs/minio/linux/integrations/using-minio-with-veeam.html">MinIO &#8211; VEEAMBucket</a></li>
</ul>



<p class="wp-block-paragraph"></p>


<ol class="wp-block-footnotes"><li id="5daf5660-def4-42b2-81fc-7381fb71f8eb"><strong>SE :</strong> Système d&rsquo;Exploitation <a href="#5daf5660-def4-42b2-81fc-7381fb71f8eb-link" aria-label="Aller à la note de bas de page 1">↩︎</a></li><li id="64126bc5-ea68-4702-914c-0c2efa484ca6"><strong>S3 :</strong> Simple Storage Service <a href="#64126bc5-ea68-4702-914c-0c2efa484ca6-link" aria-label="Aller à la note de bas de page 2">↩︎</a></li><li id="ebd22563-41db-4ad8-b047-7f3efb5205e5"><strong>GAFAM :</strong> Google Amazon Facebook Apple Microsoft <a href="#ebd22563-41db-4ad8-b047-7f3efb5205e5-link" aria-label="Aller à la note de bas de page 3">↩︎</a></li><li id="67827f4e-9213-452a-be37-7b3f023820e9"><strong>WORM :</strong> Write Once Read Many <a href="#67827f4e-9213-452a-be37-7b3f023820e9-link" aria-label="Aller à la note de bas de page 4">↩︎</a></li><li id="6e7f7b72-5d59-45a2-9059-bf1e1e4b7b6e"><strong>SaaS :</strong> Software As A Service <a href="#6e7f7b72-5d59-45a2-9059-bf1e1e4b7b6e-link" aria-label="Aller à la note de bas de page 5">↩︎</a></li><li id="3af07056-54d6-45db-ad01-36f5f0a26035"><strong>OS :</strong> Operating System <a href="#3af07056-54d6-45db-ad01-36f5f0a26035-link" aria-label="Aller à la note de bas de page 6">↩︎</a></li><li id="b243a23f-4d53-4e0b-a631-32d9433a3b01"><strong>NAT : </strong>Network Address Translation <a href="#b243a23f-4d53-4e0b-a631-32d9433a3b01-link" aria-label="Aller à la note de bas de page 7">↩︎</a></li><li id="bd5e85eb-9910-4b06-a8c6-3c0ecd0abd88"><strong>PAT :</strong> Port Address Translation <a href="#bd5e85eb-9910-4b06-a8c6-3c0ecd0abd88-link" aria-label="Aller à la note de bas de page 8">↩︎</a></li><li id="bbd16f7c-6276-4d33-a765-0d3a85e4a505"><strong>RHEL :</strong> RedHat Entreprise Linux <a href="#bbd16f7c-6276-4d33-a765-0d3a85e4a505-link" aria-label="Aller à la note de bas de page 9">↩︎</a></li><li id="012490a3-ac71-4235-bc22-07bcaf1ff0b8"><strong>HTTP :</strong> HyperText Transfert Protocol <a href="#012490a3-ac71-4235-bc22-07bcaf1ff0b8-link" aria-label="Aller à la note de bas de page 10">↩︎</a></li><li id="d22eba11-5291-4a7f-8c9f-fad2e712216f"><strong>PAT :</strong> Port Address Translation <a href="#d22eba11-5291-4a7f-8c9f-fad2e712216f-link" aria-label="Aller à la note de bas de page 11">↩︎</a></li><li id="94404204-8ddc-4807-95d0-736e3657862b"><strong>UTM :</strong> Unified Tread Management <a href="#94404204-8ddc-4807-95d0-736e3657862b-link" aria-label="Aller à la note de bas de page 12">↩︎</a></li><li id="ef3f562d-2ef3-476e-843b-f1a800b5139a"><strong>SAN :</strong> Subject Alternative Name <a href="#ef3f562d-2ef3-476e-843b-f1a800b5139a-link" aria-label="Aller à la note de bas de page 13">↩︎</a></li><li id="bb9026cc-6808-403e-b2ec-4ae6ad07b929"><strong>GUI :</strong> Graphic User Interface <a href="#bb9026cc-6808-403e-b2ec-4ae6ad07b929-link" aria-label="Aller à la note de bas de page 14">↩︎</a></li><li id="51523e5a-c67d-4757-a737-5a5e08fc388e"><strong>CLI :</strong> Command Line Interface <a href="#51523e5a-c67d-4757-a737-5a5e08fc388e-link" aria-label="Aller à la note de bas de page 15">↩︎</a></li><li id="128d73cd-33da-42d4-b2fd-72375a3e9720"><strong>RTFM :</strong> Read The Fucking Manual <a href="#128d73cd-33da-42d4-b2fd-72375a3e9720-link" aria-label="Aller à la note de bas de page 16">↩︎</a></li><li id="d1678b38-e8c5-4b7e-9671-72916cb7f12b"><strong>VBR :</strong> Veeam Backup et Replication <a href="#d1678b38-e8c5-4b7e-9671-72916cb7f12b-link" aria-label="Aller à la note de bas de page 17">↩︎</a></li><li id="0383aeba-7f53-46aa-8ef7-f9ef47d0b47e"><strong>VSA :</strong> Veeam Software Appliance <a href="#0383aeba-7f53-46aa-8ef7-f9ef47d0b47e-link" aria-label="Aller à la note de bas de page 18">↩︎</a></li><li id="102b0213-94e3-47fa-ac9f-4c8ebc8eb724"><strong>SSC :</strong> Self-Signed Certificat <a href="#102b0213-94e3-47fa-ac9f-4c8ebc8eb724-link" aria-label="Aller à la note de bas de page 19">↩︎</a></li><li id="538518c1-0a50-4ba8-a094-bb9d754f6ff0"><strong>ANSSI :</strong> Agence National de Sécurité des Systèmes d&rsquo;Informations <a href="#538518c1-0a50-4ba8-a094-bb9d754f6ff0-link" aria-label="Aller à la note de bas de page 20">↩︎</a></li></ol>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Apps &#8211; OpenWebUI</title>
		<link>https://erwanguillemard.com/apps-openwebui/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Sat, 25 Apr 2026 09:19:00 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[IA]]></category>
		<category><![CDATA[OLLAMA]]></category>
		<category><![CDATA[OPENWEBUI]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=3520</guid>

					<description><![CDATA[Ce billet vient en complément et suite de l&#8217;article Apps &#8211; Ollama. Ce dernier (promis juré, craché sera assez rapide) sera un billet court. Pourquoi ? Parce que tout ou une grande partie à déjà été dit dans l&#8217;article traitant d&#8217;Ollama. J&#8217;avais jugé trop indigeste de fondre les deux sujets. Donc ici, la partie théorie...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ce billet vient en complément et suite de l&rsquo;article Apps &#8211; Ollama. Ce dernier (promis juré, craché sera assez rapide) sera un billet court.</p>



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



<p class="wp-block-paragraph">Parce que tout ou une grande partie à déjà été dit dans l&rsquo;article traitant d&rsquo;Ollama. J&rsquo;avais jugé trop indigeste de fondre les deux sujets. Donc ici, la partie théorie sera plutôt courte et en conséquence la partie Pratique un peu plus étoffée concernant l&rsquo;implémentation et la configuration de l&rsquo;application.</p>



<p class="wp-block-paragraph">Bref, l&rsquo;objectif de cet article sera d&rsquo;implémenter une interface graphique publiée pour faciliter l&rsquo;usage de notre solution Ollama plurimodales (LLM<sup data-fn="9b4b7116-7da7-4c05-943e-ac072573b13f" class="fn"><a href="#9b4b7116-7da7-4c05-943e-ac072573b13f" id="9b4b7116-7da7-4c05-943e-ac072573b13f-link">1</a></sup>) aux utilisateurs. J&rsquo;ai pris le parti d&rsquo;utiliser la solution OpenWebUI.</p>





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



<p class="wp-block-paragraph">Vous l&rsquo;avez bien compris, dans l&rsquo;introduction, je n&rsquo;ai pas l&rsquo;attention de m&rsquo;éterniser 10 000 ans sur le sujet.</p>



<p class="wp-block-paragraph">Je pars du principe que nous avons déjà déployé et configuré la solution Ollama et quelques modèles de traitement IA<sup data-fn="f36cb89d-8ac6-4ed0-8df5-7d578d4680c4" class="fn"><a href="#f36cb89d-8ac6-4ed0-8df5-7d578d4680c4" id="f36cb89d-8ac6-4ed0-8df5-7d578d4680c4-link">2</a></sup> sur un serveur.</p>



<p class="wp-block-paragraph">J&rsquo;ai une nouvelle fois pris le parti de déployer l&rsquo;application sous une distribution RHEL<sup data-fn="9e902093-392b-4860-a9f8-d2c28cf28686" class="fn"><a href="#9e902093-392b-4860-a9f8-d2c28cf28686" id="9e902093-392b-4860-a9f8-d2c28cf28686-link">3</a></sup> afin d&rsquo;avoir un niveau de sécurité optimale. Toutefois et vous pourrez le constatez par la suite dans la partie théorie, je ne respecterai pas l&rsquo;architecture par faute de ressource disponible néanmoins, je recommande de suivre l&rsquo;architecture qui sera à venir.</p>



<p class="wp-block-paragraph">Dans le cadre d&rsquo;une solution d&rsquo;IA hébergée localement se pose la question de mettre en place un tel portail dans une organisation. A cela je répondrai que cela permettra de garder un certain contrôle des requêtes, prompts, effectués par l&rsquo;ensemble des utilisateurs de l&rsquo;organisation et d&rsquo;en faciliter les usages. Dans des domaines sensibles tels que l&rsquo;industrie et production cela peut aux yeux de la direction et de la DSI<sup data-fn="4a15f514-bc25-45dc-8c12-3f5fd10c286d" class="fn"><a href="#4a15f514-bc25-45dc-8c12-3f5fd10c286d" id="4a15f514-bc25-45dc-8c12-3f5fd10c286d-link">4</a></sup> se révéler rassurant.</p>



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



<ul class="wp-block-list">
<li><strong>SE :</strong>
<ul class="wp-block-list">
<li>Rocky Linux 9.x et version ultérieures (pour ma part ça sera du 10.x)</li>



<li>macOS</li>



<li>Windows</li>
</ul>
</li>



<li><strong>Apps :&nbsp;</strong>
<ul class="wp-block-list">
<li>Ollama</li>
</ul>
</li>



<li><strong>Autres :</strong>
<ul class="wp-block-list">
<li>Minimum 4 CPU<sup data-fn="63b8e4f1-84bc-47ad-8afa-7dae59217921" class="fn"><a href="#63b8e4f1-84bc-47ad-8afa-7dae59217921" id="63b8e4f1-84bc-47ad-8afa-7dae59217921-link">5</a></sup></li>



<li>Minimum 4 Gio de RAM<sup data-fn="f958a01e-8b83-4fc9-a592-006e9651956c" class="fn"><a href="#f958a01e-8b83-4fc9-a592-006e9651956c" id="f958a01e-8b83-4fc9-a592-006e9651956c-link">6</a></sup></li>



<li>Stockage rapide (SSD<sup data-fn="8f6e0338-719e-4456-808e-82e0a17b70ea" class="fn"><a href="#8f6e0338-719e-4456-808e-82e0a17b70ea" id="8f6e0338-719e-4456-808e-82e0a17b70ea-link">7</a></sup>&nbsp;ou Nvme)</li>
</ul>
</li>
</ul>



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



<h3 class="wp-block-heading">KesaKo OpenWebUI</h3>



<p class="wp-block-paragraph">Je pense comme toujours qu&rsquo;il est important de se poser la traditionnelle question. Que fait l&rsquo;application que nous allons utiliser, comment elle fonctionne et qui est derrière.</p>



<h4 class="wp-block-heading">Qu&rsquo;est-ce que c&rsquo;est ?</h4>



<p class="wp-block-paragraph">OpenWebUI, c&rsquo;est une interface web issue d&rsquo;une projet open-source (<strong>#biscotto</strong>) qui permet d&rsquo;utiliser des modèles d&rsquo;IA depuis un navigateur WEB hébergé localement. </p>



<p class="wp-block-paragraph">Le projet est né du sud-coréen Tim Jaeryang BAEK qui prône l&rsquo;autonomie numérique face aux grands du monde de la tech. Le projet est développé en Python (version supérieur ou égale à 3.11) pour la partie BackEnd et HTML/CSS, Svelte, JS et TS pour la partie FrontEnd.</p>



<p class="wp-block-paragraph">Personnellement, je trouve que l&rsquo;interface ressemble fortement à celle de ChatGPT. Mais son mon avis personnel hein 🙂</p>



<h4 class="wp-block-heading">A quoi ça sert ?</h4>



<p class="wp-block-paragraph">La solution va permettre comme les outils classiques en ligne (pour ne pas dire les géants du Cloud) d&rsquo;effectuer des opérations (énumération en approche) :</p>



<ul class="wp-block-list">
<li><strong>Discuter</strong> avec des modèles d&rsquo;IA (LLM)</li>



<li><strong>Exploiter</strong> des modèles localement (LLM)</li>



<li><strong>S&rsquo;Interfacer</strong> avec des sources locales et clouds (et oui nous pouvons faire de l&rsquo;hybridation).</li>



<li><strong>Téléverser </strong>(waouh, tu n&rsquo;as pas écrit uploader !) des fichiers pour les analyser par l&rsquo;IA</li>
</ul>



<p class="wp-block-paragraph">Nous retrouvons donc dans l&rsquo;ensemble les mêmes fonctionnalités que les outils en ligne quant à l&rsquo;usage de l&rsquo;IA 🙂 C&rsquo;est cool non ? &lt;3</p>



<h3 class="wp-block-heading">Avantages / Inconvénients</h3>



<p class="wp-block-paragraph">L&rsquo;utilisation d&rsquo;OpenWebUI n&rsquo;est pas sans conséquences vis à vis des services qu&rsquo;il peut apporter.</p>



<p class="wp-block-paragraph">Il suffit de regarder le constat déjà porté sur l&rsquo;utilisation d&rsquo;Ollama.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center"><mark style="background-color:rgba(0, 0, 0, 0);color:#3ec632" class="has-inline-color"><strong>Avantages</strong></mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color">Inconvénients</mark></td></tr><tr><td class="has-text-align-center" data-align="center">Open Source<br>Respect de la vie privée<br>Cross Compatibilité des modèles<br>Simplicité de l&rsquo;interface</td><td class="has-text-align-center" data-align="center">Installation technique<br>Modèles locaux couteux en ressources (RAM, CPU, GPU<sup data-fn="57be53ba-9128-49e7-ae7a-c337f01cf69e" class="fn"><a href="#57be53ba-9128-49e7-ae7a-c337f01cf69e" id="57be53ba-9128-49e7-ae7a-c337f01cf69e-link">8</a></sup>, Stockage)</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Bon, cela je vous dirai l&rsquo;utilisateur il s&rsquo;en tamponne le coquillard. Lui que ce soit technique à mettre en place, il s&rsquo;en lustre l&rsquo;asperge. Par contre, si la réponse est lente, c&rsquo;est le <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-13-color"><strong><em><span style="text-decoration: underline;">Game Over</span></em></strong></mark>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="575" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_003_ER_Died-1024x575.jpg" alt="" class="wp-image-3528" style="aspect-ratio:1.7809626179386122;width:616px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_003_ER_Died-1024x575.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_003_ER_Died-300x169.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_003_ER_Died-768x431.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_003_ER_Died-1536x863.jpg 1536w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_003_ER_Died.jpg 1561w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">Logique, pourquoi utiliser la solution locale qui met une plombe à répondre alors qu&rsquo;un bon vieux Gémini, Copilot, ChatGPT te donne la réponse en 1/4 de seconde après une petite pression sur la touche Enter du clavier ?</p>



<p class="wp-block-paragraph">Ce qui nous ramène selon moi à l&rsquo;un des plus grands maux de la société actuelle. Nous ne savons ce que signifie attendre et être patient. Si dans les années 60 la compilation d&rsquo;un programme pouvait prendre la nuit, aujourd&rsquo;hui cela prendra quelques minutes. L&rsquo;essor des nouvelles technologies, nous apportent de par les performances et leurs mobilités l&rsquo;informations et l&rsquo;assurance de pouvoir joindre un individu ou une ressource si quand bien même nous avons du réseau. Toutefois, force est de constaté que si comme cela s&rsquo;est passé plusieurs fois au cours de l&rsquo;année 2025 et 2026 l&rsquo;un des maillons qui assure le fonctionnement tombe et nous coupe de nos ressources, nous nous retrouvons comme une poule qui a trouvé un couteau. Je pense et cela n&rsquo;est qu&rsquo;un point de vue personnel que nous devrions nous remettre en question face à cette forme de dépendance et servitude, <a href="https://www.youtube.com/watch?v=IsvfofcIE1Q&amp;list=RDIsvfofcIE1Q&amp;start_radio=1">Master &amp; Servant</a>, je dis STOP ! <strong><em>#sendkissesagain</em></strong></p>



<h3 class="wp-block-heading">Architecture &amp; Best Pratices</h3>



<p class="wp-block-paragraph">Lors de la présentation de la solution, j&rsquo;ai introduit la possibilité d&rsquo;utiliser OpenWebUI en mode hybride. Ce qui implique donc une communication des flux sortants via les protocoles HTTP<sup data-fn="f4993b7e-0f63-4b56-886c-b4e26648314b" class="fn"><a href="#f4993b7e-0f63-4b56-886c-b4e26648314b" id="f4993b7e-0f63-4b56-886c-b4e26648314b-link">9</a></sup> et HTTPS<sup data-fn="1d2044d0-2a6b-4f6c-9865-c8cded2e72e1" class="fn"><a href="#1d2044d0-2a6b-4f6c-9865-c8cded2e72e1" id="1d2044d0-2a6b-4f6c-9865-c8cded2e72e1-link">10</a></sup> vers les IAs compatibles dans le cloud et autres repos propres au SE<sup data-fn="688876c0-5948-48bf-baaf-3d493e2e5c01" class="fn"><a href="#688876c0-5948-48bf-baaf-3d493e2e5c01" id="688876c0-5948-48bf-baaf-3d493e2e5c01-link">11</a></sup> et maintien de l&rsquo;application. Afin de ne pas surcharger inutilement le schéma, j&rsquo;ai totalement exclu cette partie. Néanmoins il conviendra de réaliser un filtrage strict en sortie des flux pour des raisons de sécurité. Donc de jouer avec les politiques de votre UTMs<sup data-fn="13f6c481-ca7e-4e73-875d-cf307bad64ec" class="fn"><a href="#13f6c481-ca7e-4e73-875d-cf307bad64ec" id="13f6c481-ca7e-4e73-875d-cf307bad64ec-link">12</a></sup>.</p>



<p class="wp-block-paragraph">Bien, rentrons concrètement dans l&rsquo;architecture. La solution applicative OpenWebUI vient se placer entre le poste client et l&rsquo;application Ollama.</p>



<p class="wp-block-paragraph">Il convient dans le respect des bonnes pratiques de dissocier OpenWebUI de Ollama puisque nous allons publier, ouvrir l&rsquo;application en interne et pourquoi pas depuis nos WANs<sup data-fn="ac43ad3e-9b07-4981-8114-d187d3cf6dbf" class="fn"><a href="#ac43ad3e-9b07-4981-8114-d187d3cf6dbf" id="ac43ad3e-9b07-4981-8114-d187d3cf6dbf-link">13</a></sup>. Cela implique de mettre OpenWebUI dans un réseau isolé (DMZ<sup data-fn="103fd0e8-cd60-41ff-b80a-9c51d9c20b76" class="fn"><a href="#103fd0e8-cd60-41ff-b80a-9c51d9c20b76" id="103fd0e8-cd60-41ff-b80a-9c51d9c20b76-link">14</a></sup>) et Ollama dans le réseau <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-10-color">T1</mark>, <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-10-color">T1&prime;</mark> par exemple.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="861" height="620" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_001_arch.jpg" alt="" class="wp-image-3526" style="aspect-ratio:1.3887129819333208;width:600px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_001_arch.jpg 861w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_001_arch-300x216.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_001_arch-768x553.jpg 768w" sizes="auto, (max-width: 861px) 100vw, 861px" /></figure>
</div>


<p class="wp-block-paragraph">Par défaut, dans un fonctionnement UNIX dans un déploiement hors Docker, le port de communication de l&rsquo;interface Web se fait via le protocole <strong>http </strong>sur le port <strong>8080</strong>. Il est néanmoins possible de forcer les connexions en <strong>https </strong>sur le port <strong>443 </strong>via <strong>nginx</strong> (je reviendrai plus en détail sur ce point).</p>



<p class="wp-block-paragraph">Si nous regardons d&rsquo;un peu plus près l&rsquo;architecture de la VM<sup data-fn="2f21ddb8-be62-4029-92fc-283d894d896c" class="fn"><a href="#2f21ddb8-be62-4029-92fc-283d894d896c" id="2f21ddb8-be62-4029-92fc-283d894d896c-link">15</a></sup>, nous pouvons constater que j&rsquo;ai dédié un disque. Mais pourquoi ?</p>



<p class="wp-block-paragraph">OpenWebUI est très très lourd. Son déploiement peut se révéler un poil pénible pour ne pas dire chiant à mourir (je reviendrai là-dessus dans la partie pratique).</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="576" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_002_migraine-1024x576.jpg" alt="" class="wp-image-3527" style="width:612px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_002_migraine-1024x576.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_002_migraine-300x169.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_002_migraine-768x432.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_002_migraine-1536x864.jpg 1536w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_002_migraine-2048x1152.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">https://unsplash.com/fr/photos/un-homme-portant-ses-mains-a-ses-oreilles-gK_ifZrZ0oc</figcaption></figure>
</div>


<p class="wp-block-paragraph">Bref, pour pallier à ce problème, j&rsquo;ai dédié un disque d&rsquo;une capacité de 100 Gio.</p>



<p class="wp-block-paragraph">Bien, on se lance dans la pratique ? Après on est bien aussi ici 🙂</p>



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



<p class="wp-block-paragraph">Oui j&rsquo;ai dit plus haut que je ne respecterai pas cette topologie. Par manque de ressource, je vais tailler à la hussarde et tout mutualiser sur une seule machine. Il faut bien faire avec les moyens que l&rsquo;on a, c&rsquo;est comme ça.</p>



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



<p class="wp-block-paragraph">OpenWebUI propose plusieurs modes de déploiement :</p>



<ul class="wp-block-list">
<li><strong>Docker</strong> : <em>Officiellement supporté et recommandé pour la plupart des utilisateurs </em>(avec plusieurs sous-catégorie alternatives de déploiement)</li>



<li><strong>Python</strong> : <em>Orienté pour les environnements faibles en ressources et pour une installation manuelle</em>
<ul class="wp-block-list">
<li>uv</li>



<li>conda</li>



<li>venv</li>
</ul>
</li>



<li><strong>Kubernetes</strong> : <em>Idéal pour les déploiements en entreprise qui nécessite une adaptabilité et ordonnancement</em>
<ul class="wp-block-list">
<li>Helm</li>
</ul>
</li>



<li><strong>Third Party</strong></li>
</ul>



<p class="wp-block-paragraph">Pour ma part, la seule chose qui m&rsquo;intéresse et pour laquelle je suis à peu près à l&rsquo;aise c&rsquo;est Python. Je vois déjà les puristes de la containerisation me rétorquer sauvagement « <strong>Pourquoi pas Docker ?</strong>« . Encore une fois et je suis désolé, je ne comprends pas l&rsquo;intérêt de Docker dans mon métier. Tant que je n&rsquo;aurai pas pleinement assimilé ou eu le besoin de l&rsquo;utilisé, je bloque. Attention, je ne dis pas que c&rsquo;est de la me*de hein ? Loin de moi l&rsquo;idée.</p>



<p class="wp-block-paragraph">Donc je partirai sur Python en environnement virtuel (venv).</p>



<p class="wp-block-paragraph">Pourquoi ce choix ? Simplement parce que RHEL utilise également Python dans une version différente et qu&rsquo;à ce jour la version 3.12 n&rsquo;est pas encore officiellement supporté par OpenWebUI&#8230; Rien que pour ça je déteste Python autant que Java. Pourquoi faire simple&#8230;</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3520_9a0c37-e4 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-pane3520_ff088c-ef"><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>Création de l&rsquo;environnement virtuel</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="wp-block-paragraph">Dans mon répertoire ollama, j&rsquo;ai créé un second répertoire openwebui.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-38"><code><strong>$ sudo mkdir -p /mnt/ollama/openwebui
$ sudo cd /mnt/ollama/openwebui/</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="620" height="66" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_0.jpg" alt="" class="wp-image-3542" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_0.jpg 620w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_0-300x32.jpg 300w" sizes="auto, (max-width: 620px) 100vw, 620px" /></figure>
</div>


<p class="wp-block-paragraph">Une fois déplacé dans le répertoire, nous créons l&rsquo;environnement virtuel <strong>venv</strong>. Original comme nom n&rsquo;est il pas ?</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-39"><code><strong>$ sudo python3 -m venv venv</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="598" height="43" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_1.jpg" alt="" class="wp-image-3543" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_1.jpg 598w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_1-300x22.jpg 300w" sizes="auto, (max-width: 598px) 100vw, 598px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3520_720aaa-b2"><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>Activation de l&rsquo;environnement virtuel</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="wp-block-paragraph">Etant toujours dans le même répertoire créé précédemment, nous allons activer notre environnement virtuel.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-40"><code><strong>$ sudo source venv/bin/activate</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="640" height="43" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_2.jpg" alt="" class="wp-image-3544" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_2.jpg 640w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_2-300x20.jpg 300w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane3520_0e4588-37"><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>Installation</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="wp-block-paragraph">Maintenant que tout est bon, il est toujours dans notre environnement virtuel de démarrer l&rsquo;installation. Cette dernière se déroulera en 3 temps.</p>



<ul class="wp-block-list">
<li>La mise à jour de pip</li>



<li>La création d&rsquo;un répertoire temporaire pour stocker les sources de l&rsquo;installation qui sont plutôt volumineuse</li>



<li>L&rsquo;installation en faisant référence à notre répertoire temporaire</li>
</ul>



<p class="wp-block-paragraph">Simple comme bonjour, et pourtant sachez que je me suis bien cassé la tête pour trouver l&rsquo;astuce du répertoire temporaire&#8230;</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-41"><code><strong>$ sudo pip install --upgrade pip 
$ sudo mkdir /mnt/ollama/tmp
$ sudo TMPDIR=/mnt/ollama/tmp pip install open-webui</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="928" height="274" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_3.jpg" alt="" class="wp-image-3545" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_3.jpg 928w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_3-300x89.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_3-768x227.jpg 768w" sizes="auto, (max-width: 928px) 100vw, 928px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="941" height="492" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_4.jpg" alt="" class="wp-image-3546" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_4.jpg 941w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_4-300x157.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_4-768x402.jpg 768w" sizes="auto, (max-width: 941px) 100vw, 941px" /></figure>
</div>


<p class="wp-block-paragraph">Lors de l&rsquo;installation si comme moi vous avez des ressources limitées, aucun respect des préconisations matériels. Je vous recommande de tuer le temps pendant facile une heure et de laisser tranquille votre bécanne. Tiens, je reparle de patience, comme de par hasard 🙂</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="556" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_004_jjf-1024x556.jpg" alt="" class="wp-image-3539" style="aspect-ratio:1.8417715344844405;width:497px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_004_jjf-1024x556.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_004_jjf-300x163.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_004_jjf-768x417.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_004_jjf.jpg 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph"><strong><em>Sans hésitez, la réponse D Jean-Pierre, ça <strong><em>sera mon dernier goulot.</em></strong> </em></strong></p>



<p class="wp-block-paragraph">Blague mise à part, 291 packages à installer avec des grosses dépendances pour certains d&rsquo;entre eux (Nvidia par exemple&#8230;). Reprenez un peu de la réponse D en attendant.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="939" height="992" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_5.jpg" alt="" class="wp-image-3548" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_5.jpg 939w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_5-284x300.jpg 284w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_5-768x811.jpg 768w" sizes="auto, (max-width: 939px) 100vw, 939px" /></figure>
</div>


<p class="wp-block-paragraph">Toujours pas terminé ? Bon ba comme on dit j&rsquo;ai nous <strong><em>« On va pas la mécher [la bouteille naturellement] »</em></strong>, terminez là et allez en chercher une nouvelle pour poursuivre la connaissance de la réponse D.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane3520_08c8ee-de"><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>Démarrage</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="wp-block-paragraph">Si vous n&rsquo;êtes pas tombé et que vous n&rsquo;êtes plus très sobre, c&rsquo;est bon signe. 🙂 Normalement, l&rsquo;installation est terminée.</p>



<p class="has-text-align-center has-theme-palette-5-background-color has-background wp-block-paragraph"><strong><mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color"><span style="text-decoration: underline;">/!\</span></mark></strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-9-color"></mark><strong><mark style="background-color:rgba(0, 0, 0, 0);color:#000000" class="has-inline-color"><span style="text-decoration: underline;">Attention :</span></mark></strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-9-color"><strong>L&rsquo;abus des bons produits et notamment d&rsquo;alcool est dangereux pour la santé.</strong> (Que l&rsquo;on n&rsquo;aille pas dire que je fasse de la publicité ou l&rsquo;apologie de l&rsquo;alcool </mark><strong><mark style="background-color:rgba(0, 0, 0, 0);color:#000000" class="has-inline-color">#loievin</mark></strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-9-color">)</mark></p>



<p class="wp-block-paragraph">Vérifions que cela fonctionne avec la première commande.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-42"><code><strong>$ sudo open-webui --help</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="940" height="362" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_1.jpg" alt="" class="wp-image-3554" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_1.jpg 940w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_1-300x116.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_1-768x296.jpg 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></figure>
</div>


<p class="wp-block-paragraph">C&rsquo;est rassurant de se dire que cela fonctionne. Pas de message d&rsquo;erreur. Il ne nous reste maintenant plus qu&rsquo;à démarrer notre service sur son interface et son port avec la commande ci-dessous.</p>



<p class="wp-block-paragraph"></p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-43"><code><strong>$ sudo open-webui serve --host 10.227.250.11 --port 8080</strong></code></pre>



<p class="wp-block-paragraph">Toutefois, il conviendra d&rsquo;autoriser les flux au niveau de l&rsquo;UTM local à notre serveur en amont. Pour cela, j&rsquo;explique dans la partie suivante Configuration comment ouvrir les flux http sur le port 8080/tcp.</p>



<p class="wp-block-paragraph">Normalement, l&rsquo;ensemble des composants sont en cours de chargement et une fois l&rsquo;ensemble chargé, vous devriez avoir dans votre CLI<sup data-fn="96e1bb31-3abc-4f7d-9141-265b48fe943e" class="fn"><a href="#96e1bb31-3abc-4f7d-9141-265b48fe943e" id="96e1bb31-3abc-4f7d-9141-265b48fe943e-link">16</a></sup> la chose suivante.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="941" height="977" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_2.jpg" alt="" class="wp-image-3555" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_2.jpg 941w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_2-289x300.jpg 289w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_2-768x797.jpg 768w" sizes="auto, (max-width: 941px) 100vw, 941px" /></figure>
</div>


<p class="wp-block-paragraph">Il est à noter que des notes d&rsquo;informations vont vite prendre le relai, ces derniers affichant l&rsquo;ensemble des requêtes HTTP.</p>
</div></div></div>
</div></div></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Si nous sommes à ce stade c&rsquo;est que tout est bon 🙂 Avant de rentrer plus en détail de l&rsquo;outil, il est nécessaire de regarder la partie Configuration. </p>



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



<p class="wp-block-paragraph">Cette partie pourrait je pense être amélioré. L&rsquo;un des points les plus complexes et de mettre en place le mode service (j&rsquo;y ai passé un temps certain&#8230;). </p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3520_d18aa8-fa 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-4 kt-pane3520_2d9a52-19"><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>Utilisateur dédié</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="wp-block-paragraph">Pour des raisons de sécurité, il convient de créer un utilisateur dédié pour notre application. Nous partons sur un compte de service et non un compte utilisateur.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-44"><code><strong>$ sudo useradd -r -s /bin/false openwebui
$ sudo chown -R openwebui:openwebui /mnt/ollama/openwebui</strong></code></pre>



<p class="wp-block-paragraph">Un petit changement de propriétaire et le tour est joué.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="842" height="43" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied.jpg" alt="" class="wp-image-3565" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied.jpg 842w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied-300x15.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied-768x39.jpg 768w" sizes="auto, (max-width: 842px) 100vw, 842px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-1 kt-pane3520_82136e-4c"><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>ParFeu</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="wp-block-paragraph">Par défaut, le port qui sera utilisé pour accéder à l&rsquo;interface web d&rsquo;OpenWebUI est 8080/tcp en http.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-45"><code><strong>$ sudo firewall-cmd --permanent --add-port=8080/tcp
$ sudo firewall-cmd --reload</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="779" height="111" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_007_fwl.jpg" alt="" class="wp-image-3551" style="aspect-ratio:7.018908698001081;width:512px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_007_fwl.jpg 779w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_007_fwl-300x43.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_007_fwl-768x109.jpg 768w" sizes="auto, (max-width: 779px) 100vw, 779px" /></figure>
</div>


<p class="wp-block-paragraph">On est d’accord que si nous souhaiterions mieux faire en termes de sécurité, il serait plus intelligent de créer la policy suivante :</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-46"><code><strong>$ sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.127.50.0/24" port port="8080" protocol="tcp" accept'
$ sudo firewall-cmd --reload</strong></code></pre>



<p class="wp-block-paragraph">Ayant un UTM&nbsp;en amont, je me permets donc de me contenter de la première solution.</p>



<p class="wp-block-paragraph">Un petit test de vérification depuis le poste source :</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="607" height="155" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_008_fwl.jpg" alt="" class="wp-image-3552" style="width:497px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_008_fwl.jpg 607w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_008_fwl-300x77.jpg 300w" sizes="auto, (max-width: 607px) 100vw, 607px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3520_4ca822-16"><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>Mode Service</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="wp-block-paragraph">Commençons par créer notre fichier de service. La difficulté que j&rsquo;ai rencontrée ici est de jouer avec l&rsquo;environnement virtuel et le service OpenWebUI à démarrer. J&rsquo;ai bien trouvé une solution de contournement à mon problème toutefois cela me laisse un gout amer car la solution ne me semble pas propre du tout.</p>



<p class="wp-block-paragraph">C&rsquo;est je pense l&rsquo;un des points qui me frustre le plus dans le monde du libre, l&rsquo;imbrication de solution tierce et dans un sens une non-standardisation des méthodes d&rsquo;implémentations. Bien que je doive le reconnaitre c&rsquo;est ce qui fait tout son charme. Je t&rsquo;aime moi non plus. On se croirait dans Andromaque&#8230;</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-47"><code><strong>$ sudo vim /etc/systemd/system/openwebui.service</strong></code></pre>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>Regardons d&rsquo;un peu plus près le contenu de ce fichier.<br><br>Nous retrouvons la description de notre service ainsi que son ordre de démarrage. OpenWebUI étant intimement lié à Ollama, il convient donc de définir ce dernier comme service requis.<br><br>Au niveau du service, nous sommes sur un type <strong>simple</strong>, le service étant exécuter par l&rsquo;utilisateur dédié <strong>openwebui</strong>. Il peut être acceptable bien que s&rsquo;est sacrément cochon d&rsquo;utiliser le compte root. Mais bon nous voulons éviter de faire étalage de notre amateurisme.<br><br><strong>WorkingDirectory</strong> représente le répertoire de travail dans lequel le programme sera exécuté.<br><strong>Environment</strong> permet de définir les variables d&rsquo;environnement.<br><br><strong>ExecStart</strong> permet d&rsquo;exécuter la commande. Dans mon cas, j&rsquo;en ai deux dont une qui est commentée (et qui ne fonctionne pas). <br><br><strong>Restart</strong> permet de définir le rédémarrage automatique dans le cas où le service viendrait à crash par exemple.<br><strong>RestartSec</strong> défini le délai de redémarrage en seconde.<br><br>Et pour finir, <strong>WantedBy</strong> pour spécifier le mode de service. Ici cela équivaut au mode normal.<br><br></td><td><strong><code>[Unit] </code><br><code>Description=Open WebUI Service</code><br><code>After=network.target ollama.service Requires=ollama.service </code><br><br><code>[Service] </code><br><code>Type=simple </code><br><code>User=openwebui</code><br><br><code>WorkingDirectory=/mnt/ollama/openwebui Environment="TMPDIR=/mnt/ollama/tmp" Environment="PATH=/mnt/ollama/openwebui/venv/bin:/usr/bin:/usr/sbin"</code><br><br><code>#ExecStart=/mnt/ollama/openwebui/venv/bin/open-webui serve --host 10.227.250.11 --port 8080 ExecStart=/bin/bash -c 'source /mnt/ollama/openwebui/venv/bin/activate &amp;&amp; open-webui serve --host 10.227.250.11 --port 8080'</code><br><br><code>Restart=always</code><br><code>RestartSec=5</code><br><br><code>[Install]</code><br><code>WantedBy=multi-user.target</code></strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Comme nous venons de créer un nouveau service, il sera nécessaire de recharger l&rsquo;ensemble du systemctl pour intégrer le nouveau service à la liste des services disponible. Après, j&rsquo;ai envie de dire c&rsquo;est le schéma classique d&rsquo;activation, démarrage et vérification.</p>



<p class="wp-block-paragraph"></p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-48"><code><strong>$ sudo systemctl daemon-reload
$ sudo systemctl enable openwebui
$ sudo systemctl start openwebui
$ sudo systemctl status openwebui</strong></code></pre>



<figure class="wp-block-table aligncenter"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td><img loading="lazy" decoding="async" width="550" height="272" class="wp-image-3561" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_009_status.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_009_status.jpg 939w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_009_status-300x149.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_009_status-768x380.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td><td><img loading="lazy" decoding="async" width="550" height="122" class="wp-image-3566" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied_1.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied_1.jpg 1896w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied_1-300x67.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied_1-1024x227.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied_1-768x171.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied_1-1536x341.jpg 1536w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>
</div></div></div>
</div></div></div>



<h4 class="wp-block-heading">Nginx, HTTPS</h4>



<p class="wp-block-paragraph">Je suis partagé quant à la rédaction de cette sous partie. Oui il est important de sécuriser l&rsquo;accès à l&rsquo;interface Web, mais j&rsquo;ai peur d&rsquo;être hors sujet et d&rsquo;alourdir l&rsquo;article. Mais d&rsquo;un autre côté, je ne veux pas non plus bâcler la chose&#8230; Encore un pu**n de choix cornélien&#8230;</p>



<p class="wp-block-paragraph">Bref, je vais faire au plus simple et si besoin écrirai un billet sur Nginx.</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3520_66384a-95 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-pane3520_8bd374-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"><strong>Installation</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="wp-block-paragraph">L&rsquo;installation et activation du service, je passe mon tour. </p>



<p class="wp-block-paragraph"></p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-49"><code><strong>$ sudo dnf install nginx
$ sudo systemctl enable nginx
$ sudo systemctl start nginx</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="939" height="450" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_0.jpg" alt="" class="wp-image-3573" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_0.jpg 939w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_0-300x144.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_0-768x368.jpg 768w" sizes="auto, (max-width: 939px) 100vw, 939px" /></figure>
</div>


<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="938" height="83" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_1.jpg" alt="" class="wp-image-3572" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_1.jpg 938w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_1-300x27.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_1-768x68.jpg 768w" sizes="auto, (max-width: 938px) 100vw, 938px" /></figure>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3520_228265-dc"><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>Certificats</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="wp-block-paragraph">Là encore une fois je rencontre un petit problème. Je n&rsquo;ai pas de certificat public que je pourrais utiliser, ma topologie réseau ne me permet pas d&rsquo;utiliser un certificat Let&rsquo;s Encrypt et sans vouloir spoiler je n&rsquo;ai pas envie de me prendre la tête. Donc ça va finir avec un bon vieux certificat autosigné 🙂</p>



<p class="wp-block-paragraph">La génération n&rsquo;est pas bien compliquée et si besoin, j&rsquo;ai déjà rédigé <a href="https://erwanguillemard.com/linux-certificats/">un article</a> sur le sujet.</p>



<p class="wp-block-paragraph">Créons le répertoire qui va contenir nos éléments de sécurité :</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-50"><code><strong>$ sudo mkdir -p /etc/nginx/ssl</strong></code></pre>



<p class="wp-block-paragraph">Générons notre certificat :</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-51"><code><strong>$ sudo openssl req req -x509 -nodes -days 365 \
-newkey rsa:2048 \
-keyout /etc/nginx/ssl/openwebui.key \
-out /etc/nginx/ssl/openwebui.crt</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="940" height="89" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_2.jpg" alt="" class="wp-image-3574" style="aspect-ratio:10.562461026813553;width:771px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_2.jpg 940w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_2-300x28.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_2-768x73.jpg 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="778" height="147" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_3.jpg" alt="" class="wp-image-3575" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_3.jpg 778w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_3-300x57.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_3-768x145.jpg 768w" sizes="auto, (max-width: 778px) 100vw, 778px" /></figure>
</div>


<p class="wp-block-paragraph"></p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane3520_a1b4ed-16"><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>Configuration</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="wp-block-paragraph">Créons et éditons notre fichier de configuration. Je prendrai le temps d&rsquo;expliquer l&rsquo;intégralité du fichier de configuration.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-52"><code><strong>$ sudo vim /etc/nginx/conf.d/openwebui.conf</strong></code></pre>



<pre class="wp-block-code"><code>server {
    listen 80;
    server_name 10.227.250.11;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name 10.227.250.11;

    ssl_certificate /etc/nginx/ssl/openwebui.crt;
    ssl_certificate_key /etc/nginx/ssl/openwebui.key;

    # TLS sécurisé
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;

    # sécurité headers
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    # taille upload
    client_max_body_size 100M;

    # compression
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml;

    location / {

        proxy_pass http://10.227.250.11:8080;

        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket support (important OpenWebUI)
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_read_timeout 3600;
        proxy_send_timeout 3600;
    }
}</code></pre>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>La première section permet de réaliser la redirection du protocole HTTP vers HTTPS de manière permanente. Ainsi si je contacte l&rsquo;url http://10.227.250.11, je serais automatiquement redirigé vers https://10.227.254.11.</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="211" class="wp-image-3580" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_021_nginx.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_021_nginx.jpg 344w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_021_nginx-300x115.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr><tr><td>Le second bloc indique que nous écoutons sur le port 443 sur l&rsquo;interface 10.227.250.11. L&#8217;emplacement des fichiers contenant la clé privée ainsi que le certificat sont spécifiés pour activer la couche de sécurité (j&rsquo;ai l&rsquo;impression d&rsquo;enfoncer des portes ouvertes&#8230;). J&rsquo;indique qu&rsquo;elles sont les versions des protocoles TLS<sup data-fn="1a3ccfdd-7fad-428c-9f9a-15401188579d" class="fn"><a href="#1a3ccfdd-7fad-428c-9f9a-15401188579d" id="1a3ccfdd-7fad-428c-9f9a-15401188579d-link">17</a></sup> autorisées et laisse le serveur choisir le chiffrement le plus sûr.<br>Côté en-tête, j&rsquo;ai repris les suggestions de sécurité implémentée pour ITOP. Soit la restriction de mettre le site en iframe externe, de restreindre le navigateur à deviner le tye MIME qui est utilisé et surtout d&rsquo;activer la protection anti-cross-site scripting. Niveau upload, j&rsquo;ai vu large et j&rsquo;ai autorisé le téléversement de fichier de 100 Mio.<br>Côté performance, j&rsquo;ai activé la compression des flux pour optimiser un peu les performances réseaux.</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="446" class="wp-image-3581" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_022_nginx.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_022_nginx.jpg 651w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_022_nginx-300x243.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr><tr><td>Le troisième bloc concerne la partie Reverse Proxy.<br>Toutes les requêtes qui sont envoyées sur https://10.227.250.11 sont redirigées vers le port 8080.<br>Concernant les en-têtes il est nécessaire d&rsquo;utiliser les websockets car seront transmis l&rsquo;ip du client, le protocole utilisé et le NDD<sup data-fn="6f19f21f-54c7-433f-8a76-3c3d830f4eda" class="fn"><a href="#6f19f21f-54c7-433f-8a76-3c3d830f4eda" id="6f19f21f-54c7-433f-8a76-3c3d830f4eda-link">18</a></sup> ou l&rsquo;IP demandé.<br>Les deux lignes suivantes permettent de réaliser la jonction entre nginx et les websockets.</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="381" class="wp-image-3582" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_023_nginx.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_023_nginx.jpg 530w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_023_nginx-300x208.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Une fois la configuration faite, il est important de réaliser un petit contrôle de notre petit fichier afin de s&rsquo;assurer que ce dernier ne comporte pas d&rsquo;erreur. </p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-53"><code><strong>$ sudo nginx -t </strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="940" height="106" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_4.jpg" alt="" class="wp-image-3578" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_4.jpg 940w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_4-300x34.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_4-768x87.jpg 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></figure>
</div>


<p class="wp-block-paragraph">Il faudra penser à recharger la configuration et hop le tour est joué.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane3520_738fe8-6a"><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>Sécurité</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="wp-block-paragraph">Nous souhaitons toujours publier notre interface web en HTTPS. Donc il va falloir jouer avec nos UTMs !</p>



<p class="wp-block-paragraph">Sur le plan interne, autorisons nos flux https :</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-54"><code><strong>$ sudo firewall-cmd --permanent --add-port=443/tcp
$ sudo firewall-cmd --reload</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="84" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_5.jpg" alt="" class="wp-image-3576" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_5.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_5-300x33.jpg 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>
</div>


<p class="wp-block-paragraph">Nous pourrions comme énoncé plus haut pour le protocole HTTP être bien plus rigoureux dans notre règle de sécurité. Mais encore une fois ayant un UTM en amont, j&rsquo;accepte le risque. Juste ne pas oublier de créer la règle sinon vous passez pour un c*n.</p>



<p class="wp-block-paragraph">Si nous sommes joueurs, nous pouvons essayer de joindre directement notre interface web depuis notre navigateur. Normalement vous devez vous prendre dans les dents</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="606" height="230" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_7.jpg" alt="" class="wp-image-3569" style="aspect-ratio:2.634850493445279;width:490px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_7.jpg 606w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_7-300x114.jpg 300w" sizes="auto, (max-width: 606px) 100vw, 606px" /></figure>
</div>


<p class="wp-block-paragraph">Ca vous fait la b**e hein ? Je vous rassure je me suis pris la même rouste. J&rsquo;ai oublié d&rsquo;autoriser le contexte de mon SELinux pour autoriser les services http à accéder aux réseaux 😀</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-55"><code><strong>$ sudo setsebool -P httpd_can_network_connect 1</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="731" height="23" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_6.jpg" alt="" class="wp-image-3577" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_6.jpg 731w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_6-300x9.jpg 300w" sizes="auto, (max-width: 731px) 100vw, 731px" /></figure>
</div>


<p class="wp-block-paragraph">Un petit F5 et hop c&rsquo;est tout bon &lt;3</p>
</div></div></div>
</div></div></div>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>Normalement avec toutes nos actions, nous devons joindre notre interface web depuis un navigateur de manière sécurisée (hormis l&rsquo;erreur liée à notre certificat autosigné).<br><br>Allez, on passe à la partie démonstration ?</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="355" class="wp-image-3571" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_8.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_8.jpg 958w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_8-300x194.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_8-768x496.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



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



<p class="wp-block-paragraph">Pour le test, j&rsquo;ai décidé de changer un peu de format et de passer par des formats vidéo. Surtout que dans ce cas précis, cela évitera de mon côté de blablater. Cependant, ce n&rsquo;est pas pour autant que le travail est plus simple ou plus rapide.</p>



<p class="wp-block-paragraph">J&rsquo;ai également pris le parti de commenter mes enregistrements et vidéos en anglais (oui même avec mon anglais aussi rouillé qu&rsquo;une vieille cantine de bidasse, si vous voulez <a href="https://www.youtube.com/watch?v=sufXl_PpKAk">trikitez mes vidéos</a> je vous laisse ce plaisir 🙂 ).</p>



<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="APPS   OpenWebUI" width="720" height="405" src="https://www.youtube.com/embed/UQW_L6yub3g?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>



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



<p class="wp-block-paragraph">La combinaison des solutions OpenWebUI et Ollama fonctionne à la perfection. Si nous associons le côté multimodèle d&rsquo;Ollama et son fonctionnement hybride avec la puissance de l&rsquo;interface OpenWebUI il est alors possible de fournir une solution complète à destination des utilisateurs.</p>



<p class="wp-block-paragraph">Toutefois, je reste profondément frustré pour l&rsquo;instant. L&rsquo;ajout de la couche OpenWebUI vient rallentir et allourdir l&rsquo;usage d&rsquo;Ollama. D&rsquo;un autre côté, est ce vraiment pertinent comme remarque à savoir que je ne réponds à aucun prérequis matériel ? C&rsquo;est là où le bât blesse encore une fois. Cela fonctionne mais à quel prix ?</p>



<p class="wp-block-paragraph">Il est également important de prendre en compte les couts annexes et variables (comme au hasard, la consommation électrique, refroidissement&#8230;) périphériques à l&rsquo;usage de l&rsquo;IA. Nous parlons du réchauffement climatique, de limiter nos émissions de carbone et j&rsquo;en passe pour d&rsquo;un autre côté user de l&rsquo;IA à tort ou à raison. Je ne tiens pas à lancer un débat climatosceptique ou sur est-ce bien ou non d&rsquo;utiliser l&rsquo;IA.</p>



<p class="wp-block-paragraph">Je pense simplement qu&rsquo;il y a encore beaucoup à faire pour accorder en synergie la puissance et l&rsquo;usage de l&rsquo;IA avec les convictions écologiques et environnementales. Si nous être vivant allons avoir chaud, que dire des CPUs/GPUs ? <strong><em>#tousdanslemêmebateau</em></strong> Bref, un moratoire serait nécessaire en somme. Mais je laisse ça au pisse violon que je suis.</p>



<p class="wp-block-paragraph">Je reste convaincu de la fiabilité et viabilité de la solution dans un milieu professionnel, malheureusement, pour moi je préfère me passer de l&rsquo;interface Web. Donc en d&rsquo;autres termes, je vais rollback mon snapshot (ou restaurer mon backup au choix). Après tout, je peux toujours utiliser l&rsquo;interface CLI directement depuis une session SSH<sup data-fn="a61fa4e1-f1b4-4118-a125-8ff2b30744bb" class="fn"><a href="#a61fa4e1-f1b4-4118-a125-8ff2b30744bb" id="a61fa4e1-f1b4-4118-a125-8ff2b30744bb-link">19</a></sup> ? Oui mais pas que.</p>



<p class="has-text-align-center wp-block-paragraph"><strong>Pourquoi ne pas faire une petite interface qui exploite l&rsquo;API Ollama ?</strong></p>



<p class="wp-block-paragraph">Ah nous y voila ! Ca sent le projet long comme un jour sans pain encore en approche. Blague mis à part, peut être que cela n&rsquo;aboutira pas. Mais j&rsquo;ai envie de pousser relativement loin la solution Ollama.</p>



<p class="wp-block-paragraph">Pour faire vraiment simple. OpenWebUI c&rsquo;est supercool mais il faut les ressources pour pouvoir l&rsquo;utiliser pleinement pour ne pas souffrir d&rsquo;une grande frustration. 🙂</p>



<p class="wp-block-paragraph">Le mot de la fin :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Je branche OpenWebUI sur une prise RJ45 en camembert ! Je contre avec un lama qui compile une girafe. Vous ne pouvez pas, il y a Sandrine ROUSSEAU au festival de la tête de veau.</em></p>
<cite>Erwan GUILLEMARD</cite></blockquote>



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



<ul class="wp-block-list">
<li><a href="https://docs.openwebui.com/getting-started/">OpenWebUI : Quick Started</a></li>
</ul>


<ol class="wp-block-footnotes"><li id="9b4b7116-7da7-4c05-943e-ac072573b13f"><strong>LLM : </strong>Large Language Models <a href="#9b4b7116-7da7-4c05-943e-ac072573b13f-link" aria-label="Aller à la note de bas de page 1">↩︎</a></li><li id="f36cb89d-8ac6-4ed0-8df5-7d578d4680c4"><strong>IA :</strong> Intelligence Artificielle <a href="#f36cb89d-8ac6-4ed0-8df5-7d578d4680c4-link" aria-label="Aller à la note de bas de page 2">↩︎</a></li><li id="9e902093-392b-4860-a9f8-d2c28cf28686"><strong>RHEL :</strong> RedHat Entreprise Linux <a href="#9e902093-392b-4860-a9f8-d2c28cf28686-link" aria-label="Aller à la note de bas de page 3">↩︎</a></li><li id="4a15f514-bc25-45dc-8c12-3f5fd10c286d"><strong>DSI :</strong> Direction des Services Informatiques <a href="#4a15f514-bc25-45dc-8c12-3f5fd10c286d-link" aria-label="Aller à la note de bas de page 4">↩︎</a></li><li id="63b8e4f1-84bc-47ad-8afa-7dae59217921"><strong>CPU :</strong> Central Processing Unit <a href="#63b8e4f1-84bc-47ad-8afa-7dae59217921-link" aria-label="Aller à la note de bas de page 5">↩︎</a></li><li id="f958a01e-8b83-4fc9-a592-006e9651956c"><strong>RAM :</strong> Random Access Memory <a href="#f958a01e-8b83-4fc9-a592-006e9651956c-link" aria-label="Aller à la note de bas de page 6">↩︎</a></li><li id="8f6e0338-719e-4456-808e-82e0a17b70ea"><strong>SSD :</strong> Solid State Drive <a href="#8f6e0338-719e-4456-808e-82e0a17b70ea-link" aria-label="Aller à la note de bas de page 7">↩︎</a></li><li id="57be53ba-9128-49e7-ae7a-c337f01cf69e"><strong>GPU :</strong> Graphics Processing Unit <a href="#57be53ba-9128-49e7-ae7a-c337f01cf69e-link" aria-label="Aller à la note de bas de page 8">↩︎</a></li><li id="f4993b7e-0f63-4b56-886c-b4e26648314b"><strong>HTTP :</strong> Hypertext Transfer Protocol <a href="#f4993b7e-0f63-4b56-886c-b4e26648314b-link" aria-label="Aller à la note de bas de page 9">↩︎</a></li><li id="1d2044d0-2a6b-4f6c-9865-c8cded2e72e1"><strong>HTTPS :</strong> Hypertext Transfer Protocol Secure <a href="#1d2044d0-2a6b-4f6c-9865-c8cded2e72e1-link" aria-label="Aller à la note de bas de page 10">↩︎</a></li><li id="688876c0-5948-48bf-baaf-3d493e2e5c01"><strong>SE :</strong> Système d&rsquo;Exploitation <a href="#688876c0-5948-48bf-baaf-3d493e2e5c01-link" aria-label="Aller à la note de bas de page 11">↩︎</a></li><li id="13f6c481-ca7e-4e73-875d-cf307bad64ec"><strong>UTM :</strong> Unified Threat Management <a href="#13f6c481-ca7e-4e73-875d-cf307bad64ec-link" aria-label="Aller à la note de bas de page 12">↩︎</a></li><li id="ac43ad3e-9b07-4981-8114-d187d3cf6dbf"><strong>WAN :</strong> Wide Area Network <a href="#ac43ad3e-9b07-4981-8114-d187d3cf6dbf-link" aria-label="Aller à la note de bas de page 13">↩︎</a></li><li id="103fd0e8-cd60-41ff-b80a-9c51d9c20b76"><strong>DMZ : </strong>DeMilitarized Zone <a href="#103fd0e8-cd60-41ff-b80a-9c51d9c20b76-link" aria-label="Aller à la note de bas de page 14">↩︎</a></li><li id="2f21ddb8-be62-4029-92fc-283d894d896c"><strong>VM :</strong> Virtual Machine <a href="#2f21ddb8-be62-4029-92fc-283d894d896c-link" aria-label="Aller à la note de bas de page 15">↩︎</a></li><li id="96e1bb31-3abc-4f7d-9141-265b48fe943e"><strong>CLI : </strong>Command Line Interface <a href="#96e1bb31-3abc-4f7d-9141-265b48fe943e-link" aria-label="Aller à la note de bas de page 16">↩︎</a></li><li id="1a3ccfdd-7fad-428c-9f9a-15401188579d"><strong>TLS :</strong> Transport Layer Security <a href="#1a3ccfdd-7fad-428c-9f9a-15401188579d-link" aria-label="Aller à la note de bas de page 17">↩︎</a></li><li id="6f19f21f-54c7-433f-8a76-3c3d830f4eda"><strong>NDD :</strong> Nom De Domaine <a href="#6f19f21f-54c7-433f-8a76-3c3d830f4eda-link" aria-label="Aller à la note de bas de page 18">↩︎</a></li><li id="a61fa4e1-f1b4-4118-a125-8ff2b30744bb"><strong>SSH :</strong> Secure SHell <a href="#a61fa4e1-f1b4-4118-a125-8ff2b30744bb-link" aria-label="Aller à la note de bas de page 19">↩︎</a></li></ol>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Apps &#8211; OLLAMA</title>
		<link>https://erwanguillemard.com/apps-ollama/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Sat, 18 Apr 2026 11:32:22 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[IA]]></category>
		<category><![CDATA[OLLAMA]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=3440</guid>

					<description><![CDATA[Pour ce nouveau billet, je pense que commencer par une définition est une bonne chose. Robot : nom masculin, du tchèque robota, travail forcé, mot créé en 1920 par K. Capek. Dans les œuvres de science-fiction, machine à l&#8217;aspect humain, capable de se mouvoir, d&#8217;exécuter des opérations, de parler. Appareil automatique capable de manipuler des...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pour ce nouveau billet, je pense que commencer par une définition est une bonne chose.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-small-font-size wp-block-paragraph"><strong>Robot :</strong> nom masculin, du tchèque <strong>robota</strong>, travail forcé, mot créé en 1920 par K. Capek.</p>



<p class="has-small-font-size wp-block-paragraph"><em>Dans les œuvres de science-fiction, machine à l&rsquo;aspect humain, capable de se mouvoir, d&rsquo;exécuter des opérations, de parler.</em></p>



<p class="has-small-font-size wp-block-paragraph"><em>Appareil automatique capable de manipuler des objets ou d&rsquo;exécuter des opérations selon un programme fixe, modifiable ou adaptable.</em></p>
<cite><a href="https://www.larousse.fr/dictionnaires/francais/robot/69647">Définition Larousse</a></cite></blockquote>



<p class="wp-block-paragraph">Au vu du titre de cet article et de la définition posée précédemment, difficile de ne pas deviner le sujet qui va être abordé.</p>



<p class="wp-block-paragraph">Hé oui, moi le puriste, je vais parler d&rsquo;IA<sup data-fn="cfefe833-a7a4-4019-87c1-c684487526cf" class="fn"><a href="#cfefe833-a7a4-4019-87c1-c684487526cf" id="cfefe833-a7a4-4019-87c1-c684487526cf-link">1</a></sup> et pire que cela l&rsquo;utiliser de manière récurrente. Je me sens en ce moment comme le capitaine Haddock face au lama dans l&rsquo;œuvre d&rsquo;Hergé, Tintin et le temple du soleil.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="504" height="267" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_001_Tintin.jpg" alt="" class="wp-image-3444" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_001_Tintin.jpg 504w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_001_Tintin-300x159.jpg 300w" sizes="auto, (max-width: 504px) 100vw, 504px" /></figure>
</div>


<p class="wp-block-paragraph">Naturellement, au vu de mes précédents écrits, c&rsquo;est vous lecteurs et l&rsquo;ensemble des solutions IA qui me crachent dessus. C&rsquo;est l&rsquo;arroseur arrosé en somme, moi qui ne voulais pas entendre parler de ça&#8230;</p>



<p class="has-text-align-center wp-block-paragraph"><strong>Mais alors pourquoi un tel revirement de situation M&rsquo;sieur GUILLEMARD ?</strong></p>



<p class="wp-block-paragraph">Je pense qu&rsquo;il faut vivre avec son temps et ignorer cet outil technologique serait signer mon arrêt de mon mort d&rsquo;ici quelques années et devenir un être <strong><em>never been</em></strong> à défaut d&rsquo;<strong><em>has been</em></strong>&#8230;</p>



<p class="has-text-align-center wp-block-paragraph"><strong>Après tout <em><mark style="background-color:rgba(0, 0, 0, 0);color:#fe0404" class="has-inline-color">Errare humanum est, perseverare diabolicum</mark></em></strong><sup data-fn="aadcbef0-7f66-4bcf-bdef-699e3c85609a" class="fn"><a href="#aadcbef0-7f66-4bcf-bdef-699e3c85609a" id="aadcbef0-7f66-4bcf-bdef-699e3c85609a-link">2</a></sup><strong> non ?</strong></p>





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



<p class="wp-block-paragraph">J&rsquo;ai pris le parti d&rsquo;être méfiant vis à vis des outils d&rsquo;IA en ligne gratuit ou du moins libre d&rsquo;utilisation.</p>



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



<li>Gemini</li>



<li>Copilot</li>



<li>Claude</li>



<li>&#8230;</li>
</ul>



<p class="wp-block-paragraph">Je ne me mouille pas trop dans les moteurs d&rsquo;IA&#8230;</p>



<p class="wp-block-paragraph">Dire que je n&rsquo;ai jamais utilisé l&rsquo;un de ces moteurs serait me parjurer et il faut reconnaitre qu&rsquo;il y a un côté pratique. Difficile une fois avoir gouter à la simplicité pour ne pas l&rsquo;utiliser à tout va pour tout et rien. C&rsquo;est là pour moi le piège de la pauvreté intellectuelle. Comme toutes les bonnes choses il faut savoir ne pas en abuser.</p>



<p class="wp-block-paragraph">En dehors de l&rsquo;aspect social et sociétal qui me préoccupe tant, se pose la question des données saisies dans le moteur de recherche ou plutôt de prompt.</p>



<ul class="wp-block-list">
<li>Que deviennent les données saisies ?</li>



<li>Que deviennent les données retournées ?</li>



<li>Combien de temps sont conservés ces données ?</li>



<li>A qui profitent ces données ?</li>



<li>Qui sur surveillent les données ?</li>
</ul>



<p class="wp-block-paragraph">Cela fait un bon nombre de question non ? Surtout qu&rsquo;un grand nombre des acteurs de l&rsquo;IA sont aux US, Chine etc avec une législation bien singulière. Qui de nos jours lis encore les CGUs<sup data-fn="b41451ff-b3b4-4f38-bb68-9645125a745a" class="fn"><a href="#b41451ff-b3b4-4f38-bb68-9645125a745a" id="b41451ff-b3b4-4f38-bb68-9645125a745a-link">3</a></sup> (et qui les a déjà lus) ?</p>



<p class="wp-block-paragraph">C&rsquo;est ainsi que grâce à mon directeur j&rsquo;ai découvert la solution OLLAMA. Solution open-source qui exécute des modèles d&rsquo;intelligence artificielle (aussi appelé LLM<sup data-fn="1aad26f0-eec5-4a0f-8e20-fdd248a35c69" class="fn"><a href="#1aad26f0-eec5-4a0f-8e20-fdd248a35c69" id="1aad26f0-eec5-4a0f-8e20-fdd248a35c69-link">4</a></sup>) localement. Tout de suite, le projet m&rsquo;a séduit et je me suis demandé</p>



<p class="has-text-align-center wp-block-paragraph"><strong>Et pourquoi pas ? </strong></p>



<p class="wp-block-paragraph">Dans le pire des cas, je mourrai moins c*n ce soir comme dirait un philosophe du cercle familial.</p>



<p class="wp-block-paragraph">Naturellement, j&rsquo;ai choisi d&rsquo;user de OLLAMA sur ma distribution favorite RockyLinux. L&rsquo;environnement a été préalablement durci.</p>



<p class="wp-block-paragraph">On se lance dans la théorie puis dans la pratique mes petits Lamas ?</p>



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



<ul class="wp-block-list">
<li><strong>SE :</strong>
<ul class="wp-block-list">
<li>Rocky Linux 9.x et version ultérieures (pour ma part ça sera du 10.x)</li>



<li>macOS</li>



<li>Windows</li>
</ul>
</li>



<li><strong>Apps :&nbsp;</strong>
<ul class="wp-block-list">
<li>Ollama</li>
</ul>
</li>



<li><strong>Autres :</strong>
<ul class="wp-block-list">
<li>GPU<sup data-fn="fdf3a5b9-4253-464d-a09e-8fb86b58314e" class="fn"><a href="#fdf3a5b9-4253-464d-a09e-8fb86b58314e" id="fdf3a5b9-4253-464d-a09e-8fb86b58314e-link">5</a></sup></li>



<li>Minimum 4 CPU<sup data-fn="73029218-b1cc-46cd-b970-647ebf9d8979" class="fn"><a href="#73029218-b1cc-46cd-b970-647ebf9d8979" id="73029218-b1cc-46cd-b970-647ebf9d8979-link">6</a></sup></li>



<li>Stockage rapide (SSD<sup data-fn="a37422d2-85b9-4b20-aaed-ed832709d897" class="fn"><a href="#a37422d2-85b9-4b20-aaed-ed832709d897" id="a37422d2-85b9-4b20-aaed-ed832709d897-link">7</a></sup> ou Nvme)</li>
</ul>
</li>
</ul>



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



<p class="wp-block-paragraph">Je vais essayer d&rsquo;être le moins rassoir possible. Toutefois et encore il est nécessaire d&rsquo;où nous partons pour en être là maintenant avec l&rsquo;IA.</p>



<h3 class="wp-block-heading">Un peu d&rsquo;histoire</h3>



<p class="wp-block-paragraph">La notion d&rsquo;intelligence artificielle vient de loin dans notre histoire, puisque l&rsquo;homme depuis l&rsquo;antiquité rêve d&rsquo;objets animés intelligents qui pourraient répondre à ces besoins.</p>



<p class="wp-block-paragraph">Ce qui est fascinant ce trouve dans les différentes cultures à travers les âges. Que ce soit :</p>



<ul class="wp-block-list">
<li>Les <a href="https://fr.wikipedia.org/wiki/H%C3%A9pha%C3%AFstos">automates d&rsquo;Héphaïstos</a> dans la mythologie grecque</li>



<li>La tentation de créé l&rsquo;Homme servi par l&rsquo;alchimie aux moyen âge comme la science Talkim du grand savant islamique <a href="https://fr.wikipedia.org/wiki/Jabir_ibn_Hayyan">Jabir ibn Hayyan</a> (Geber en latin), des <a href="https://fr.wikipedia.org/wiki/Homoncule_(alchimie)">homoculus</a> par le médecin suisse de conviction chrétienne <a href="https://fr.wikipedia.org/wiki/Paracelse">Paracelse</a> qui s&rsquo;inspirera des travaux de <a href="https://fr.wikipedia.org/wiki/Zosime_de_Panopolis">Zosime de Panopolis</a> sans oublier l&rsquo;un des plus connue de tous ces automates, le Golem d&rsquo;argile présent dans le Talmud du judaïsme, créé par le rabbin Maharal pour protéger la communauté juive de Prague face aux multiples pogroms (j&rsquo;ai d&rsquo;ailleurs eu la possibilité de visiter le cimetière juif de Prague et de comprendre tout cela).</li>



<li>Plus tard, nous retrouverons des œuvres telles que
<ul class="wp-block-list">
<li><a href="https://fr.wikipedia.org/wiki/Les_Aventures_de_Pinocchio">Les Aventures de Pinocchio</a> de <a href="https://fr.wikipedia.org/wiki/Carlo_Collodi">Carlo Collodi</a> avant d&rsquo;être adapté en dessin animé par Disney</li>



<li><a href="https://fr.wikipedia.org/wiki/Frankenstein_ou_le_Prom%C3%A9th%C3%A9e_moderne">Frankenstein</a> de <a href="https://fr.wikipedia.org/wiki/Mary_Shelley">Mary Shelley</a></li>



<li>Ou encore <a href="https://fr.wikipedia.org/wiki/Deep_Blue">Deep Blue</a> qui viendra à bout de <a href="https://fr.wikipedia.org/wiki/Garry_Kasparov">Garry Kasparov</a> aux échecs.</li>
</ul>
</li>
</ul>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>Bref, tout cela pour dire que depuis l&rsquo;origine de l&rsquo;humanité, nous Homme recherchons à créer des objets autonomes et intelligents à notre services. Pour de multiples raisons, défensives, assistanat etc. Le plus troublant, cette pensée de création pourtant contre religieuse et présente dans toutes les cultures et religions portées par ces savants et lettrés (et ça, voyez-vous je trouve ça beau, très beau).</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="650" height="867" class="wp-image-3481" style="width: 650px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_GolemPrague_EGU-scaled.jpg" alt="Kafka &amp; Prague Golem" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_GolemPrague_EGU-scaled.jpg 1920w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_GolemPrague_EGU-225x300.jpg 225w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_GolemPrague_EGU-768x1024.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_GolemPrague_EGU-1152x1536.jpg 1152w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_GolemPrague_EGU-1536x2048.jpg 1536w" sizes="auto, (max-width: 650px) 100vw, 650px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Enfin, il faudra attendre le XXème siècle et l&rsquo;arrivée des premiers ordinateur programmable pour que l&rsquo;IA se développe pleinement.</p>



<p class="wp-block-paragraph">C&rsquo;est le pionnier et j&rsquo;oserai dire le père de l&rsquo;IA John McCarthy qui ouvre la voie, notamment par cette citation :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>C&rsquo;est la science et l&rsquo;ingénierie de la fabrication de machines intelligentes, en particulier de programmes informatiques intelligents. Elle est liée à la tâche similaire qui consiste à utiliser des ordinateurs pour comprendre l&rsquo;intelligence humaine, mais l&rsquo;IA ne doit pas se limiter aux méthodes qui sont biologiquement observables.</em></p>
<cite>John McCarthy &#8211; <a href="https://fr.wikipedia.org/wiki/Intelligence_artificielle">Wikipédia</a></cite></blockquote>



<p class="wp-block-paragraph">Le sujet étant réellement complexe, il est difficile de concrétiser et de répondre aux attentes des investissements privés et étatiques durant la période 70 à 80. Ce qui vaudra un ralentissement dans la rechercher et la montée en puissance de l&rsquo;IA que nous connaissons ce jour en 2026. Et pourtant les théories et grands principes mathématiques et logiques sont établis et adopté par la DARPA<sup data-fn="551f4327-d659-4f5e-aa79-e901800f9a6f" class="fn"><a href="#551f4327-d659-4f5e-aa79-e901800f9a6f" id="551f4327-d659-4f5e-aa79-e901800f9a6f-link">8</a></sup>. C&rsquo;est ainsi que s&rsquo;affronte deux grands systèmes :</p>



<p class="has-text-align-center wp-block-paragraph"><strong>Le système logiciste <em>VS</em> Le système neuronale</strong></p>



<p class="wp-block-paragraph">C&rsquo;est en 2010, que l&rsquo;IA fait réellement son entrée dans nos vies du quotidien et dans les différents secteurs d&rsquo;activités.</p>



<p class="wp-block-paragraph">Pour entrer davantage dans le détail je vous invite à lire la page wikipédia (cf les sources). J&rsquo;ai promis de faire court. 🙂</p>



<h3 class="wp-block-heading">Les modèles d&rsquo;IA</h3>



<p class="wp-block-paragraph">Les modèles d&rsquo;IA, c&rsquo;est un peu comme un oignon, il y plusieurs couches.</p>



<p class="wp-block-paragraph">Déjà il est important de dissocier le Machine Learning du Deep Learning.</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3440_904b9a-45 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-pane3440_b2140d-05"><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>Machine Learning</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"><div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="954" height="252" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_MLearning.jpg" alt="" class="wp-image-3494" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_MLearning.jpg 954w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_MLearning-300x79.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_MLearning-768x203.jpg 768w" sizes="auto, (max-width: 954px) 100vw, 954px" /></figure>
</div>


<p class="wp-block-paragraph">Le process pourrait se décrire de la manière suivante :</p>



<ul class="wp-block-list">
<li><strong><span style="text-decoration: underline;">Phase 1 :</span></strong> Identifier les mots clés fournit en entrée les plus pertinents afin de préparer ces derniers à être analysé. Nous parlons généralement de datasets.</li>



<li><strong><span style="text-decoration: underline;">Phase 2 :</span></strong> Choisir le bon modèle ou algorithme qui sera le plus pertinent à être utilisé selon l&rsquo;identification des datasets identifiés et analysés.</li>



<li><strong><span style="text-decoration: underline;">Phase 3 :</span></strong> Construire le modèle d&rsquo;analyse basé sur l&rsquo;algorithme choisie lors de l&rsquo;étape précédente.</li>



<li><strong><span style="text-decoration: underline;">Phase 4 :</span></strong> Jouer le modèle sur un ensemble de jeux de données afin d&rsquo;obtenir plusieurs jeux de données.</li>



<li><strong><span style="text-decoration: underline;">Phase 5 :</span></strong> Utiliser le modèle pour attribuer une note à l&rsquo;ensemble des jeux de données retournés et fournier des patterns pertinents adaptés aux datasets initiaux.</li>
</ul>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3440_61862a-a3"><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>Deep Learning</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"><div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="944" height="230" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_DLearning.jpg" alt="" class="wp-image-3495" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_DLearning.jpg 944w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_DLearning-300x73.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_DLearning-768x187.jpg 768w" sizes="auto, (max-width: 944px) 100vw, 944px" /></figure>
</div>


<p class="wp-block-paragraph">Le process pourrait se décrire de la manière suivante :</p>



<ul class="wp-block-list">
<li><strong><span style="text-decoration: underline;">Phase 1 :</span></strong> Comprendre le contexte présenté par l&rsquo;utilisateur et décider ou non si le Deep Learning est nécessaire ou non.</li>



<li><strong><span style="text-decoration: underline;">Phase 2 :</span></strong> Identifier les mots clés fournit en entrée les plus pertinents afin de préparer ces derniers à être analysé. Nous parlons généralement de datasets.</li>



<li><span style="text-decoration: underline;"><strong>Phase 3 :</strong></span> Choisir le bon modèle ou algorithme qui sera le plus pertinent à être utilisé selon l&rsquo;identification des datasets identifiés et analysés.</li>



<li><strong><span style="text-decoration: underline;">Phase 4 :</span></strong> Jouer le modèle sur un ensemble de jeux de données afin d&rsquo;obtenir plusieurs jeux de données.</li>



<li><strong><span style="text-decoration: underline;">Phase 5 :</span></strong> Compare le modèle ainsi que ces performances face aux données existantes identifiés ou non identifiées avec notre contexte initial.</li>
</ul>
</div></div></div>
</div></div></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Pour le comprendre au mieux, il convient de reprendre le <strong><em>Diagramm de Venn</em></strong> pour comprendre comment s&rsquo;imbriquent ces différentes notions d&rsquo;apprentissage.</p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td><strong>IA :</strong> a pour objectif de comprendre le langage humain, de réaliser les analyses prédictives offrir une IHM<sup data-fn="7ddca2cc-8395-4bb3-9a48-65ef2cbdd525" class="fn"><a href="#7ddca2cc-8395-4bb3-9a48-65ef2cbdd525" id="7ddca2cc-8395-4bb3-9a48-65ef2cbdd525-link">9</a></sup> et AGI<sup data-fn="3da01144-9884-4e50-80b3-cb720fe5d120" class="fn"><a href="#3da01144-9884-4e50-80b3-cb720fe5d120" id="3da01144-9884-4e50-80b3-cb720fe5d120-link">10</a></sup>.<br><br><strong>Machine Learning :</strong> se compose de l&rsquo;apprentissage automatique, la clustérisassions, les arbres décisionnels, le SVM<sup data-fn="6b6187e7-bf8d-4671-888c-ddabe2812f2a" class="fn"><a href="#6b6187e7-bf8d-4671-888c-ddabe2812f2a" id="6b6187e7-bf8d-4671-888c-ddabe2812f2a-link">11</a></sup>, LLM et NLP<sup data-fn="2ccacfdc-8014-4064-9420-0e51ef9e2778" class="fn"><a href="#2ccacfdc-8014-4064-9420-0e51ef9e2778" id="2ccacfdc-8014-4064-9420-0e51ef9e2778-link">12</a></sup>.<br><br><strong>Réseaux Neuronales :</strong> comprend les RAG<sup data-fn="4e84b708-3cbf-4c9d-af94-e19d2cd9d82e" class="fn"><a href="#4e84b708-3cbf-4c9d-af94-e19d2cd9d82e" id="4e84b708-3cbf-4c9d-af94-e19d2cd9d82e-link">13</a></sup> / Finetuning ainsi que les Feed Forward.<br><br><strong>Deep Learning</strong></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="494" class="wp-image-3496" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_DiagrammVenn.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_DiagrammVenn.jpg 598w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_002_DiagrammVenn-300x269.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Bien que rapide dans la présentation, de ce qu&rsquo;est l&rsquo;IA, je pense que nous avons suffisamment d&rsquo;éléments pour aborder les différents types d&rsquo;IA. </p>



<p class="wp-block-paragraph"><em>Toutefois, je suis loin d&rsquo;être spécialiste de l&rsquo;IA et mes connaissances théoriques remontent de mes cours de 2014 et de ce que j&rsquo;ai pu lire et apprendre depuis ces dernières semaines. Je vous invite donc à lire plus en détails son fonctionnement en profondeur.</em></p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3440_aa8e5f-c2 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-pane3440_c6b1c8-9f"><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>Intelligence Artificielle Réactive</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="wp-block-paragraph">C&rsquo;est la forme la plus élémentaire d&rsquo;IA qui se base sur des situations spécifiques limitées par des règles prédéfinies. Le traitement des entrées sont réalisées en temps réel sans prendre en compte les retours précédents afin de ne pas influer sur la décision qui va être retournée.</p>



<p class="wp-block-paragraph">De par sa simplicité, ce type d&rsquo;IA est efficace dans certains contextes ou rapidité et spontanéité sont nécessaires dans un traitement en temps réel. Et c&rsquo;est ainsi que l&rsquo;on retrouve ce type d&rsquo;IA dans les chatbots.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3440_67b18a-3d"><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>Intelligence Artificielle Limitée à la Mémoire</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="wp-block-paragraph">Dans un sens le grand frère de l&rsquo;IA Réactive, la présence de mémoire permet à l&rsquo;IA d&rsquo;apprendre et d&rsquo;évoluer en prenant compte les retours des entrées précédentes. Pour chaque recherche, le système d&rsquo;IA va consulter sa base de connaissance afin de fournir une réponse la plus fiable possible.</p>



<p class="wp-block-paragraph">Automatiquement, la qualité de la réponse ainsi que sa fiabilité dépendront du nombre d&rsquo;entrée que cette dernière aura en mémoire et va avoir un certain mal à répondre en temps réel. Nous retrouvons principalement son usage sur les sites e-commerces pour proposer des produits similaires à ceux consultés ou consommés par l&rsquo;utilisateur.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane3440_037cc9-55"><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>Intelligence Artificielle Auto Consciente</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="wp-block-paragraph">Ce type d&rsquo;IA consiste en théorie à insuffler un état de conscience à la machine afin que cette dernière soit une entité à part entière capable de comprendre son propre état.</p>



<p class="wp-block-paragraph">Naturellement, aujourd&rsquo;hui toujours en recherche, ce type d&rsquo;IA permettrait une autonomie totale de l&rsquo;IA car cela permettrait des facultés d&rsquo;apprentissages, d&rsquo;adaptations et de réflexions incroyable dans les choix décisionnels.</p>



<p class="wp-block-paragraph">Se pose alors dans les recherches un questionnement éthique et nécessite encore de percer sur le plan humain le fonctionnement de la conscience qui nous habite. </p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane3440_690749-ce"><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>Intelligence Artificielle La théorie de l&rsquo;esprit</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="wp-block-paragraph">Le dernier type, c&rsquo;est vivre dans le turfu. Cela serait d&rsquo;avoir une IA dotée d&rsquo;un esprit. Soit d&rsquo;avoir une IA capable de comprendre et d&rsquo;adapter les émotions, intentions et croyances d&rsquo;autres IA comme de notre environnement. Pour faire simple, une machine qui serait un humain ++.</p>



<p class="wp-block-paragraph">Le questionnement sur l&rsquo;éthique devient plus important au vu des implications vie privée, consentement etc. Manquerait plus que de finir comme <a href="https://www.youtube.com/watch?v=I8oRqko7OG4">Sarah Connor</a>&#8230; </p>
</div></div></div>
</div></div></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Bon allez ça sera tout pour l&rsquo;instant. Regardons de plus prêt Ollama. 🙂</p>



<h3 class="wp-block-heading">Architecture et Best-Pratices</h3>



<p class="wp-block-paragraph">Ollama étant cross plateform, j&rsquo;ai pris le parti de déployer ce dernier sous RHEL. Donc le guide va suivre dans ce sens. Ce choix est motivé par mes soins pour garder une meilleure maitrise des ressources qui vont être consommées par le système. Pour MacOS, je ne me prononce pas car je n&rsquo;utilise pas ce dernier. Sous Windows, je voyais déjà mon petite dernier faire du rodéo sur l&rsquo;hyperviseur qui gambade dans le couloir au premier prompt soumis&#8230; 🙂</p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>Comme énoncé ci-haut, il faut au minimum en ressource :<br>* 4 vCPUs<br>* 16 Gio de RAM<br>* 2 Gio de GPU<br>* Stockage Rapide<br><br>Malheureusement pour moi, je n&rsquo;ai pas les ressources nécessaires, mais cela ne m&#8217;empêchera pas d&rsquo;aller au bout des choses.<br><br>Je propose toutefois de dissocier les modèles et une partie de l&rsquo;architecture OLLAMA sur un disque dédié pour des raisons de performances lors de la soumissions des prompts et ne pas saturer le disque système.<br><br>L&rsquo;accès à l&rsquo;application se fera par des call API<sup data-fn="75955ef0-37da-444b-ba62-3eced558a61a" class="fn"><a href="#75955ef0-37da-444b-ba62-3eced558a61a" id="75955ef0-37da-444b-ba62-3eced558a61a-link">14</a></sup> sur le port <strong>11434/tcp</strong>.</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="245" class="wp-image-3503" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_003_arch_bp.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_003_arch_bp.jpg 646w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_003_arch_bp-300x134.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Si nous voulions aller plus loin il serait bien de dédié un disque pour les logs et ainsi améliorer les performances.</p>



<p class="wp-block-paragraph">Niveau sécurité, je suis resté sur mon durcissement classique et divulgâchage alerte ça fonctionne (Jacques TOUBON, le retour aurait été fier de moi pour ce coup-là !).</p>



<p class="wp-block-paragraph">Je ne vois plus qu&rsquo;un dernier point à aborder et nous pouvons passer à la pratique. Oui comme toute bonne chose, il faut faire durer le plaisir. <strong><em>#sendkisses</em></strong></p>



<h3 class="wp-block-heading">Conséquences de l&rsquo;IA</h3>



<p class="wp-block-paragraph">L&rsquo;IA est à ce jour (2025) adopté par environ 2/3 de la population mondiale que ce soit à des fins professionnels ou personnels dont environ 73% dans le contexte pro. Ainsi, difficile de nier que l&rsquo;usage particulier et bien au-dessus des institutions organisationnelles.</p>



<p class="wp-block-paragraph">Comme énoncé bien plus tôt dans cette partie, l&rsquo;usage est principalement à destination des centres de services et à destination des utilisateurs (chatbots, service clients) 60%, l&rsquo;automatisation des ventes et marketings 13%, l&rsquo;optimisation des systèmes IT 9%, l&rsquo;aide à la décision entre 5 et 10% et la production de contenu entre 5 et 10% également. Bien que mes chiffres date de 2023-2024.</p>



<p class="wp-block-paragraph">Dans son usage concrets, l&rsquo;IA est utilisée à 46% pour la recherche d&rsquo;informations, 43% pour la rédaction de textes et 33% pour de l&rsquo;analyse ou traduction.</p>



<p class="wp-block-paragraph">Les estimations à venir d&rsquo;ici 2030 seraient un usage de l&rsquo;IA par 80 à 85% de la population mondiale. Cette escalade et course n&rsquo;est pas sans conséquence sur le plan économique et disponibilité des ressources en termes de composants électroniques.</p>



<p class="wp-block-paragraph">Qui dit plus d&rsquo;usage, dit plus de ressource de calcul et donc plus de composants et plus d&rsquo;énergie. Le système peine à suivre. C&rsquo;est ainsi qu&rsquo;en moyenne, l&rsquo;évolution des couts entre 2024 et 2026 (estimé sur le plan mondial) et de :</p>



<ul class="wp-block-list">
<li>RAM (DDR5) : +170 à +250 %</li>



<li>SSD : +60 à +100 %</li>



<li>GPU : +10 à 25 %</li>



<li>CPU : +0% à +10%</li>
</ul>



<p class="wp-block-paragraph">Cela entraine donc une hausse des offres Cloud et service SaaS/IaaS/PaaS/BaaS et j&rsquo;en passe ainsi que des couts équipements embarquant ce type de composants. Difficile de faire sans IA de nos jours.</p>



<p class="wp-block-paragraph">Bon c&rsquo;est promis, passe à la pratique, je ferme la parenthèse que je n&rsquo;ai jamais ouverte.</p>



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



<p class="wp-block-paragraph">Avant de se lancer dans l&rsquo;installation, si je reprends les prérequis énoncés ci-haut, sachez que :</p>



<ul class="wp-block-list">
<li>Je n&rsquo;ai pas de GPU</li>



<li>Je n&rsquo;ai pas de stockage rapide</li>



<li>Mon hypervisieur est monoprocesseur</li>
</ul>



<p class="wp-block-paragraph">Tout pour bien fonctionner en somme 🙂</p>



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



<p class="wp-block-paragraph">L&rsquo;installation va se dérouler en 2 parties. Une partie pour installer Ollama, une partie pour l&rsquo;installation des modèles d&rsquo;intelligence artificielle.</p>



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



<h5 class="wp-block-heading">Installation</h5>



<p class="wp-block-paragraph">La documentation fournit sur le site est simple et claire. Il suffit alors de télécharger et d&rsquo;exécuter le contenu du script install.sh.</p>



<p class="wp-block-paragraph">Vérifier en amont que le paquet <strong>zstd</strong> est installé sur notre environnement.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-57"><code><strong>$ sudo dnf install zstd</strong></code></pre>



<p class="wp-block-paragraph">Si nous rentrons plus en détail, les arguments :<br></p>



<ul class="wp-block-list">
<li><strong>-f</strong> : ignore les redirections en cas de retour autre que le code 200 du protocole HTTP<sup data-fn="6ad53fdd-7b83-46bd-8608-5b89bf94b781" class="fn"><a href="#6ad53fdd-7b83-46bd-8608-5b89bf94b781" id="6ad53fdd-7b83-46bd-8608-5b89bf94b781-link">15</a></sup></li>



<li><strong>-s</strong> : supprime la barre de suppression et rend l&rsquo;exécution de la commande silencieuse</li>



<li><strong>-S</strong> : indique les erreurs</li>



<li><strong>-L</strong> : permet de suivre les redirections HTTP</li>
</ul>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-58"><code><strong>$ sudo curl -fsSL https://ollama.com/install.sh | sh</strong></code></pre>



<figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-13-color">/!\</mark> Attention : </strong>Il est vivement recommandé en amont avant d&rsquo;exécuter un script téléchargé depuis le net de vérifier son contenu et de lire ce dernier. Question de sécurité. Sinon cela revient encore une fois à s&rsquo;étonner d&rsquo;avoir attrapé <em>une gonorrhée après être allé aux p*tes sans capotes</em>&#8230;<br><br><strong>$ sudo curl -fsSL https://ollama.com/install.sh | cat</strong><br></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="262" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_010_Install_1-1024x262.jpg" alt="" class="wp-image-3453" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_010_Install_1-1024x262.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_010_Install_1-300x77.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_010_Install_1-768x197.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_010_Install_1.jpg 1246w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">L&rsquo;installation c&rsquo;est bien passée. Toutefois, le script nous informe qu&rsquo;aucun équipement GPU n&rsquo;a été détecter et donc que les calculs seront effectués par notre CPU. Ce qui va donc être plutôt lent dans mon cas personnel.</p>



<h5 class="wp-block-heading">Service au démarrage</h5>



<p class="wp-block-paragraph">Nous retrouvons une commande maintenant bien connue dans les environnements RHEL. Ainsi à chaque démarrage de notre système notre daemon ollama va être démarré.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-59"><code><strong>$ sudo systemctl enable ollama</strong></code></pre>



<h5 class="wp-block-heading">Firewalling</h5>



<p class="wp-block-paragraph">Encore une fois et comme toujours, il est nécessaire d&rsquo;ouvrir le port <strong>11434/tcp</strong> si nous souhaitons joindre l&rsquo;API depuis l&rsquo;extérieur (comprendre hors localhost).</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-60"><code><strong>$ sudo firewall-cmd --permanent --add-port=11434/tcp</strong><strong>
$ sudo firewall-cmd --reload</strong></code></pre>



<p class="wp-block-paragraph">On est d&rsquo;accord que si nous souhaiterions mieux faire en termes de sécurité, il serait plus intelligent de créer la policy suivante :</p>



<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-61"><code><strong>$ sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.127.50.0/24" port port="11434" protocol="tcp" accept'
$ sudo firewall-cmd --reload</strong></code></pre>



<p class="wp-block-paragraph">Ayant un UTM<sup data-fn="ff1afc50-05de-4bce-91e3-563ae4b9fe9f" class="fn"><a href="#ff1afc50-05de-4bce-91e3-563ae4b9fe9f" id="ff1afc50-05de-4bce-91e3-563ae4b9fe9f-link">16</a></sup> en amont, je me permets donc de me contenter de la première solution.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="908" height="399" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_010_FirewallAPI_2.jpg" alt="" class="wp-image-3455" style="aspect-ratio:2.275705027150114;width:587px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_010_FirewallAPI_2.jpg 908w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_010_FirewallAPI_2-300x132.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_010_FirewallAPI_2-768x337.jpg 768w" sizes="auto, (max-width: 908px) 100vw, 908px" /></figure>
</div>


<h5 class="wp-block-heading">HTTP ou HTTPS ?</h5>



<p class="has-text-align-center wp-block-paragraph"><strong>Un doute m&rsquo;habite&#8230; Le port 11434/tcp, ça ne serait pas du http ?</strong></p>



<p class="wp-block-paragraph">Bien vu l&rsquo;aveugle ! Effectivement et niveau sécurité c&rsquo;est pas super, il faudrait mieux user du protocole https. Pour ça, j&rsquo;ai une solution passons par un reverse proxy 🙂</p>



<p class="wp-block-paragraph">Je suis partagé quant à la rédaction de cette sous partie. Oui il est important de sécuriser l’accès à l’interface Web, mais j’ai peur d’être hors sujet et d’alourdir l’article. Mais d’un autre côté, je ne veux pas non plus bâcler la chose… Encore un pu**n de choix cornélien…</p>



<p class="wp-block-paragraph">Bref, je vais faire au plus simple et si besoin écrirai un billet sur Nginx.</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3440_5739eb-e1 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-pane3440_2c1931-a6"><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>Installation</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="wp-block-paragraph">L’installation et activation du service, je passe mon tour.</p>



<p class="wp-block-paragraph"></p>



<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-62"><code><strong>$ sudo dnf install nginx
$ sudo systemctl enable nginx
$ sudo systemctl start nginx</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="939" height="450" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_0.jpg" alt="" class="wp-image-3573" style="aspect-ratio:2.086739469578783;width:317px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_0.jpg 939w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_0-300x144.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_0-768x368.jpg 768w" sizes="auto, (max-width: 939px) 100vw, 939px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="938" height="83" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_1.jpg" alt="" class="wp-image-3572" style="aspect-ratio:11.302070130967468;width:339px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_1.jpg 938w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_1-300x27.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_1-768x68.jpg 768w" sizes="auto, (max-width: 938px) 100vw, 938px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3440_a9caf1-43"><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>Certificats</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="wp-block-paragraph">Là encore une fois je rencontre un petit problème. Je n’ai pas de certificat public que je pourrais utiliser, ma topologie réseau ne me permet pas d’utiliser un certificat Let’s Encrypt et sans vouloir spoiler je n’ai pas envie de me prendre la tête. Donc ça va finir avec un bon vieux certificat autosigné 🙂</p>



<p class="wp-block-paragraph">La génération n’est pas bien compliquée et si besoin, j’ai déjà rédigé&nbsp;<a href="https://erwanguillemard.com/linux-certificats/">un article</a>&nbsp;sur le sujet.</p>



<p class="wp-block-paragraph">Créons le répertoire qui va contenir nos éléments de sécurité :</p>



<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-63"><code><strong>$ sudo mkdir -p /etc/nginx/ssl</strong></code></pre>



<p class="wp-block-paragraph">Générons notre certificat :</p>



<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-64"><code><strong>$ sudo openssl req req -x509 -nodes -days 365 \
-newkey rsa:2048 \
-keyout /etc/nginx/ssl/ollama.key \
-out /etc/nginx/ssl/ollama.crt</strong></code></pre>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane3440_01a91a-c2"><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>Configuration</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="wp-block-paragraph">Créons et éditons notre fichier de configuration. Je prendrai le temps d’expliquer l’intégralité du fichier de configuration.</p>



<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-65"><code><strong>$ sudo vim /etc/nginx/conf.d/ollama.conf</strong></code></pre>



<pre class="wp-block-code"><code>#server {
#    listen 80;
#    server_name 10.227.250.11;
#
#    return 301 https://$host$request_uri;
#}

server {
    listen 11444 ssl;
    http2 on;
    server_name 10.227.250.11;

    ssl_certificate /etc/nginx/ssl/ollama.crt;
    ssl_certificate_key /etc/nginx/ssl/ollama.key;

    # TLS sécurisé
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;

    # sécurité headers
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    # taille upload
    client_max_body_size 100M;

    # compression
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml;

    location / {

        proxy_pass http://10.227.250.11:11434;

        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_buffering off;

        proxy_read_timeout 3600;
        proxy_send_timeout 3600;
    }
}</code></pre>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>La première section permet de réaliser la redirection du protocole HTTP vers HTTPS de manière permanente. Ainsi si je contacte l’url http://10.227.250.11, je serais automatiquement redirigé vers https://10.227.254.11.<br>Toutefois, la section est commentée car elle entre en conflit avec une autre configuration d&rsquo;un billet à venir 😉</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="324" height="148" class="wp-image-3737" style="width: 324px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_035_nginx_0.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_035_nginx_0.jpg 349w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_035_nginx_0-300x137.jpg 300w" sizes="auto, (max-width: 324px) 100vw, 324px" /></td></tr><tr><td>Le second bloc indique que nous écoutons sur le port 11444 sur l’interface 10.227.250.11. L’emplacement des fichiers contenant la clé privée ainsi que le certificat sont spécifiés pour activer la couche de sécurité (j’ai l’impression d’enfoncer des portes ouvertes…). J’indique qu’elles sont les versions des protocoles TLS<sup><a href="https://erwanguillemard.com/?p=3520&amp;preview=true#1a3ccfdd-7fad-428c-9f9a-15401188579d">17</a></sup>&nbsp;autorisées et laisse le serveur choisir le chiffrement le plus sûr.<br>Côté en-tête, j’ai repris les suggestions de sécurité implémentée pour ITOP. Soit la restriction de mettre le site en iframe externe, de restreindre le navigateur à deviner le tye MIME qui est utilisé et surtout d’activer la protection anti-cross-site scripting. Niveau upload, j’ai vu large et j’ai autorisé le téléversement de fichier de 100 Mio.<br>Côté performance, j’ai activé la compression des flux pour optimiser un peu les performances réseaux.</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="457" class="wp-image-3738" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_035_nginx_1.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_035_nginx_1.jpg 663w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_035_nginx_1-300x249.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr><tr><td>Le troisième bloc concerne la partie Reverse Proxy.<br>Toutes les requêtes qui sont envoyées sur https://10.227.250.11 sont redirigées vers le port 11434.<br>Concernant les en-têtes il est nécessaire d’utiliser les websockets car seront transmis l’ip du client, le protocole utilisé et le NDD<sup><a href="https://erwanguillemard.com/?p=3520&amp;preview=true#6f19f21f-54c7-433f-8a76-3c3d830f4eda">18</a></sup>&nbsp;ou l’IP demandé.</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="368" class="wp-image-3739" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_035_nginx_2.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_035_nginx_2.jpg 533w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_035_nginx_2-300x201.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Une fois la configuration faite, il est important de réaliser un petit contrôle de notre petit fichier afin de s’assurer que ce dernier ne comporte pas d’erreur.</p>



<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-66"><code><strong>$ sudo nginx -t 
$ sudo systemctl restart nginx</strong></code></pre>



<p class="wp-block-paragraph">Tiens une erreur 🙂 Regardons ça dans la partie suivante&#8230;</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane3440_aa7045-77"><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>Sécurité</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="wp-block-paragraph">Nous souhaitons toujours publier notre interface web en HTTPS. Donc il va falloir jouer avec nos UTMs !</p>



<p class="wp-block-paragraph">Sur le plan interne, autorisons nos flux https :</p>



<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-67"><code><strong>$ sudo firewall-cmd --permanent --add-port=11444/tcp
$ sudo firewall-cmd --reload</strong></code></pre>



<p class="wp-block-paragraph">Toutefois lors de la relance du service on se tape une bonne grosse erreur. C&rsquo;est lié au SELinux. Nginx n&rsquo;est pas autorisé par le SELinux a écouter sur le port 11444. Donc il faut l&rsquo;autoriser.</p>



<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-68"><code><strong>#Install semanage
$ sudo dnf install policycoreutils-python-utils

#Ajout du port comme autorisé à l'écoute
$ sudo semanage port -a -t http_port_t -p tcp 11444</strong>

<strong>#Relance du service nginx</strong>
<strong>$ sudo systemctl restart nginx</strong></code></pre>



<p class="wp-block-paragraph">Normalement nous ne devons plus avoir d&rsquo;erreur. Toutefois si nous essayons de joindre l&rsquo;url <strong>https://egapl-ollama-01:11444</strong> nous devons avoir un jolie 502 Bad Gateway dans notre navigateur 😀</p>



<p class="wp-block-paragraph">Ca vous fait la b**e hein ? Je vous rassure je me suis pris la même rouste. J’ai oublié d’autoriser le contexte de mon SELinux pour autoriser les services http à accéder aux réseaux 😀</p>



<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-69"><code><strong>$ sudo setsebool -P httpd_can_network_connect 1</strong></code></pre>



<p class="wp-block-paragraph">Un petit F5 et hop c’est tout bon &lt;3</p>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>Normalement avec toutes nos actions, nous devons joindre notre interface web depuis un navigateur de manière sécurisée (hormis l’erreur liée à notre certificat autosigné).</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="257" class="wp-image-3740" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_035_nginx_3.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_035_nginx_3.jpg 1098w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_035_nginx_3-300x140.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_035_nginx_3-1024x478.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_035_nginx_3-768x359.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>
</div></div></div>
</div></div></div>



<h5 class="wp-block-heading">Emplacement des modèles</h5>



<p class="wp-block-paragraph">Lors de ce benchmark, j&rsquo;ai été confronté à un problème d&rsquo;espace disque lié aux modèles. Effectivement, les modèles sont au minimum supérieur à 3 Gio. Et c&rsquo;est là que c&rsquo;est le drame car « pouf » je me tape un message d&rsquo;erreur&#8230;</p>



<p class="wp-block-paragraph">La solution est donc de déplacer le répertoire de modèle vers un autre disque. J&rsquo;ai vu large, j&rsquo;ai provisionné 100 Gio. Je pars du principe que le disque est monté et formaté.</p>



<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-70"><code><strong>$ sudo chown -R ollama:ollama /mnt/ollama</strong></code></pre>



<p class="wp-block-paragraph">Le changement de l&#8217;emplacement du répertoire du modèle va se faire par surcharge du service qui démarre Ollama. Naturellement, on ne modifie pas le service de base car les changements ne seront pas persistants. D&rsquo;où la surcharge&#8230;</p>



<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-71"><code><strong>$ sudo mkdir /etc/systemd/system/ollama.service.d
$ sudo vim /etc/systemd/system/ollama.service.d/override.conf</strong></code></pre>



<pre class="wp-block-code"><code><strong>&#91;Service]
Environment="OLLAMA_DEBUG=1"
Environment="OLLAMA_MODELS=/mnt/ollama/ollama-models"
Environment="OLLAMA_HOST=0.0.0.0"</strong>
</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="590" height="102" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_012_changeModelLocation_2.jpg" alt="" class="wp-image-3456" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_012_changeModelLocation_2.jpg 590w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_012_changeModelLocation_2-300x52.jpg 300w" sizes="auto, (max-width: 590px) 100vw, 590px" /></figure>
</div>


<p class="wp-block-paragraph">Notons que le mode <strong>Debug</strong> est actif et que le chemin de nos modèles est défini. J&rsquo;ai également défini la variable <strong>OLLAMA_HOST</strong> qui va nous permettre de joindre notre application depuis une source externe à notre machine.</p>



<p class="wp-block-paragraph">Il convient alors de recharger, forcer le gestionnaire de services à recharger l&rsquo;ensemble de ses configurations. Dans un second temps nous redémarrerons le daemon ollama afin de prendre en considération les changements présents dans notre fichier de surcharge. Par mesure de sécurité (car la confiance n&rsquo;exclut pas le contrôle) j&rsquo;aime à vérifier que le service est bien actif.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-72"><code><strong>$ sudo systemctl daemon-reload
$ sudo systemctl restart ollama
$ sudo systemctl status ollama
$ sudo ls -al /mnt/ollama/ollama-models/</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="438" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_012_changeModelLocation_4-1024x438.jpg" alt="" class="wp-image-3457" style="aspect-ratio:2.3379521324455643;width:566px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_012_changeModelLocation_4-1024x438.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_012_changeModelLocation_4-300x128.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_012_changeModelLocation_4-768x328.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_012_changeModelLocation_4.jpg 1128w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">Dans les sources, nous pouvons constater la présence de nos variables surcharger. Néanmoins nous pouvons afficher le contenu de notre répertoire cible pour les modèles afin de vérifier que l&rsquo;arborescence est bien présente.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="654" height="130" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_012_changeModelLocation_3.jpg" alt="" class="wp-image-3458" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_012_changeModelLocation_3.jpg 654w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_012_changeModelLocation_3-300x60.jpg 300w" sizes="auto, (max-width: 654px) 100vw, 654px" /></figure>
</div>


<h4 class="wp-block-heading">Installer des modèles</h4>



<p class="wp-block-paragraph">J&rsquo;ai fait le parti car c&rsquo;est « un peu » l&rsquo;objectif de base de ce billet d&rsquo;avoir des modèles locaux qui vont être utilisés. Je ne souhaite pas utiliser des connexions avec des sources externes afin de garder un contrôle sur mes recherches et usage.</p>



<p class="wp-block-paragraph">J&rsquo;ai fait le choix d&rsquo;étudier 4 modèles LLM :</p>



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



<li>Qwen</li>



<li>Mistral</li>



<li>DeepSeek-Coder</li>
</ul>



<p class="wp-block-paragraph">Je propose dans un premier temps de faire un comparatif de ces modèles.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>Critères</strong></td><td class="has-text-align-center" data-align="center"><strong>Llama 3</strong></td><td class="has-text-align-center" data-align="center"><strong>Qwen</strong></td><td class="has-text-align-center" data-align="center"><strong>Mistral</strong></td><td class="has-text-align-center" data-align="center"><strong>DeepSeek-Coder</strong></td></tr><tr><td class="has-text-align-center" data-align="center"><strong>Editeur</strong></td><td class="has-text-align-center" data-align="center">Meta</td><td class="has-text-align-center" data-align="center">Alibaba</td><td class="has-text-align-center" data-align="center">Mistral AI</td><td class="has-text-align-center" data-align="center">DeepSeek</td></tr><tr><td class="has-text-align-center" data-align="center"><strong>Type</strong></td><td class="has-text-align-center" data-align="center">Généraliste</td><td class="has-text-align-center" data-align="center">Généraliste</td><td class="has-text-align-center" data-align="center">Généraliste</td><td class="has-text-align-center" data-align="center">Spé code</td></tr><tr><td class="has-text-align-center" data-align="center"><strong>Usage</strong></td><td class="has-text-align-center" data-align="center">Populaire</td><td class="has-text-align-center" data-align="center">Bon</td><td class="has-text-align-center" data-align="center">Rapide</td><td class="has-text-align-center" data-align="center">IDE / Dev</td></tr><tr><td class="has-text-align-center" data-align="center"><strong>Licence</strong></td><td class="has-text-align-center" data-align="center">Llama Community Licence</td><td class="has-text-align-center" data-align="center">Apache 2.0</td><td class="has-text-align-center" data-align="center">Apache 2.0</td><td class="has-text-align-center" data-align="center">Licence DeepSeek</td></tr><tr><td class="has-text-align-center" data-align="center"><strong>Dataset</strong></td><td class="has-text-align-center" data-align="center">Texte/Code/Web</td><td class="has-text-align-center" data-align="center">Multilingue web</td><td class="has-text-align-center" data-align="center">Web + Données filtrées</td><td class="has-text-align-center" data-align="center">~ 90% de code</td></tr><tr><td class="has-text-align-center" data-align="center"><strong>Avantages</strong></td><td class="has-text-align-center" data-align="center">Raisonnement et coding</td><td class="has-text-align-center" data-align="center">Multilingue et contextuel</td><td class="has-text-align-center" data-align="center">Rapide et faible consommateur de ressources</td><td class="has-text-align-center" data-align="center">Bon pour du code</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Avec ce tableau, je pense que nous avons un bon récapitulatif. Toutefois et pour les curieux il existe une centaine de modèles compatible avec Ollama (<a href="https://ollama.com/library">Lien</a>). J&rsquo;ai fait mon choix, à vous de faire le vôtre. Vous êtes des grands garçons et des grandes filles hein ? <strong>#bisous</strong></p>



<p class="wp-block-paragraph">L&rsquo;installation pour les modèles choisies, suivent tous la même logique. Pas de quoi épiloguer pendant 107 ans&#8230;.</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3440_be8f6d-58 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-pane3440_b83fad-d4"><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>Llama3</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">
<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-73"><code><strong>$ sudo ollama pull llama3</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="131" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_022_llama3_2-1024x131.jpg" alt="" class="wp-image-3463" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_022_llama3_2-1024x131.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_022_llama3_2-300x38.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_022_llama3_2-768x98.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_022_llama3_2-1536x196.jpg 1536w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_022_llama3_2.jpg 1628w" 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-pane3440_6c3ae4-79"><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>Qwen</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">
<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-74"><code><strong>$ sudo ollama pull qwen</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="682" height="1024" src="https://erwanguillemard.com/wp-content/uploads/2024/01/IL01_000_resultjoker-682x1024.jpg" alt="" class="wp-image-1498" style="aspect-ratio:0.666023595755732;width:189px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/01/IL01_000_resultjoker-682x1024.jpg 682w, https://erwanguillemard.com/wp-content/uploads/2024/01/IL01_000_resultjoker-200x300.jpg 200w, https://erwanguillemard.com/wp-content/uploads/2024/01/IL01_000_resultjoker-768x1152.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2024/01/IL01_000_resultjoker-1024x1536.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2024/01/IL01_000_resultjoker-1365x2048.jpg 1365w, https://erwanguillemard.com/wp-content/uploads/2024/01/IL01_000_resultjoker-scaled.jpg 1706w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane3440_a52c29-5b"><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>Mistral</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">
<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-75"><code><strong>$ sudo ollama pull mistral</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="134" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_023_mistral_0-1024x134.jpg" alt="" class="wp-image-3464" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_023_mistral_0-1024x134.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_023_mistral_0-300x39.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_023_mistral_0-768x100.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_023_mistral_0-1536x200.jpg 1536w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_023_mistral_0.jpg 1626w" 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-pane3440_b7432f-bf"><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>DeepSeek-Coder</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">
<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-76"><code><strong>$ sudo ollama pull deepseek-coder:6.7b</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="662" height="208" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_024_deepseeker-67b_0.jpg" alt="" class="wp-image-3465" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_024_deepseeker-67b_0.jpg 662w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_024_deepseeker-67b_0-300x94.jpg 300w" sizes="auto, (max-width: 662px) 100vw, 662px" /></figure>
</div></div></div></div>
</div></div></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Pour voir l&rsquo;ensemble des modèles il est possible de lister ces derniers grâce à la commande suivante :</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-77"><code><strong>$ sudo ollama list</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="701" height="107" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_012_ListModel_4.jpg" alt="" class="wp-image-3466" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_012_ListModel_4.jpg 701w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_012_ListModel_4-300x46.jpg 300w" sizes="auto, (max-width: 701px) 100vw, 701px" /></figure>
</div>


<h3 class="wp-block-heading">Démarrage de Ollama</h3>



<p class="wp-block-paragraph">Maintenant que tout est fonctionnel, démarrons Ollama et c&rsquo;est parti pour un périple des possibles comme <a href="https://fr.wikipedia.org/wiki/Sept_Ans_d%27aventures_au_Tibet#:~:text=L'alpiniste%2C%20explorateur%20et%20%C3%A9crivain,la%20souverainet%C3%A9%20de%20la%20Chine.">Heinrich Harrer à l&rsquo;assaut du Nanga Parbat</a> (l&rsquo;élévation n&rsquo;étant pas celle que l&rsquo;on croit 🙂 ).</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="768" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_001_7years-1024x768.jpg" alt="" class="wp-image-3468" style="width:411px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_001_7years-1024x768.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_001_7years-300x225.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_001_7years-768x576.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_001_7years.jpg 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-78"><code><strong>$ ollama</strong></code></pre>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>Dans le menu qui s&rsquo;offre à nous, la première option permet de démarrer, lancer un de nos modèles localement.<br><br>Toutefois, en dessous de cette première option de navigation, nous retrouvons la possibilité d&rsquo;établir des connexions externes vers des moteurs en ligne tel que :<br><br>* Claude Code<br>* Codex<br>* OpenClaw<br>* Droid<br>* Pi<br>* Cline<br><br>Si vous possédez un compte, vous pouvez réaliser la jonction, mais alors à quoi bon avoir un moteur d&rsquo;IA interne ?</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="650" height="649" class="wp-image-3467" style="width: 650px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_011_Run_2.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_011_Run_2.jpg 612w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_011_Run_2-300x300.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_011_Run_2-150x150.jpg 150w" sizes="auto, (max-width: 650px) 100vw, 650px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Si nous cliquons sur le premier choix, il nous est alors demandé de choisir un modèle. Il est possible de télécharger un modèle directement depuis ce menu ou de choisir un modèle précédemment installé tout en bas de cette interface.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="821" height="279" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_021_model_0.jpg" alt="" class="wp-image-3469" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_021_model_0.jpg 821w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_021_model_0-300x102.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_021_model_0-768x261.jpg 768w" sizes="auto, (max-width: 821px) 100vw, 821px" /></figure>
</div>


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



<p class="wp-block-paragraph">Et si on se lançais un petit benchmark de nos 4 modèles pour voir le fonctionnement ? 🙂</p>



<p class="wp-block-paragraph">Amusons-nous tel un <a href="https://www.youtube.com/watch?v=vxx-ZQBHXIA">lamastico</a> &lt;3</p>



<p class="wp-block-paragraph">Pour le test, j&rsquo;ai décidé de partir sur quelque chose de simple et ISO sinon cela ne sert strictement à rien.</p>



<p class="wp-block-paragraph">La question sera : </p>



<p class="has-text-align-center wp-block-paragraph"><strong>Peux-tu évaluer et me proposer une version plus robuste de cette fonction powershell s&rsquo;il te plait ? [Suivie d&rsquo;une petite fonction maison qui peut être amélioré]</strong></p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3440_c4efb1-bc 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-pane3440_c9a31d-08"><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>Llama</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">
<figure class="wp-block-table aligncenter"><table class="has-fixed-layout"><tbody><tr><td><img loading="lazy" decoding="async" width="550" height="930" class="wp-image-3479" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_030_test-llama3_prompt_1.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_030_test-llama3_prompt_1.jpg 639w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_030_test-llama3_prompt_1-178x300.jpg 178w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_030_test-llama3_prompt_1-606x1024.jpg 606w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td><td><img loading="lazy" decoding="async" width="550" height="93" class="wp-image-3478" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_030_test-llama3_performance_0.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_030_test-llama3_performance_0.jpg 895w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_030_test-llama3_performance_0-300x51.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_030_test-llama3_performance_0-768x130.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3440_e891f6-13"><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>Qwen</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">
<figure class="wp-block-table aligncenter"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td><img loading="lazy" decoding="async" width="550" height="1314" class="wp-image-3477" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_performance_1.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_performance_1.jpg 636w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_performance_1-126x300.jpg 126w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_performance_1-428x1024.jpg 428w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td><td><img loading="lazy" decoding="async" width="550" height="92" class="wp-image-3476" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_performance_0.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_performance_0.jpg 894w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_performance_0-300x50.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_performance_0-768x128.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">J&rsquo;ai du tronquer la partie de la réponse en anglais car cela aurait pris énormément d&rsquo;espace. Toutefois la réponse retournée est plus que satisfaisante pour celui qui sait parler la langue de Shakespeare</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane3440_3d6aef-62"><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>Mistral</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">
<figure class="wp-block-table aligncenter"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td><img loading="lazy" decoding="async" width="550" height="643" class="wp-image-3473" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_031_test-mistral_performance_1.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_031_test-mistral_performance_1.jpg 973w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_031_test-mistral_performance_1-257x300.jpg 257w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_031_test-mistral_performance_1-876x1024.jpg 876w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_031_test-mistral_performance_1-768x898.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td><td><img loading="lazy" decoding="async" width="550" height="94" class="wp-image-3474" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_031_test-mistral_performance_0.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_031_test-mistral_performance_0.jpg 905w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_031_test-mistral_performance_0-300x51.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_031_test-mistral_performance_0-768x132.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane3440_8f5a74-34"><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>DeepSeek-Coder</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">
<figure class="wp-block-table aligncenter"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td><img loading="lazy" decoding="async" width="550" height="969" class="wp-image-3471" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_032_test-deepseeker_performance_1.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_032_test-deepseeker_performance_1.jpg 752w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_032_test-deepseeker_performance_1-170x300.jpg 170w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_032_test-deepseeker_performance_1-581x1024.jpg 581w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td><td><img loading="lazy" decoding="async" width="550" height="96" class="wp-image-3472" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_032_test-deepseeker_performance_0.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_032_test-deepseeker_performance_0.jpg 901w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_032_test-deepseeker_performance_0-300x53.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_032_test-deepseeker_performance_0-768x135.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>
</div></div></div>
</div></div></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Je pense que cela est évident en termes de conclusions. Pour 1 prompt identique, nous avons quartes réponses différentes et un point commun. Si certains modèles mettent plus de temps de réponse il est indéniablement contestable que ça chauffe niveau calcul. Dans certains cas, j&rsquo;aime même du SWAP ! Bref, côté consommation électrique, ça consomme&#8230; Mais bon je m&rsquo;y attendais ce n&rsquo;est pas <a href="https://www.youtube.com/watch?v=oY_paPRS3p8">la première fois que je fais des étincelles avec ma b*te</a>&#8230;</p>



<p class="wp-block-paragraph">Plus sérieusement, je sais quitte à me répéter ou pas ce que je dois faire pour améliorer ma fonction. Et je suis un peu déçu du résultat. Néanmoins en modifiant légèrement le prompt, en précisant :</p>



<p class="has-text-align-center wp-block-paragraph"><strong>Peux-tu évaluer et me proposer une version plus robuste, sécurisé de cette fonction powershell s&rsquo;il te plait comme si tu étais un développeur sénior avec un regard plus critique et sévère ? [Suivie d&rsquo;une petite fonction maison qui peut être amélioré]</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>Résultat Prompt initial</strong><br>(qwen)</td><td class="has-text-align-center" data-align="center"><strong>Résultat Prompt plus précis</strong><br>(qwen)</td></tr><tr><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="519" class="wp-image-3511" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_codeonly_2.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_codeonly_2.jpg 935w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_codeonly_2-300x283.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_codeonly_2-768x724.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="579" class="wp-image-3512" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_codeonly_3.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_codeonly_3.jpg 839w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_codeonly_3-285x300.jpg 285w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_014_033_test-qwen_codeonly_3-768x808.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="has-text-align-center has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color wp-elements-79 wp-block-paragraph"><mark style="background-color:rgba(0, 0, 0, 0);color:#fd0000" class="has-inline-color"><strong>/!\</strong></mark> <strong>Attention :</strong> J&rsquo;ai volontairement gardé que la suggestion de la fonction et non le blabla d&rsquo;en-tête qui explique tout ce qui va être appliqué.</p>



<p class="wp-block-paragraph">Encore une fois pas de magie, il suffit de bien rédiger son prompt et là j&rsquo;obtiens un retour plus précis à mes attentes.</p>



<p class="wp-block-paragraph">Si je résume la situation sur le test à iso périmètre selon le contexte :</p>



<ul class="wp-block-list">
<li>RAM : 8 Go</li>



<li>vCPU : 4</li>



<li>Processeur Physique : Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz (Mono)</li>



<li>Contexte : Coding</li>
</ul>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>Durée des réponses</strong></td><td class="has-text-align-center" data-align="center"><strong>Qualité des réponses</strong></td></tr><tr><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="365" class="wp-image-3696" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_034_performance_0.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_034_performance_0.jpg 482w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_034_performance_0-300x199.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="374" class="wp-image-3695" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_034_performance_1.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_034_performance_1.jpg 481w, https://erwanguillemard.com/wp-content/uploads/2026/04/AP_014_034_performance_1-300x204.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">En conclusion Qwen est de loin celui qui met le plus de temps à délivrer la réponse. Cela s&rsquo;explique par une explication plus poussée ce qui prends un certain temps à l&rsquo;affichage. Cependant la qualité de la réponse retournée est de loin supérieur aux trois autres LLMs.</p>



<p class="wp-block-paragraph">Il serait intéressant de pousser la comparaison sur un prompt de réflexion pur.</p>



<p class="wp-block-paragraph">De tous les tests de modèles (du moins sur les quatre déployés) c&rsquo;est qwen qui me convient le mieux. Néanmoins tout dépendra encore une fois du contexte et de ce que je souhaite réaliser avec l&rsquo;IA.</p>



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



<p class="wp-block-paragraph">Je suis plutôt satisfait bien que sans répondre aux prérequis il faut savoir s&rsquo;armer de patiente. Dans l&rsquo;ensemble Ollama est une bonne solution mais cette dernière doit être utilisé avec un certain contrôle selon les LLMs que l&rsquo;on pourrait être amené à utiliser. Naturellement le retour de prompt vient de la qualité de celui que l&rsquo;utilisateur aura exprimé.</p>



<p class="wp-block-paragraph">De ce fait, Ollama ne garantit pas une fiabilité aussi conséquente que les géants du Cloud. Toutefois il permet d&rsquo;assurer la confidentialité, sécurité des données localement et de nos recherches contrairement aux outils en ligne.</p>



<p class="wp-block-paragraph">Ce qui pourrait toutefois rebuter son usage serait de passer par l&rsquo;interface CLI dans le terminal. Effectivement c&rsquo;est loin d&rsquo;être ergonomique pour un usage quotidien d&rsquo;un utilisateur n&rsquo;ayant pas d&rsquo;expérience dans ce domaine. Mais il existe toutefois des alternatives à cette problématique par des outils intermédiaires qui viennent se placer entre l&rsquo;utilisateur et Ollama. Ce sujet sera abordé dans un prochain billet.</p>



<p class="has-text-align-center wp-block-paragraph"><strong><em>Initialement, je souhaitais aborder le sujet dans ce billet mais cela aurait été trop indigeste. Donc j&rsquo;ai CUT comme on dit dans notre milieu 🙂</em></strong></p>



<p class="wp-block-paragraph">Ollama fournissant une documentation riche et simple il sera alors possible de jouer avec son API. Vous me connaissez avec le temps, s&rsquo;il y a une documentation, une API&#8230; Que vais-je bien pouvoir faire avec le framework .NET et Powershell ? 🙂 L&rsquo;objectif serait de proposer par exemple un petit client de bureau Windows pour les utilisateurs. Il serait également possible de mettre en place des passerelles d&rsquo;automatisation inter applicatives intelligente comme <strong>L&rsquo;ouverture d&rsquo;un incident sur un event VEEAMOne dans ITOP</strong> ou <strong>une fonction de contrôle de code depuis PowerShell ISE</strong> par exemple.</p>



<p class="wp-block-paragraph">Cette étude m&rsquo;ouvre un nombre de porte considérable en guise de projet et de sujet d&rsquo;étude et ce malgré les contraintes matérielles. Est-ce que je vais utiliser longtemps la solution, je ne pense honnêtement pas car cette dernière est assez énergivore pour mon petit lab et je ne travaille pas chez EDF ni n&rsquo;habite Versailles. Mais cela peut (pour ne pas dire m&rsquo;a) réconcilié avec l&rsquo;utilisation de l&rsquo;IA. <em>Comme quoi il n&rsquo;y a que les cons qui ne changent pas d&rsquo;avis et nous sommes tous le con d&rsquo;un autre</em>.</p>



<p class="wp-block-paragraph"> Le mot de la fin :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>J&rsquo;ai cherché votre nom sur Ollama ? Comme ça vous êtes triple champion du monde de descente de Guiness catégorie galopin ? </em></p>



<p class="wp-block-paragraph"><em>Vous devez faire erreur avec une autre personne, je suis un DC10 fantôme sortant d&rsquo;une tempête codéinée. </em></p>



<p class="wp-block-paragraph"><em>Milles excuses M&rsquo;sieur Ollama.</em></p>
<cite>Erwan GUILLEMARD</cite></blockquote>



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



<ul class="wp-block-list">
<li><a href="https://www.larousse.fr/dictionnaires/francais/robot/69647">Définition Larousse</a></li>



<li><a href="https://fr.wikipedia.org/wiki/Intelligence_artificielle">Wikipédia : IA</a></li>



<li><a href="https://www.data-bird.co/blog/types-ia">DataBird : Type d&rsquo;IA</a></li>



<li><a href="https://docs.ollama.com/">Ollama : Documentation</a></li>



<li><a href="https://ollama.com/download">Ollama : Téléchargement</a></li>



<li><a href="https://ollama.com/library">Ollama : Bibliothèque de modèle</a></li>



<li><a href="https://docs.openwebui.com/getting-started/quick-start">OpenWebUI : Documentation</a></li>



<li><a href="https://docs.openwebui.com/getting-started/quick-start/connect-a-provider/starting-with-ollama/">OpenWebUI : Intégration Ollama</a></li>



<li><a href="https://telnyx.com/llm-library/deepseek-coder-6-7b-instruct">Comparatif : Modèles performances</a></li>



<li><a href="https://localaimaster.com/blog/best-local-ai-models-2025-complete-guide">Comparatif : Modèles usages</a></li>



<li><a href="https://www.daf-mag.fr/Thematique/gestion-risque-1241/cyber-climat-2123/Breves/ia-usages-confiance-pierre-angulaire-adoption-durable-480929.htm">Usage de l&rsquo;IA : DAFMag</a></li>



<li><a href="https://lehub.bpifrance.fr/les-chiffres-2023-2024-du-marche-de-lia-dans-le-monde/">Répartition de l&rsquo;usage : BPIFrance</a></li>



<li><a href="https://www.lemonde.fr/emploi/article/2025/04/11/53-des-actifs-utilisent-l-ia-dans-leur-vie-professionnelle_6594046_1698637.html">Usage de l&rsquo;IA : LeMonde</a></li>
</ul>


<ol class="wp-block-footnotes"><li id="cfefe833-a7a4-4019-87c1-c684487526cf"><strong>IA :</strong> Intelligence Artificielle <a href="#cfefe833-a7a4-4019-87c1-c684487526cf-link" aria-label="Aller à la note de bas de page 1">↩︎</a></li><li id="aadcbef0-7f66-4bcf-bdef-699e3c85609a">L&rsquo;erreur est humaine, persévérer diabolique <a href="#aadcbef0-7f66-4bcf-bdef-699e3c85609a-link" aria-label="Aller à la note de bas de page 2">↩︎</a></li><li id="b41451ff-b3b4-4f38-bb68-9645125a745a"><strong>CGU :</strong> Conditions Générales d&rsquo;Utilisations <a href="#b41451ff-b3b4-4f38-bb68-9645125a745a-link" aria-label="Aller à la note de bas de page 3">↩︎</a></li><li id="1aad26f0-eec5-4a0f-8e20-fdd248a35c69"><strong>LLM :</strong> Large Language Models  <a href="#1aad26f0-eec5-4a0f-8e20-fdd248a35c69-link" aria-label="Aller à la note de bas de page 4">↩︎</a></li><li id="fdf3a5b9-4253-464d-a09e-8fb86b58314e"><strong>GPU :</strong> Graphics Processing Unit  <a href="#fdf3a5b9-4253-464d-a09e-8fb86b58314e-link" aria-label="Aller à la note de bas de page 5">↩︎</a></li><li id="73029218-b1cc-46cd-b970-647ebf9d8979"><strong>CPU :</strong> Central Processing Unit <a href="#73029218-b1cc-46cd-b970-647ebf9d8979-link" aria-label="Aller à la note de bas de page 6">↩︎</a></li><li id="a37422d2-85b9-4b20-aaed-ed832709d897"><strong>SSD :</strong> Solid State Drive <a href="#a37422d2-85b9-4b20-aaed-ed832709d897-link" aria-label="Aller à la note de bas de page 7">↩︎</a></li><li id="551f4327-d659-4f5e-aa79-e901800f9a6f"><strong>DARPA :</strong> Defense Advanced Research Projects Agency <a href="#551f4327-d659-4f5e-aa79-e901800f9a6f-link" aria-label="Aller à la note de bas de page 8">↩︎</a></li><li id="7ddca2cc-8395-4bb3-9a48-65ef2cbdd525"><strong>IHM :</strong> Interface Homme Machine <a href="#7ddca2cc-8395-4bb3-9a48-65ef2cbdd525-link" aria-label="Aller à la note de bas de page 9">↩︎</a></li><li id="3da01144-9884-4e50-80b3-cb720fe5d120"><strong>AGI :</strong> Artificial General Intelligence <a href="#3da01144-9884-4e50-80b3-cb720fe5d120-link" aria-label="Aller à la note de bas de page 10">↩︎</a></li><li id="6b6187e7-bf8d-4671-888c-ddabe2812f2a"><strong>SVM :</strong> Support Vector Machine <a href="#6b6187e7-bf8d-4671-888c-ddabe2812f2a-link" aria-label="Aller à la note de bas de page 11">↩︎</a></li><li id="2ccacfdc-8014-4064-9420-0e51ef9e2778"><strong>NLP :</strong> Natural Language Processing <a href="#2ccacfdc-8014-4064-9420-0e51ef9e2778-link" aria-label="Aller à la note de bas de page 12">↩︎</a></li><li id="4e84b708-3cbf-4c9d-af94-e19d2cd9d82e"><strong>RAG :</strong> Retrieval Augmented Generation <a href="#4e84b708-3cbf-4c9d-af94-e19d2cd9d82e-link" aria-label="Aller à la note de bas de page 13">↩︎</a></li><li id="75955ef0-37da-444b-ba62-3eced558a61a"><strong>API :</strong> Application Programming Interface <a href="#75955ef0-37da-444b-ba62-3eced558a61a-link" aria-label="Aller à la note de bas de page 14">↩︎</a></li><li id="6ad53fdd-7b83-46bd-8608-5b89bf94b781"><strong>HTTP :</strong> Hypertext Transfer Protocol <a href="#6ad53fdd-7b83-46bd-8608-5b89bf94b781-link" aria-label="Aller à la note de bas de page 15">↩︎</a></li><li id="ff1afc50-05de-4bce-91e3-563ae4b9fe9f"><strong>UTM :</strong> Unified Threat Management <a href="#ff1afc50-05de-4bce-91e3-563ae4b9fe9f-link" aria-label="Aller à la note de bas de page 16">↩︎</a></li></ol>]]></content:encoded>
					
		
		
			</item>
		<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 class="wp-block-paragraph">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 class="wp-block-paragraph">Je rassure le lecteur qui s&rsquo;est égaré ici, ce billet va être simple.</p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">C&rsquo;est donc là que j&rsquo;ai pris un coup de sang.</p>



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





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



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Si nous devons commencer par la base, il serait bon de se poser la question </p>



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



<p class="has-text-align-left wp-block-paragraph">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 wp-block-paragraph"><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 wp-block-paragraph">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 class="wp-block-paragraph">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 loading="lazy" 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="auto, (max-width: 546px) 100vw, 546px" /></figure>
</div>


<p class="wp-block-paragraph">(Pas de panique je vais prendre le temps de décrire chaque répertoire).</p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Ce répertoire est réservé au rangement des chaussures afin d&rsquo;utiliser nos sockets&#8230; Ok je sors.</p>



<p class="wp-block-paragraph">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 wp-block-paragraph"><strong>Pas de /boot ? Pas de démarrage&#8230;</strong></p>



<p class="has-text-align-left wp-block-paragraph">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 class="wp-block-paragraph">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 wp-block-paragraph">Si nous avions des doutes, sous Linux, <strong><em>Tout est fichiers</em></strong>.</p>



<p class="has-text-align-left wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">/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 class="wp-block-paragraph">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 wp-block-paragraph">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 wp-block-paragraph"><a href="https://www.youtube.com/watch?v=6FLXqkL9MPM">E.T phone&#8230; HHHHH-OOOOOOOMMMMM-EEE&#8230;</a></p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Si nous faisions la comparaison avec Windows, les fichiers .dll s&rsquo;appellent .so.</p>



<p class="wp-block-paragraph">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 wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">De son petit nom <strong>service</strong>, ce répertoire va contenir les données des services fournis par le système.</p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 wp-block-paragraph"><strong>Oui mais quels répertoires ?</strong></p>



<p class="wp-block-paragraph">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 loading="lazy" 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="auto, (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 wp-block-paragraph"><strong>Ok pour ce qui est de la segmentation, mais du coup, quel doit être la répartition niveau stockage ?</strong></p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 wp-block-paragraph"><strong>Cela fait-il de moi un vieux réactionnaire ? Un dev de l&rsquo;ancien temps ?</strong></p>



<p class="wp-block-paragraph">Bref, je laisse cette question existentielle en suspens.</p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 loading="lazy" 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="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">J&rsquo;offre également la possibilité de définir la taille minimum ou maximum à provisionner.</p>



<p class="wp-block-paragraph">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 wp-block-paragraph"><a href="https://github.com/EGuillemard/GS_002_UNI_SYS_Storage">Miaou</a></p>



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



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Bref, il est temps de clôturer ce billet et d&rsquo;attaquer d&rsquo;autres thématiques 🙂 </p>



<p class="wp-block-paragraph">Le mot de la fin :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><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>Apps &#8211; PostgreSQL</title>
		<link>https://erwanguillemard.com/apps-postgresql/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Wed, 05 Nov 2025 21:26:00 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[BDD]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=3247</guid>

					<description><![CDATA[Après les otaries, toujours dans le contexte des animaux je vais me déplacer latéralement vers l&#8217;enclos des éléphants. Alors non je ne vais pas abandonner MariaDB. Ce billet simple et efficace traitera de la SGBD PostgreSQL. Le pourquoi de cet intérêt soudain se justifie par la rupture technologique de nombreux éditeurs du marché vers ce...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Après les otaries, toujours dans le contexte des animaux je vais me déplacer latéralement vers l&rsquo;enclos des éléphants.</p>



<p class="wp-block-paragraph">Alors non je ne vais pas abandonner MariaDB. Ce billet simple et efficace traitera de la SGBD<sup data-fn="b793e32b-66d6-49b2-ab53-f36b018298f1" class="fn"><a href="#b793e32b-66d6-49b2-ab53-f36b018298f1" id="b793e32b-66d6-49b2-ab53-f36b018298f1-link">1</a></sup> PostgreSQL. Le pourquoi de cet intérêt soudain se justifie par la rupture technologique de nombreux éditeurs du marché vers ce moteur puissant. Ne nous voilons pas la face, ce jour les grands acteurs de BDDs<sup data-fn="393e6df6-2f56-48e8-9d39-7a0fdfff1fe2" class="fn"><a href="#393e6df6-2f56-48e8-9d39-7a0fdfff1fe2" id="393e6df6-2f56-48e8-9d39-7a0fdfff1fe2-link">2</a></sup> proposent des versions communautaires qui sont limités en termes de volumétrie et de fonctionnalité. Pour jouir de l&rsquo;ensemble des fonctionnalités il faut passer à la caisse.</p>



<p class="has-text-align-center wp-block-paragraph"><strong>$$$ Bonjour le bandit manchot $$$</strong></p>



<p class="wp-block-paragraph">Les bases de données étant de plus en plus volumineuse et l&rsquo;évolution que nous utilisateurs nous en faisons facilite auprès de ces mêmes éditeurs la mise à jour de leurs tarifications. C&rsquo;est de bonne guerre (ou pas). Ce « <strong>ou pas</strong> » laisse donc la voie à d&rsquo;autres alternatives. Plus simple, moins complexes et parfois plus puissante en s&rsquo;alignant sur le principe de la philosophie OpenSource.</p>



<p class="has-text-align-center wp-block-paragraph"><strong>Je laisse une version communautaire, tu passes à la caisse si tu veux un service d&rsquo;assistance ou de maintenance. </strong></p>



<p class="has-text-align-left wp-block-paragraph">Il y aura toujours chez certains éditeurs quelques fonctionnalités en moins. Toutefois, je pense que c&rsquo;est dans cette approche et la bonne et je réfléchis à adopter le même principe dans un projet de vie d&rsquo;une plus grande dimension.</p>



<p class="wp-block-paragraph">Bref, après cette <a href="https://www.youtube.com/watch?v=k7U4EfFltX4&amp;list=RDk7U4EfFltX4&amp;start_radio=1">marche de l&rsquo;éléphant</a> (sans prendre de LSD<sup data-fn="400bfed0-8737-41bd-8083-b5ec5af14458" class="fn"><a href="#400bfed0-8737-41bd-8083-b5ec5af14458" id="400bfed0-8737-41bd-8083-b5ec5af14458-link">3</a></sup> ou autres acides). Je me fais un petit guide sur PostreSQL 🙂</p>





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



<p class="wp-block-paragraph">Il me semble important une nouvelle fois de préciser que ce billet portera sur le déploiement d&rsquo;un environnement PostgreSQL dans sa dernière version stable à ce jour (release 18 en ce mois de grace Octobre 2025). Sur Windows, le déploiement ne m&rsquo;intéresse pas des masses. Par contre sur un système GNU/LINUX, j&rsquo;écris un <mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color"><strong><em><span style="text-decoration: underline;">OUI</span></em></strong> </mark>majuscule (gras, italique, souligné rouge !).</p>



<p class="wp-block-paragraph">Bien que les chiffres ne soient pas réellement suivis, PostgreSQL estime la part d&rsquo;environnement de production d&rsquo;environ (<a href="https://www.postgresql.org/community/survey/50-what-operating-system-is-your-primarylargest-production-postgresql-database-running-on">lien</a>) :</p>



<ul class="wp-block-list">
<li>52 % l&rsquo;usage sur les systèmes GNU/LINUX</li>



<li>23% l&rsquo;usage sur les systèmes Windows</li>
</ul>



<p class="wp-block-paragraph">La raison de mon choix est que nous retrouvons un grand nombre d&rsquo;appliance qui utilise PostgreSQL dans des environnements GNU/UNIX. Donc en tant que SysAdmin il faut bien savoir se positionner 🙂 (franchement, quelle remarque de me*de&#8230;).</p>



<p class="wp-block-paragraph">Je considère que l&rsquo;environnement sera durci selon les recommandations de l&rsquo;ANSSI<sup data-fn="172c5b99-4041-4446-85b6-d02e927f1b6e" class="fn"><a href="#172c5b99-4041-4446-85b6-d02e927f1b6e" id="172c5b99-4041-4446-85b6-d02e927f1b6e-link">4</a></sup> concernant les systèmes GNU/LINUX et comme d&rsquo;accoutumé, je pars sur ma distribution RHEL favorite RockyLinux.</p>



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



<ul class="wp-block-list">
<li><strong>SE :</strong>
<ul class="wp-block-list">
<li>Rocky Linux 9.4 et version ultérieures</li>
</ul>
</li>



<li><strong>Apps :&nbsp;</strong>
<ul class="wp-block-list">
<li>PostgreSQL 18.4</li>
</ul>
</li>



<li><strong>Autres :</strong>
<ul class="wp-block-list">
<li>Non applicable</li>
</ul>
</li>
</ul>



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



<p class="wp-block-paragraph">L&rsquo;implémentation d&rsquo;un SGBD passe forcément par une réflexion de sa topologie. Nous ne balançons pas une application 1-tiers, on essaie à minima d&rsquo;adopter une architecture 2-Tiers. Soit 1 serveur Frontend et 1 serveur Backend.</p>



<p class="wp-block-paragraph">Pour des raisons qui sont évidentes (enfonçage de porte ouverte) une application publiée ne doit pas héberger la BDD. L&rsquo;application doit être en DMZ<sup data-fn="146573c3-30d5-479a-b375-824245002261" class="fn"><a href="#146573c3-30d5-479a-b375-824245002261" id="146573c3-30d5-479a-b375-824245002261-link">5</a></sup> et la BDD dans une autres bulles avec un contrôle des flux entrants et sortants interlans.</p>



<p class="has-text-align-center wp-block-paragraph"><strong>M&rsquo;sieur? Et pour l&rsquo;identification des flux ? Pour l&rsquo;attribution des ressources ? Comment on fait ?</strong></p>



<p class="wp-block-paragraph">Donnez moi un <strong>R</strong>, un <strong>T</strong>, un <strong>F</strong> et un <strong>M</strong>&#8230; <strong>RTFM</strong><sup data-fn="8cf51c44-be31-4dbd-91c3-7dfca8006d40" class="fn"><a href="#8cf51c44-be31-4dbd-91c3-7dfca8006d40" id="8cf51c44-be31-4dbd-91c3-7dfca8006d40-link">6</a></sup> ! Il suffit encore une fois d&rsquo;avoir le courage de se palucher le wiki de l&rsquo;éditeur applicatif. Un peu d&rsquo;huile de coude n&rsquo;a jamais fait de mal.</p>



<p class="wp-block-paragraph">Une fois la topologie bien pensée, passons à l&rsquo;architecture de notre serveur BDD.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Comme tout SGBD déployé il convient au minima d&rsquo;implémenter la topologie ci-contre. Soit, un disque dédié au système UNIQUEMENT. Un disque dédié au stockage des données de notre SGBD et en dernier lieu un disque dédié au dump de nos BDDs avec une périodicité définie.<br><br>J&rsquo;ajouterai également un quatrième disque quant aux journaux de la BDDs et les journaux de transaction (les fameux transaction logs). Toutefois, ayant une petite infrastructure, je m&rsquo;octroie le luxe de laisser ces derniers dans le /var/log.</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="408" class="wp-image-3251" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2025/10/APP_011_001_Macro.jpg" alt=""></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<h4 class="wp-block-heading">Hardware Requirements</h4>



<p class="wp-block-paragraph">Niveau des ressources là c&rsquo;est une autre histoire&#8230; Si la documentation officielle nous communique les ressources et interopérabilités avec les dépendances tierces, je n&rsquo;ai malheureusement pas trouvé d&rsquo;informations sur les ressources matérielles. Dans un sens logique car cela va dépendre de ce que nous souhaitons traiter comme données etc.</p>



<p class="wp-block-paragraph">J&rsquo;ai donc décidé d&rsquo;appliquer de mon plein gré et non sous la contrainte de calquer les recommandations MariaDB (<a href="https://mariadb.com/docs/analytics/mariadb-columnstore/management/deployment/columnstore-minimum-hardware-specification">lien</a>). Toutefois, cela fait un peu beaucoup pour moi&#8230;</p>



<p class="wp-block-paragraph">Je partirai donc pour un minimum <strong>2 vCPU</strong> et <strong>4 Gio</strong> de <strong>RAM</strong>. Dans l&rsquo;idéal, je serai je pense sur du <strong>4 vCPU</strong> et <strong>8 Gio</strong> de RAM. Comme écrit plus haut, tout dépendra de ce que notre application va consommer en termes de traitement. Il faudra alors <em>raisonner en bon père de famille</em> (spéciale dédicasse) et ajuster les ressources afin d&rsquo;éviter la sur ou sous allocation.</p>



<p class="wp-block-paragraph">Côté réseau, la documentation nous indique que le port <strong>5432/tcp</strong> est le port de communication par défaut. Surprise, nous pouvons changer le port dans le fichier de configuration&#8230;</p>



<p class="wp-block-paragraph">Je pense qu&rsquo;avec le peu de base énoncée, nous pouvons passer à la pratique.</p>



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



<p class="wp-block-paragraph">Un dernier point pour faire une magnifique transition entre la théorie et cette partie. Il est à noter que les dépôts officiels des distributions contiennent une version de la solution PostgreSQL. Toutefois, il ne s&rsquo;agit généralement pas de la dernière version. Il est recommandé d&rsquo;ajouter le dépôt de l&rsquo;éditeur et de ne pas utiliser le dépôt système pour PostgreSQL.</p>



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



<p class="wp-block-paragraph">Franchement, je trouve là la démarche super-mega overcool de proposer un webwizard pour définir comment déployer PostgreSQL selon les différents OS<sup data-fn="93299765-13f1-4d26-b6e1-157c6dc967ca" class="fn"><a href="#93299765-13f1-4d26-b6e1-157c6dc967ca" id="93299765-13f1-4d26-b6e1-157c6dc967ca-link">7</a></sup> et distributions (nous noterons au passage un excellent usage de la figure de style hyperbolique) (<a href="https://www.postgresql.org/download/">lien</a>).</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="559" src="https://erwanguillemard.com/wp-content/uploads/2025/10/APP_011_002_Install_Wizard-1024x559.jpg" alt="" class="wp-image-3252" srcset="https://erwanguillemard.com/wp-content/uploads/2025/10/APP_011_002_Install_Wizard-1024x559.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2025/10/APP_011_002_Install_Wizard-300x164.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/10/APP_011_002_Install_Wizard-768x419.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2025/10/APP_011_002_Install_Wizard.jpg 1523w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Je ne vais pas copier bêtement le script proposé. Mais reprendre chacune des lignes. Ce que je trouve admirable, c&rsquo;est la simplicité du déploiement. Pas besoin d&rsquo;installer 10k de dépendance en amont et de configurer ces dernières. </p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3247_4a47c7-b1 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-pane3247_9174dd-7e"><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>1 &#8211; Ajout du repo</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="wp-block-paragraph">A partir du lien fournit par le webwizard installer le nouveau repo :</p>



<p class="wp-block-paragraph"></p>



<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-80"><code>$ sudo dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="374" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_001_Install_REPO-1024x374.jpg" alt="" class="wp-image-3256" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_001_Install_REPO-1024x374.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_001_Install_REPO-300x110.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_001_Install_REPO-768x281.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_001_Install_REPO-1536x562.jpg 1536w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_001_Install_REPO.jpg 1898w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3247_e9b6fd-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>2 &#8211; Désactivation du package de la source de distribution</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="wp-block-paragraph">Comme indiqué précédemment, il convient de désactiver la version de postgreSQL contenu dans le repo par défaut. Ainsi, nous aurons une plus grande flexibilité dans le choix de version de nos composants.</p>



<p class="wp-block-paragraph">A noter que mon système étant durci j&rsquo;ai été contrait de réaliser l&rsquo;opération en tant que root.</p>



<p class="wp-block-paragraph"></p>



<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-81"><code># dnf -qy module disable postgresql</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="867" height="611" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_002_Install_REPO.jpg" alt="" class="wp-image-3258" style="width:597px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_002_Install_REPO.jpg 867w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_002_Install_REPO-300x211.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_002_Install_REPO-768x541.jpg 768w" sizes="auto, (max-width: 867px) 100vw, 867px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane3247_ded978-9c"><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>3 &#8211; Installation du Server PostgreSQL</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="wp-block-paragraph">Rien de plus simple, il suffit de faire une petite recherche par précaution puis une installation de notre package.</p>



<p class="wp-block-paragraph"></p>



<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-82"><code># dnf search postgresql18-server
# dnf install postgresql18-server</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="224" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_003_Install_REPO-1024x224.jpg" alt="" class="wp-image-3259" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_003_Install_REPO-1024x224.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_003_Install_REPO-300x66.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_003_Install_REPO-768x168.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_003_Install_REPO-1536x336.jpg 1536w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_003_Install_REPO.jpg 1904w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane3247_998fe7-16"><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>4 &#8211; Initialisation et démarrage</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="wp-block-paragraph">Comme tous SGBDs, il convient d&rsquo;initier la première installation. Puis de s&rsquo;assurer que le service va être lancer automatiquement au démarrage du système en cas de reboot.</p>



<p class="wp-block-paragraph">Pour conclure, le traditionnel démarrage de notre daemon.</p>



<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-83"><code># /usr/pgsql-18/bin/postgresql-18-setup initdb
# systemctl enable postgresql-18
# systemctl start postgresql-18</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="89" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_004_Install_REPO-1024x89.jpg" alt="" class="wp-image-3260" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_004_Install_REPO-1024x89.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_004_Install_REPO-300x26.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_004_Install_REPO-768x67.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_004_Install_REPO.jpg 1432w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">Pour le fun, une petite vérification 🙂</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="368" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_005_Install_REPO-1024x368.jpg" alt="" class="wp-image-3261" style="width:665px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_005_Install_REPO-1024x368.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_005_Install_REPO-300x108.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_005_Install_REPO-768x276.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_003_005_Install_REPO.jpg 1512w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div></div></div></div>
</div></div></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Notre daemon PostgreSQL étant déployé, j&rsquo;arrive toujours à ce point d&rsquo;application des bonnes pratiques systèmes. C&rsquo;est là que ça peut être délicat si on se plante dans la configuration car cela peut mener à repartir de zéro. D&rsquo;où l&rsquo;importance de lire la documentation encore une fois.</p>



<p class="has-text-align-center wp-block-paragraph"><a href="https://www.youtube.com/watch?v=B4WJk2G9g38">C&rsquo;est qu&rsquo;un éléphant ça trompe énormément !</a></p>



<p class="wp-block-paragraph">Et voilà comment on casse tout 😀</p>



<h3 class="wp-block-heading">Déplacement de la BDD Location</h3>



<p class="wp-block-paragraph">Si nous gardons la topologie mis en place ci-haut, il sera nécessaire de déplacer le répertoire data stocké sur <strong>/var/lib/pgsql/18/data</strong> vers notre répertoire <strong>/mnt/database/postgresql/data</strong> monté sur notre disque <strong>/dev/sdb</strong>.</p>



<p class="wp-block-paragraph">Je ne vais pas mentir, je me suis pris les pieds dans le tapis une fois et j&rsquo;ai dû restaurer ma VM. Toutefois, les étapes ci-dessous sont bien éprouvées et valide.</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3247_981a8d-b1 kt-accordion-has-6-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-pane3247_3b8c7b-15"><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>1 &#8211; Arret du service</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="wp-block-paragraph">La base de la base est donc d&rsquo;arrêter le service postgresql :</p>



<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-84"><code>$ sudo systemctl stop postgresql-18.service
$ sudo systemctl status postgresql-18.service</code></pre>



<p class="wp-block-paragraph">Il est primordiale de s&rsquo;assurer que le service ne tourne plus.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3247_bca34b-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>2 &#8211; Création de l&rsquo;architecture cible</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="wp-block-paragraph">Sur notre partition <strong>/dev/sdb1</strong> préalablement configurée et montée sur <strong>/mnt/database</strong>, nous allons créer et définir les droits et permissions pour autoriser notre compte postgres à accéder à ce dernier.</p>



<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-85"><code>$ sudo mkdir /mnt/database/postgresql
$ sudo mkdir /mnt/database/postgresql/pg_sock
$ sudo mkdir /mnt/database/postgresql/data
$ sudo chown postgres:postgres /mnt/database/postgresql
$ sudo chmod 755 /mnt/database
$ sudo chmod 700 -R /mnt/database/postgresql</code></pre>



<p class="wp-block-paragraph">Mais alors pourquoi 700 ? La base de donnée ainsi que l&rsquo;ensemble des fichiers de ressources doivent être accessible uniquement de l&rsquo;application par sécurité.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane3247_ecd500-37"><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>3 &#8211; Déplacement des données</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="wp-block-paragraph">Comme j&rsquo;ai pris l&rsquo;habitude de faire comme pour MariaDB, je vais copier le contenu du répertoire data puis renommer la source afin d&rsquo;éviter tous dysfonctionnements.</p>



<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-86"><code>$ sudo rsync -av /var/lib/pgsql/18/data/ /mnt/database/postgresql/data/
$sudo mv /var/lib/pgsql/18/data /var/lib/pgsql/18/data.ori</code></pre>



<p class="wp-block-paragraph">Une erreur classique lors de l&rsquo;usage de la commande rsync reste l&rsquo;oublie du <strong>/</strong>. Cela entrainera la copie du répertoire et non de son contenu uniquement. En gros, ça va bégayer dans les chemins (../postgresql/data/data/&#8230;).</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane3247_9e61f4-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>4 &#8211; Modification de la configuration du service</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="wp-block-paragraph">Le service est configuré pour démarrer le daemon sous <strong>/var/lib/psql/18</strong>. Pour prendre en charge le nouveau chemin, il faut modifier ce dernier. La philosophie et de surcharger la configuration.</p>



<p class="wp-block-paragraph">Créer le répertoire qui va contenir la surcharge de notre daemon psql :</p>



<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-87"><code>$ sudo mkdir -p /etc/systemd/system/postgresql-18.service.d</code></pre>



<p class="wp-block-paragraph">Créer un fichier de surcharge qui va contenir le chemin du répertoire data :</p>



<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-88"><code>$ sudo tee /etc/systemd/system/postgresql-18.service.d/override.conf &gt; /dev/null &lt;&lt;'EOF'
<strong>&#91;Service]
Environment="PGDATA=/mnt/database/postgresql/data/"
EOF</strong></code></pre>



<p class="wp-block-paragraph">Par acquis de conscience, j&rsquo;aime vérifier que le fichier est bien présent ainsi que le contenu de ce dernier.</p>



<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-89"><code>$ sudo cat /etc/systemd/system/postgresql-18.service.d/override.conf</code></pre>



<p class="wp-block-paragraph">Le daemon &lsquo;system&rsquo; a été altéré (puisque j&rsquo;ai ajouté une configuration) et donc ? Un petit reload des familles pour prendre en compte le changement et zou.</p>



<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-90"><code>$ sudo systemctl daemon-reload</code></pre>



<p class="wp-block-paragraph"></p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-5 kt-pane3247_cfaebc-a8"><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>5 &#8211; SELinux</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="wp-block-paragraph">Un étape un peu border avec la sécurité (comme un excès de Delirium un jeudi soir pour oublier une semaine compliqué).</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="600" height="600" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_006_000_MoveData.png" alt="" class="wp-image-3270" style="width:180px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_006_000_MoveData.png 600w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_006_000_MoveData-300x300.png 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_006_000_MoveData-150x150.png 150w" sizes="auto, (max-width: 600px) 100vw, 600px" /></figure>
</div>


<p class="wp-block-paragraph">Toutefois, il est important de noter un petit point et non des moindres sur notre fichier <strong>/etc/fstab.</strong> Il va être nécessaire d&rsquo;ajouter le contexte sur notre partition et de relabeliser notre point partition.</p>



<p class="wp-block-paragraph">Editons le fichier avec VIM, VI ou NANO puis modifier la ligne comme ci-dessous en ajoutant au niveau des droits <strong><em>defaults,context=system_u:object_r:postgresql_db_t:s0</em></strong></p>



<p class="wp-block-paragraph">Ce qui veut dire en SELinux :</p>



<ul class="wp-block-list">
<li><strong><em>Defaults :</em></strong> Activation des droits standards</li>



<li><strong><em>Context=</em></strong>
<ul class="wp-block-list">
<li><strong><em>system_u </em></strong>: Identité SELinux, sans impact concernant notre SGBD</li>



<li><strong><em>object_r </em></strong>: Rôle d&rsquo;objet de type fichier</li>



<li><strong><em>postgresql_db_t </em></strong>: Match avec le type de données PostgreSQL autorisé par SELinux. Ainsi, SELinux interdit à PostgreSQL d&rsquo;accéder à des fichiers qui ne sont pas dans le contexte.</li>



<li><strong><em>s0 </em></strong>: Le niveau de sécurité par défaut.</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">Il sera nécessaire de définir le bon contexte sur notre nouveau répertoire.</p>



<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-91"><code>$ sudo semanage fcontext -a -t postgresql_db_t "/mnt/database/postgresql(/.*)?"
$ sudo restorecon -Rv /mnt/database/postgresql/</code></pre>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-6 kt-pane3247_000ea0-1b"><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>6 &#8211; Démarrage du service</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="wp-block-paragraph">Le moment de vérité.</p>



<p class="has-text-align-center wp-block-paragraph"><strong>Vais je vomir l&rsquo;ensemble de mes bières et commander une nouvelle tournée pour noyer mon échec ou commander une nouvelle tournée pour célébrer le succès de cette opération ? 🙂</strong></p>



<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-92"><code>$ sudo systemctl start postgresql-18
$ sudo systemctl status postgresql-18</code></pre>



<p class="wp-block-paragraph"></p>
</div></div></div>
</div></div></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Il faut noter que le service fonctionne. Néanmoins, il convient de se demander si nous pouvons requêter notre BDD à la suite de ce changement.</p>



<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-93"><code>$ sudo -u postgres psql -c "SELECT version();"</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="605" height="134" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_006_001_MoveData.jpg" alt="" class="wp-image-3271" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_006_001_MoveData.jpg 605w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_006_001_MoveData-300x66.jpg 300w" sizes="auto, (max-width: 605px) 100vw, 605px" /></figure>
</div>


<p class="wp-block-paragraph">Vérifions également que le chemin du PGDATA a bien été pris en compte.</p>



<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-94"><code>$ sudo -u postgres psql -c "SHOW data_directory;"</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="605" height="94" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_006_002_MoveData.jpg" alt="" class="wp-image-3272" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_006_002_MoveData.jpg 605w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_006_002_MoveData-300x47.jpg 300w" sizes="auto, (max-width: 605px) 100vw, 605px" /></figure>
</div>


<p class="has-text-align-center wp-block-paragraph">Ouf ça fonctionne 🙂</p>



<p class="wp-block-paragraph">Place à l&rsquo;étape suivante ! <a href="https://www.youtube.com/watch?v=zRcRtpgox0U">BA-BA-BAR POM POM POM POM</a></p>



<h3 class="wp-block-heading">Sécurisation &amp; Configuration</h3>



<p class="wp-block-paragraph">Nous revenons encore et toujours au même point. Qui dit données implique la sensibilité de ces dernières. Aujourd&rsquo;hui braquer une banque ne rapporte pas grand-chose. Le rapport bénéfices/risques n&rsquo;est pas bon&#8230; Mais braqué des données, utiliser ces dernières et les revendre apporte un bien meilleur rapport en termes de bénéfices / risques.</p>



<p class="wp-block-paragraph">Donc, je me retrousse les manches car je ne suis pas un manche !</p>



<p class="wp-block-paragraph">Si du côté <strong>MariaDB</strong> il existe le fameux <mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color">mysql_secure_installation</mark>, ce n&rsquo;est malheureusement pas le cas chez <strong>PostgreSQL</strong>.</p>



<p class="wp-block-paragraph">Il se pose alors de dresser un inventaire rapide des points que nous souhaitons sécuriser :</p>



<ol class="wp-block-list">
<li>Mot de passe du compte postgres</li>



<li>Restreindre l&rsquo;accès réseaux</li>



<li>Mettre en place une stratégie d&rsquo;authentification</li>



<li>Utiliser des algorithmes de chiffrement fort</li>



<li>Supprimer les BDDs inutiles</li>



<li>Droits sur les fichiers</li>



<li>SELinux</li>



<li>Firewall embarqué (même si je préfère le terme embedded)</li>



<li>Audit et Journaux d&rsquo;événements</li>
</ol>



<p class="wp-block-paragraph">Ca fait une petite tripoté n&rsquo;est-il pas ? Naturellement, certains des points ci-haut ont déjà été traité lors du déploiement et du changement d&#8217;emplacement de la base de données.</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3247_ac7a8e-1e kt-accordion-has-9-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-pane3247_c547cc-2a"><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>1 &#8211; Password Account DB </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="wp-block-paragraph">Comme pour MariaDB (compte root), l&rsquo;utilisateur postgres ne possède pas de mot de passe. Il convient par sécurité de définir ce dernier afin qu&rsquo;il ne vienne une idée à un individu malveillant (comme un RSSI <sup data-fn="8ee11f8e-018a-4440-a1e7-f35e89fcaa7d" class="fn"><a href="#8ee11f8e-018a-4440-a1e7-f35e89fcaa7d" id="8ee11f8e-018a-4440-a1e7-f35e89fcaa7d-link">8</a></sup>lors d&rsquo;un audit ou pire un SysDBA<sup data-fn="d3ddcc3d-b108-4e68-9df7-2f478eb4d83d" class="fn"><a href="#d3ddcc3d-b108-4e68-9df7-2f478eb4d83d" id="d3ddcc3d-b108-4e68-9df7-2f478eb4d83d-link">9</a></sup>) de mettre sa truffe humide dans notre BDD.</p>



<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-95"><code>$ su - postgres
$ psql -c "alter user postgres with password '<strong><mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color">MyP@ssw0rd</mark></strong>'"</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="181" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_001_SECU_postgres_user-1024x181.jpg" alt="" class="wp-image-3276" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_001_SECU_postgres_user-1024x181.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_001_SECU_postgres_user-300x53.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_001_SECU_postgres_user-768x135.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_001_SECU_postgres_user.jpg 1435w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">Il est important de faire un petit <strong><em>clear de l&rsquo;historique</em></strong> de frappe. Un mot de passe en clair c&rsquo;est pas cool. </p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3247_7f1d29-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>2 &#8211; Network Restrictions</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="wp-block-paragraph">Ouvrons le fichier de configuration <strong>/mnt/database/postgresql/data/postgresql.conf</strong>.</p>



<p class="wp-block-paragraph">Attention comme indiqué précédemment, il faudra être authentifié en tant qu&rsquo;utilisateur postgres ou root.</p>



<p class="has-text-align-center wp-block-paragraph">Recherchez la section CONNECTIONS AND AUTHENTIFICATION.</p>



<p class="wp-block-paragraph">Se pose alors la question, depuis où je peux consulter ma BDDs et sur quel port ? Personnellement, le port je le laisse par défaut soit 5432/tcp. Toutefois, la source, il est bien de spécifier le subnet ou les adresses IPs qui sont autorisé à se connecter à notre SGBD. Naturellement, la valeur &lsquo;*&rsquo; est proscrite.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="903" height="295" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_002_SecurNetRestriction.jpg" alt="" class="wp-image-3285" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_002_SecurNetRestriction.jpg 903w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_002_SecurNetRestriction-300x98.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_002_SecurNetRestriction-768x251.jpg 768w" sizes="auto, (max-width: 903px) 100vw, 903px" /></figure>
</div>


<p class="wp-block-paragraph">Ce paramétrage va de pair avec la configuration de notre UTM<sup data-fn="5b9359c6-adcf-4f72-9501-604602846dc7" class="fn"><a href="#5b9359c6-adcf-4f72-9501-604602846dc7" id="5b9359c6-adcf-4f72-9501-604602846dc7-link">10</a></sup> embedded (cf le point plus bas).</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane3247_0e912b-42"><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>3 &#8211; Authentification Policies</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="wp-block-paragraph">On va changer de fichier. L&rsquo;objectif est de définir <strong>qui</strong> va se connecter à <strong>quoi</strong>, <strong>comment</strong> et depuis<strong> où</strong>.</p>



<p class="wp-block-paragraph">Direction <strong>/mnt/database/postgresql/data/pg_hba.conf</strong></p>



<p class="wp-block-paragraph">La logique de lecture est la suivante TYPE correspond à la nature de l&rsquo;authentification (local? hôte ?) pour quelle DATABASE (all ? replication ? db_test ?) pour quel USER (all ? r-one ?) depuis quelle ADDRESS (127.0.0.1/32 ? 0.0.0.0/0 ? 10.36.16.0/24 ?) et par quel METHOD (peer ? scram-sha-256? MD5?).</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="865" height="465" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_002_SECU_postgres_authmethod.jpg" alt="" class="wp-image-3277" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_002_SECU_postgres_authmethod.jpg 865w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_002_SECU_postgres_authmethod-300x161.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_002_SECU_postgres_authmethod-768x413.jpg 768w" sizes="auto, (max-width: 865px) 100vw, 865px" /></figure>
</div>


<p class="wp-block-paragraph">Il est certain qu&rsquo;il faut limiter l&rsquo;usage au maximum du all comme du masque 0.0.0.0/0. Toutefois, il n&rsquo;y a pas de base les paramètres « implicites » de refus des connexions. C&rsquo;est donc à implémenter (dernières lignes de la capture d&rsquo;écran).</p>



<p class="wp-block-paragraph">On sauvegarde, puis on reload le service.</p>



<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-96"><code>$ sudo systemctl reload postgresql-18</code></pre>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane3247_28b64d-f5"><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>4 &#8211; Suite de chiffrement</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="wp-block-paragraph">Toujours dans le fichier de configuration <strong>/mnt/database/postgresql/data/postgresql.conf</strong>. Attention comme indiqué précédemment, il faudra être authentifié en tant qu&rsquo;utilisateur postgres ou root.</p>



<p class="wp-block-paragraph">Recherchez la section CONNECTIONS AND AUTHENTIFICATION et activez l&rsquo;algorithme de chiffrement <strong>scram-sha-256</strong>. Le <strong>MD5</strong>, nous passons notre tour hein ? Autant allez aux champignons sans capotes, c&rsquo;est du pareil au même.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="861" height="124" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_004_SecurAlgo.jpg" alt="" class="wp-image-3284" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_004_SecurAlgo.jpg 861w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_004_SecurAlgo-300x43.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_004_SecurAlgo-768x111.jpg 768w" sizes="auto, (max-width: 861px) 100vw, 861px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-5 kt-pane3247_398349-d5"><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>5 &#8211; Nettoyage des BDDs inutiles</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="wp-block-paragraph">Il est important de lister les bases présentes sur notre SGBD et de supprimer les bases qui ne servent à rien.</p>



<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-97"><code>$ su - postgres  -c "\l"
$ psql

postgres=#\l
postgres=# DROP DATABASE NAME_BDD;</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="300" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_005_SecurBDD-1024x300.jpg" alt="" class="wp-image-3283" style="width:672px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_005_SecurBDD-1024x300.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_005_SecurBDD-300x88.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_005_SecurBDD-768x225.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_005_SecurBDD.jpg 1278w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">Attention : Il ne faut en aucun cas supprimer les bases template0 et template1. Ces dernières permettent (pour la 1) de générer les futurs BDDs) et (pour la 0) de regénérer la BDD de modèle.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-6 kt-pane3247_3f7584-a2"><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>6 &#8211; Permissions et ACLs</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="wp-block-paragraph">Comme expliqué ci haut et pour des raisons évidentes. L&rsquo;accès aux données doivent être accessible uniquement du compte utilisateur postgres et root. Pas de quoi foutez milles éléphants&#8230;</p>



<p class="wp-block-paragraph">Je glisse toutefois les commandes.</p>



<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-98"><code>$ sudo chown -R postgres:postgres /mnt/database/postgresql/data
$ sudo chmod 700 /mnt/database/postgresql/data</code></pre>



<p class="wp-block-paragraph"></p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-7 kt-pane3247_596968-8b"><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>7 &#8211; SELinux &lt;3</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="wp-block-paragraph">Nous retrouvons la commande saisie ci-haut si nous avons modifié le database location.</p>



<p class="wp-block-paragraph">Ainsi nous définissons le contexte de fichier de type <strong>postgresql_db_t </strong>à l&rsquo;ensemble des éléments qui sont situer sous <strong>/mnt/database/postgresql</strong>. Puis on restore le contexte.</p>



<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-99"><code>$ sudo semanage fcontext -a -t postgresql_db_t "/mnt/database/postgresql(/.*)?"
$ sudo restorecon -Rv /mnt/database/postgresql/</code></pre>



<p class="wp-block-paragraph"></p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-8 kt-pane3247_481508-49"><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>8 &#8211; Firewall</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="wp-block-paragraph">Avant c&rsquo;était iptables maintenant c&rsquo;est firewalld ou ufw. Personnellement je reste sur la configuration de firewalld.</p>



<p class="wp-block-paragraph">Il convient d&rsquo;autoriser les flux 5432/tcp dans notre firewall si des connexions se font depuis un autre réseau ou une autre machine.</p>



<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-100"><code>$ sudo firewall-cmd --permanent --add-service=postgresql
$ sudo firewall-cmd --reload</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="916" height="104" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_008_SecurFirewall.jpg" alt="" class="wp-image-3278" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_008_SecurFirewall.jpg 916w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_008_SecurFirewall-300x34.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_008_SecurFirewall-768x87.jpg 768w" sizes="auto, (max-width: 916px) 100vw, 916px" /></figure>
</div>


<p class="wp-block-paragraph">Cela étant, il serait également plus précis de filtrer les connexions entrantes sur un réseau ou une adresse ip uniquement sur le port 5432/tcp.</p>



<p class="wp-block-paragraph">J&rsquo;assume cette configuration du fait de mon UTM en amont qui filtre l&rsquo;ensemble des flux inter-lans.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-9 kt-pane3247_2ab698-4d"><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>9 &#8211; Logs &amp; Audits</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="wp-block-paragraph">Ouvrons le fichier de configuration <strong>/mnt/database/postgresql/data/postgresql.conf</strong>. Attention comme indiqué précédemment, il faudra être authentifié en tant qu&rsquo;utilisateur postgres ou root.</p>



<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-101"><code># vim /mnt/database/postgresql/data/postgresql.conf</code></pre>



<p class="wp-block-paragraph">Se rendre ensuite dans la section REPORTING AND LOGGING. Puis vérifiez que la configuration suivante est active.</p>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Activation de <strong>logging_collector</strong> sur <strong>on</strong> afin de récupérer les erreurs sous la forme json ou csv.<br><br>L&#8217;emplacement où va être stocké les journaux. Par défaut celui-ci se trouve dans le répertoire log. Il faudra renseigner si l&#8217;emplacement est différent le chemin absolu, le chemin relatif si c&rsquo;est un cluster.<br><strong>log_directory = &lsquo;log&rsquo;</strong><br><br>Le nom du fichier, par défaut ce dernier est sous le format <strong>postgresql-%Y-%m-%d_%H%M%S.log</strong>.<br><strong>log_filename = &lsquo;postgresql-%a.log&rsquo;</strong><br><br>Activer la journalisation pour l&rsquo;ensemble des événements de connexion et de déconnexion.<br><strong>log_connections = on<br>log_disconnections = on</strong><br><br>En guise de traitement des logs, nous choisirons ddl pour avoir les définitions des commandes utilisés. Attention, l&rsquo;usage de all peut être dangereux vis à vis des ressources.<br><strong>log_statement = &lsquo;ddl&rsquo;</strong></td><td><img loading="lazy" decoding="async" width="550" height="598" class="wp-image-3279" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_009_LogAudits.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_009_LogAudits.jpg 607w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_005_009_LogAudits-276x300.jpg 276w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>
</div></div></div>
</div></div></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Une fois les modifications apportées, n&rsquo;oubliez pas que notre serveur PostgreSQL à besoin d&rsquo;être redémarré :</p>



<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-102"><code>$ sudo systemctl restart postgresql-18</code></pre>



<p class="wp-block-paragraph">Pour une configuration spécifique comme la gestion de la mémoire allouée, les fonctionnalités et j&rsquo;en passe. Je pense qu&rsquo;il est inutile d&rsquo;aborder cela dans ce billet.</p>



<p class="wp-block-paragraph">Pourquoi ? Parce que cet aspect-là et intrinsèquement lié aux dépendances des applications qui nécessite le SGBD PostgreSQL.</p>



<h3 class="wp-block-heading">Premiers Pas</h3>



<p class="wp-block-paragraph">Cette sous partie vise plus à entrevoir les commandes de bases pour instancier une BDD dans le cadre de déploiement d&rsquo;une application (spoiler Odoo par exemple ?).</p>



<p class="wp-block-paragraph">Je n&rsquo;ai pas la prétention de réinventer la roue, il existe la documentation pour cela et je n&rsquo;ai pas non plus la prétention de devenir SysDBA. J&rsquo;ai juste envie de faire les choses bien et surtout en suivant la doctrine des 3S, Simple, Standard et Sécurisé (14 ans d&rsquo;ESN<sup data-fn="d2a363b8-1043-4f02-8054-3cb17bef0b81" class="fn"><a href="#d2a363b8-1043-4f02-8054-3cb17bef0b81" id="d2a363b8-1043-4f02-8054-3cb17bef0b81-link">11</a></sup> ça vous forge un homme !).</p>



<h4 class="wp-block-heading">Création d&rsquo;un user</h4>



<p class="wp-block-paragraph">La création d&rsquo;un utilisateur suit un paradigme différent de MariaDB. La finesse de l&rsquo;application du contexte d&rsquo;un utilisateur se fera dans le fichier <strong>pg_hba.conf</strong>.</p>



<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-103"><code>$ psql -U postgres

postgres=# CREATE USER user_odoo WITH PASSWORD 'MyPassw0rd';</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="789" height="74" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_001_pgsql_createuser.jpg" alt="" class="wp-image-3308" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_001_pgsql_createuser.jpg 789w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_001_pgsql_createuser-300x28.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_001_pgsql_createuser-768x72.jpg 768w" sizes="auto, (max-width: 789px) 100vw, 789px" /></figure>
</div>


<h4 class="wp-block-heading">Création d&rsquo;une BDD</h4>



<p class="wp-block-paragraph">La création d&rsquo;une BDD nécessite qu&rsquo;un utilisateur (de la SGBD naturellement) ait le privilège <strong>CREATEDB</strong> ou d&rsquo;utiliser un compte <strong>super utilisateur</strong>. Cela parait logique mais pas pour tout le monde. La documentation nous rappelle que la création d&rsquo;une nouvelle base de données sera effectué en réalisant un clone de la BDD template1 (si, le truc qui ne fallait pas supprimer).</p>



<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-104"><code>postgres=# CREATE DATABASE bdd_odoo;</code></pre>



<p class="wp-block-paragraph">Toutefois, nous pouvons allez plus loin en définissant le propriétaire de la BDD, le jeu de caractère de la BDD ainsi que la collation locale afin de faciliter le tri des chaines. Par exemple :</p>



<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-105"><code>postgres=# CREATE DATABASE bdd_odoo_18
			WITH OWNER user_odoo
			ENCODING 'UTF8'
			LC_COLLATE 'fr_FR.UTF-8'
			LC_CTYPE 'fr_FR.UTF-8'
			TEMPLATE template0;</code></pre>



<p class="has-text-align-center wp-block-paragraph"><strong><mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color">/!\</mark> ARTUNG <mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color">/!\</mark> Bicyclette et petit vélo !</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Il n&rsquo;est pas impossible que vous tombiez sur une erreur de ce type « <em>invalid LC_COLLATE locale name</em>« . Cela signifie que tu vivras ta vie sans aucun soucis. (Tes vraiment sûre ?)<br>En gros, il manque le fichier de mappage de caractère au niveau système. Soit il n&rsquo;est pas présent, soit il n&rsquo;est pas généré.</td><td><img loading="lazy" decoding="async" width="550" height="182" class="wp-image-3309" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_002_pgsql_errorencodage.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_002_pgsql_errorencodage.jpg 617w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_002_pgsql_errorencodage-300x99.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Afin de vérifier si ce dernier est présent :</p>



<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-106"><code>$ sudo locale -a | grep fr</code></pre>



<p class="wp-block-paragraph">Si cela ne retourne rien c&rsquo;est que le packet ne doit pas être installé. Alors installons le vin diou !</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-3-background-color has-text-color has-background has-link-color wp-elements-107"><code>$ sudo dnf install glibc-langpack-fr
$ sudo locale -a | grep fr</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="868" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_003_pgsql_installencodage-1024x868.jpg" alt="" class="wp-image-3310" style="width:722px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_003_pgsql_installencodage-1024x868.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_003_pgsql_installencodage-300x254.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_003_pgsql_installencodage-768x651.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_003_pgsql_installencodage.jpg 1033w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">Surprise le fichier de mappage est présent ! Si nous rejouons la requête, cela fonctionne.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="281" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_004_pgsql_bddcreate-1024x281.jpg" alt="" class="wp-image-3311" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_004_pgsql_bddcreate-1024x281.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_004_pgsql_bddcreate-300x82.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_004_pgsql_bddcreate-768x211.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_004_pgsql_bddcreate.jpg 1466w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<h4 class="wp-block-heading">Attribution des privilèges et rôles</h4>



<p class="wp-block-paragraph">Comme tous systèmes de base de données, un incontournable reste la notion de rôle et de privilège. </p>



<p class="wp-block-paragraph">Dans la pratique, il convient et je sais que j&rsquo;enfonce une porte ouverte d&rsquo;adopter la bonne pratique de créer des rôles et d&rsquo;affecter les rôles aux utilisateurs. Un rôle sur la BDD en modification, en lecture, superutilisateur ect. </p>



<p class="wp-block-paragraph">Ainsi et c&rsquo;est d&rsquo;une logique implacable, si modification il doit avoir, je ne modifierai <span style="text-decoration: underline;"><strong>QUE</strong></span> le rôle et non utilisateur par utilisateur. MALINX le LYNX&#8230;</p>



<h5 class="wp-block-heading">Rôles</h5>



<p class="wp-block-paragraph">Par défaut, nous retrouvons :</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">SUPERUSER</td><td>Accès total à tout le serveur</td></tr><tr><td class="has-text-align-center" data-align="center">CREATEDB</td><td>Peut créer des bases de données</td></tr><tr><td class="has-text-align-center" data-align="center">CREATEROLE</td><td>Peut créer, modifier ou supprimer d&rsquo;autres rôles</td></tr><tr><td class="has-text-align-center" data-align="center">INHERIT</td><td>Hérite des privilèges des rôles dont il est membre (activé par défaut)</td></tr><tr><td class="has-text-align-center" data-align="center">LOGIN</td><td>Peut se connecter à PostgreSQL</td></tr><tr><td class="has-text-align-center" data-align="center">REPLICATION</td><td>Peut initier des connexions de réplication</td></tr><tr><td class="has-text-align-center" data-align="center">BYPASSRLS</td><td>Ignore les politiques de sécurité par lignes</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Toujours dans le spoil (parce que <a href="https://www.youtube.com/watch?v=Txz9toiMFnE">je suis un mec underground moi. MOUMOUNIGAN !</a>) je vais créer un rôle pour ODOO qui permettra uniquement de se connecter, de créer une bdd avec un mot de passe.</p>



<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-108"><code>postgres=# CREATE ROLE r_odoo LOGIN CREATEDB;</code></pre>



<p class="wp-block-paragraph">Pour attribuer le rôle à un utilisateur (en prenant toujours le cas ODOO avec notre role r_odoo et user_odoo) :</p>



<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-109"><code>postgres=# GRANT r_odoo TO user_odoo;</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="835" height="246" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_005_pgsql_grant.jpg" alt="" class="wp-image-3312" style="width:652px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_005_pgsql_grant.jpg 835w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_005_pgsql_grant-300x88.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_008_005_pgsql_grant-768x226.jpg 768w" sizes="auto, (max-width: 835px) 100vw, 835px" /></figure>
</div>


<h5 class="wp-block-heading">Privilèges</h5>



<p class="wp-block-paragraph">La notion de privilèges que ce soit sur la BDD, les tables où les schémas suivent le principe de SQL. Ainsi il suffira d&rsquo;user des commandes GRANT accompagner de :</p>



<ul class="wp-block-list">
<li>CONNECT ON</li>



<li>USAGE</li>



<li>SELECT ON ALL</li>



<li>SELECT, INSERT, UPDATE, DELETE</li>



<li>ALTER</li>



<li>DROP</li>



<li>&#8230;</li>
</ul>



<p class="wp-block-paragraph">Il est important de prendre en compte que le propriétaire de la BDD <span style="text-decoration: underline;"><strong>a tous les droits</strong></span>.</p>



<p class="wp-block-paragraph">Toujours dans notre exemple ODOO, il n&rsquo;y aura donc pas de privilèges à appliquer.</p>



<h2 class="wp-block-heading">PostgreSQL Client</h2>



<p class="wp-block-paragraph">Il existe un outil que j&rsquo;ai découvert à travers un case chez VEEAM pour un problème de protection O365 du nom de pgAdmin. Cette solution officielle est l&rsquo;outil graphique pour administrer PostrgreSQL.</p>



<p class="wp-block-paragraph">Je pense important de présenter cette dernière car dans le cas où nous ne nous serions pas <strong><em>SQL native language</em></strong> ou <strong><em>seconde langue</em></strong>. Cela nous permettrait de bien comprendre certains dysfonctionnements ou structures.</p>



<p class="wp-block-paragraph">L&rsquo;installation n&rsquo;est pas en soi bien complexe&#8230; Ma grand-mère y arriverait sans difficulté. Toutefois, je glisse le tips&#8230;</p>


<div class="kb-gallery-wrap-id-3247_8318b5-7d alignnone wp-block-kadence-advancedgallery"><div class="kb-gallery-ul kb-gallery-non-static kb-gallery-type-fluidcarousel kb-gallery-id-3247_8318b5-7d kb-gallery-caption-style-bottom-hover kb-gallery-filter-none" data-image-filter="none" data-lightbox-caption="true"><div class="kt-blocks-carousel splide kt-carousel-container-dotstyle-dark kt-carousel-arrowstyle-whiteondark kt-carousel-dotstyle-dark kb-slider-group-arrow kb-slider-arrow-position-center" data-slider-anim-speed="400" data-slider-scroll="1" data-slider-arrows="true" data-slider-dots="true" data-slider-hover-pause="false" data-slider-auto="" data-slider-speed="7000" data-slider-type="fluidcarousel" data-slider-center-mode="true" data-slider-gap="10px" data-slider-gap-tablet="10px" data-slider-gap-mobile="10px" data-show-pause-button="false"><div class="splide__track"><ul class="kt-blocks-carousel-init kb-blocks-fluid-carousel splide__list"><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_001_pgadmin.jpg" width="526" height="415" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_001_pgadmin.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_001_pgadmin.jpg" data-id="3294" class="wp-image-3294 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_001_pgadmin.jpg 526w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_001_pgadmin-300x237.jpg 300w" sizes="auto, (max-width: 526px) 100vw, 526px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_002_pgadmin.jpg" width="520" height="412" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_002_pgadmin.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_002_pgadmin.jpg" data-id="3295" class="wp-image-3295 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_002_pgadmin.jpg 520w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_002_pgadmin-300x238.jpg 300w" sizes="auto, (max-width: 520px) 100vw, 520px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_003_pgadmin.jpg" width="523" height="412" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_003_pgadmin.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_003_pgadmin.jpg" data-id="3296" class="wp-image-3296 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_003_pgadmin.jpg 523w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_003_pgadmin-300x236.jpg 300w" sizes="auto, (max-width: 523px) 100vw, 523px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_004_pgadmin.jpg" width="522" height="413" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_004_pgadmin.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_004_pgadmin.jpg" data-id="3297" class="wp-image-3297 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_004_pgadmin.jpg 522w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_004_pgadmin-300x237.jpg 300w" sizes="auto, (max-width: 522px) 100vw, 522px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_005_pgadmin.jpg" width="524" height="413" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_005_pgadmin.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_005_pgadmin.jpg" data-id="3298" class="wp-image-3298 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_005_pgadmin.jpg 524w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_005_pgadmin-300x236.jpg 300w" sizes="auto, (max-width: 524px) 100vw, 524px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_006_pgadmin.jpg" width="522" height="410" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_006_pgadmin.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_006_pgadmin.jpg" data-id="3299" class="wp-image-3299 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_006_pgadmin.jpg 522w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_006_pgadmin-300x236.jpg 300w" sizes="auto, (max-width: 522px) 100vw, 522px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_007_pgadmin.jpg" width="520" height="411" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_007_pgadmin.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_007_pgadmin.jpg" data-id="3300" class="wp-image-3300 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_007_pgadmin.jpg 520w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_007_pgadmin-300x237.jpg 300w" sizes="auto, (max-width: 520px) 100vw, 520px" /></div></div></figure></div></div></li><li class="kb-slide-item kb-gallery-carousel-item splide__slide"><div class="kadence-blocks-gallery-item"><div class="kadence-blocks-gallery-item-inner"><figure class="kb-gallery-figure kadence-blocks-gallery-item-hide-caption"><div class="kb-gal-image-radius"><div class="kb-gallery-image-contain" ><img loading="lazy" decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_008_pgadmin.jpg" width="783" height="626" alt="" data-full-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_008_pgadmin.jpg" data-light-image="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_008_pgadmin.jpg" data-id="3301" class="wp-image-3301 skip-lazy" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_008_pgadmin.jpg 783w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_008_pgadmin-300x240.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_008_pgadmin-768x614.jpg 768w" sizes="auto, (max-width: 783px) 100vw, 783px" /></div></div></figure></div></div></li></ul></div></div></div></div>


<p class="wp-block-paragraph">Certains pourrait dire, oui c&rsquo;est un PHPMyAdmin. Oui c&rsquo;est un fait. C&rsquo;est une IHM<sup data-fn="67016ea4-128a-4e54-8e78-994f2692832d" class="fn"><a href="#67016ea4-128a-4e54-8e78-994f2692832d" id="67016ea4-128a-4e54-8e78-994f2692832d-link">12</a></sup> en GUI<sup data-fn="91045dd7-1d19-4afb-9e40-c5064450683b" class="fn"><a href="#91045dd7-1d19-4afb-9e40-c5064450683b" id="91045dd7-1d19-4afb-9e40-c5064450683b-link">13</a></sup> pour faciliter l&rsquo;expérience quotidienne.</p>



<p class="wp-block-paragraph">Pour se connecter, il suffira de renseigner les informations de connexion et de s&rsquo;assurer au préalable que la politique de communication est bien présente sur notre UTM concernant les flux interlans. Sans oublier de vérifier :</p>



<ul class="wp-block-list">
<li>La configuration du fichier pg_hba.conf est compliante</li>



<li>Les adresses d&rsquo;écoutes dans le fichier postgresql.conf ne sont pas restreinte cas localhost et que le bind d&rsquo;interface est bien configuré. (Le bind c&rsquo;est l&rsquo;ip de l&rsquo;interface du serveur, pas l&rsquo;adresse ip du client&#8230; Je dis ça parce que je vous vois venir hein !)</li>
</ul>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="434" class="wp-image-3303" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_009_pgadmin_connexion.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_009_pgadmin_connexion.jpg 727w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_009_pgadmin_connexion-300x237.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="252" class="wp-image-3313" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_011_pgadmin_connexion.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_011_pgadmin_connexion.jpg 1068w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_011_pgadmin_connexion-300x137.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_011_pgadmin_connexion-1024x469.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_011_pgadmin_connexion-768x352.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /><br></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Et si nous jetions un coup d&rsquo;œil dans le viseur pour observer nos logs voir si on voit notre <a href="https://www.youtube.com/watch?v=6xb898sQtu8&amp;list=RD6xb898sQtu8&amp;start_radio=1">pachyderm</a> numérique ?</p>



<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-110"><code>$ sudo tail -f /mnt/database/postgresql/data/log/postgresql-Wed.log</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="161" src="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_010_pgadmin_connexion-1024x161.jpg" alt="" class="wp-image-3304" srcset="https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_010_pgadmin_connexion-1024x161.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_010_pgadmin_connexion-300x47.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_010_pgadmin_connexion-768x121.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_010_pgadmin_connexion-1536x242.jpg 1536w, https://erwanguillemard.com/wp-content/uploads/2025/11/APP_011_007_010_pgadmin_connexion.jpg 1693w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Impeccable. Tout fonctionne 🙂</p>



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



<p class="wp-block-paragraph">Ce billet revient aux prémices des premiers articles rédigés il y a maintenant quasiment deux ans. Quelques choses de simple qui vise à jouer les aides mémoires de ma cafetière qui commence à s&rsquo;effriter.</p>



<p class="wp-block-paragraph">Je ne tenais pas à me lancer dans un benchmark de « <em><strong>Est ce que l&rsquo;otarie et plus fort que l&rsquo;éléphant ?</strong></em> » cela ne m&rsquo;intéresse pas le moindre du monde. Toutefois et comme j&rsquo;ai pu l&rsquo;aborder en avant propos, le tournant des éditeurs vers la solution PostgreSQL mérite de s&rsquo;intéresser à cette dernière.</p>



<ul class="wp-block-list">
<li>VEEAM enchaine sa rupture technologique avec Windows (SE<sup data-fn="7604995b-87f0-4797-9ee8-4a7d54d21f02" class="fn"><a href="#7604995b-87f0-4797-9ee8-4a7d54d21f02" id="7604995b-87f0-4797-9ee8-4a7d54d21f02-link">14</a></sup> et/ou MSSQL) pour RHEL et PostgreSQL</li>



<li>ODOO qui reste dans la philosophie du libre</li>



<li>La Société Générale (faut bien renflouer les caisses après le passage de Jérôme KERVIEL&#8230; Ok, la blague est mauvaise, mais il fallait la faire. Trop tentante).</li>



<li>Patrick BALKANY pour gérer son patrimoine non déclaré. Ah non autant pour moi c&rsquo;est une fake news&#8230; Que je suis naïf 🙂</li>
</ul>



<p class="wp-block-paragraph">Au delà des deux derniers points douteux, il est bien je pense de se garder deux SGBDs relationnels sous le coude les solutions MariaDB et PostgreSQL. L&rsquo;implémentation de la couche de sécurité relève d&rsquo;un défi parfois mais reste nécessaire et plus qu&rsquo;indispensable de nos jours.</p>



<p class="wp-block-paragraph">Il manque toutefois un point que je n&rsquo;ai pas développé ici. La possibilité de sauvegarder une base de manière périodique. J&rsquo;avais traité le sujet pour MariaDB à la suite d&rsquo;une connerie de ma part un vendredi aprem sur l&rsquo;environnement de production. Je pense qu&rsquo;il serait bien de reprendre ce projet et de l&rsquo;adapter pour PostgreSQL 🙂</p>



<p class="wp-block-paragraph">Ca fait un sujet supplémentaire à traiter d&rsquo;ici la fin d&rsquo;année. Mais surtout, le levé de voile ayant été fait un poil plus tôt ce billet est le tremplin pour l&rsquo;implémentation d&rsquo;ODOO comme mon ERP à venir.</p>



<p class="wp-block-paragraph">Le mot de la fin :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Egaré dans la base de données infernale, le sysadmin se nomme R-ONE. A la recherche du datalocation, le problème s&rsquo;appelle la durcification. Avec la solution VEEAM, il a pu rollback super vite.</em> Dérivant à dos d&rsquo;éléphant<em>, R-ONE arrivera toujours dans l&rsquo;étang&#8230; (faut bien se mouiller un peu qu&rsquo;ils disaient les anciens)</em></p>
<cite>Erwan GUILLEMARD</cite></blockquote>



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



<ul class="wp-block-list">
<li><a href="https://www.postgresql.org/community/survey/50-what-operating-system-is-your-primarylargest-production-postgresql-database-running-on">PostgreSQL Secteur par OS</a></li>



<li><a href="https://www.postgresql.org/files/documentation/pdf/18/postgresql-18-A4.pdf">PostgreSQL &#8211; Main Apps Guide</a></li>



<li><a href="https://www.postgresql.org/download/">PostgreSQL &#8211; Download</a></li>



<li><a href="https://www.pgadmin.org/download/">PGAdmin &#8211; Download</a></li>



<li><a href="https://mariadb.com/docs/analytics/mariadb-columnstore/management/deployment/columnstore-minimum-hardware-specification">MariaDB &#8211; Hardware Requirements</a></li>
</ul>


<ol class="wp-block-footnotes"><li id="b793e32b-66d6-49b2-ab53-f36b018298f1"><strong>SGBD :</strong> Système de Gestion de Base de Données <a href="#b793e32b-66d6-49b2-ab53-f36b018298f1-link" aria-label="Aller à la note de bas de page 1">↩︎</a></li><li id="393e6df6-2f56-48e8-9d39-7a0fdfff1fe2"><strong>BDD : </strong>Base De Données <a href="#393e6df6-2f56-48e8-9d39-7a0fdfff1fe2-link" aria-label="Aller à la note de bas de page 2">↩︎</a></li><li id="400bfed0-8737-41bd-8083-b5ec5af14458"><strong>LSD :</strong> <strong> </strong>LySergique Diéthylamide <a href="#400bfed0-8737-41bd-8083-b5ec5af14458-link" aria-label="Aller à la note de bas de page 3">↩︎</a></li><li id="172c5b99-4041-4446-85b6-d02e927f1b6e"><strong>ANSSI</strong> <strong>:</strong> Agence Nationale de Sécurité des Systèmes d&rsquo;Informations <a href="#172c5b99-4041-4446-85b6-d02e927f1b6e-link" aria-label="Aller à la note de bas de page 4">↩︎</a></li><li id="146573c3-30d5-479a-b375-824245002261"><strong>DMZ :</strong> Demilitarized Zone <a href="#146573c3-30d5-479a-b375-824245002261-link" aria-label="Aller à la note de bas de page 5">↩︎</a></li><li id="8cf51c44-be31-4dbd-91c3-7dfca8006d40"><strong>RTFM :</strong> Read The Fuck*ng Manual <a href="#8cf51c44-be31-4dbd-91c3-7dfca8006d40-link" aria-label="Aller à la note de bas de page 6">↩︎</a></li><li id="93299765-13f1-4d26-b6e1-157c6dc967ca"><strong>OS :</strong> Operating System <a href="#93299765-13f1-4d26-b6e1-157c6dc967ca-link" aria-label="Aller à la note de bas de page 7">↩︎</a></li><li id="8ee11f8e-018a-4440-a1e7-f35e89fcaa7d"><strong>RSSI </strong>: Responsable Sécurité des Systèmes d&rsquo;Informations <a href="#8ee11f8e-018a-4440-a1e7-f35e89fcaa7d-link" aria-label="Aller à la note de bas de page 8">↩︎</a></li><li id="d3ddcc3d-b108-4e68-9df7-2f478eb4d83d"><strong>SysDBA :</strong> Administrateur des Systèmes de Bases de Données <a href="#d3ddcc3d-b108-4e68-9df7-2f478eb4d83d-link" aria-label="Aller à la note de bas de page 9">↩︎</a></li><li id="5b9359c6-adcf-4f72-9501-604602846dc7"><strong>UTM : </strong>Unified threat management <a href="#5b9359c6-adcf-4f72-9501-604602846dc7-link" aria-label="Aller à la note de bas de page 10">↩︎</a></li><li id="d2a363b8-1043-4f02-8054-3cb17bef0b81"><strong>ESN :</strong> Entreprise des Services Numériques <a href="#d2a363b8-1043-4f02-8054-3cb17bef0b81-link" aria-label="Aller à la note de bas de page 11">↩︎</a></li><li id="67016ea4-128a-4e54-8e78-994f2692832d"><strong>IHM :</strong> Interface Homme Machine <a href="#67016ea4-128a-4e54-8e78-994f2692832d-link" aria-label="Aller à la note de bas de page 12">↩︎</a></li><li id="91045dd7-1d19-4afb-9e40-c5064450683b"><strong>GUI :</strong> Graphical User Interface <a href="#91045dd7-1d19-4afb-9e40-c5064450683b-link" aria-label="Aller à la note de bas de page 13">↩︎</a></li><li id="7604995b-87f0-4797-9ee8-4a7d54d21f02"><strong>SE :</strong> Système d&rsquo;Exploitation <a href="#7604995b-87f0-4797-9ee8-4a7d54d21f02-link" aria-label="Aller à la note de bas de page 14">↩︎</a></li></ol>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Apps &#8211; VEEAM Repo &#038; Backup Hardened</title>
		<link>https://erwanguillemard.com/apps-veeam-repo-backup-hardened/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Mon, 17 Jun 2024 19:56:42 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[Securité]]></category>
		<category><![CDATA[VEEAM]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=2111</guid>

					<description><![CDATA[Hardened, un bien vilain mot qui pourtant nous veux du bien. L&#8217;une des traductions littérales serait « endurcie ». Néanmoins nous interpréterons celui-ci sous le sens « d&#8217;immuable ». Si hardened est un bien vilain mot, immuable ne vaut pas mieux. Et à chaque fois que j&#8217;ai évoqué ces termes à quelqu&#8217;un j&#8217;ai dû donner une définition. Qui demeure...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Hardened, un bien vilain mot qui pourtant nous veux du bien. L&rsquo;une des traductions littérales serait « endurcie ». Néanmoins nous interpréterons celui-ci sous le sens « d&rsquo;immuable ».</p>



<p class="wp-block-paragraph">Si hardened est un bien vilain mot, immuable ne vaut pas mieux. Et à chaque fois que j&rsquo;ai évoqué ces termes à quelqu&rsquo;un j&rsquo;ai dû donner une définition.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Qui demeure inchangé, ne subit pas ou ne paraît pas subir de modification pendant un temps relativement long</em></p>
<cite>Dictionnaire Larousse</cite></blockquote>



<p class="wp-block-paragraph">Le titre de ce billet ainsi que les multiples appels du pied du précédent article technique sur VEEAM, ne laisse pas de doute quant au fil conducteur de ce feuillet technique.</p>



<p class="wp-block-paragraph">Nous aborderons ici la sauvegarde dit immuable ou inaltérable pour répondre à l&rsquo;un des bonnes pratiques et recommandations de la sauvegarde.</p>





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



<ul class="wp-block-list">
<li><strong>SE :</strong> Ubuntu Server 20.04 LTS</li>



<li><strong>Apps : </strong>VEEAM B&amp;R 12.1</li>



<li><strong>Autres : </strong>
<ul class="wp-block-list">
<li><a href="https://erwanguillemard.com/linux/">Environnement GNU LINUX Durci</a></li>



<li><a href="https://erwanguillemard.com/windows-veeam-backup-replication/">VEEAM B&amp;R 12.1</a></li>
</ul>
</li>
</ul>



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



<p class="wp-block-paragraph">Le pourquoi du comment de la sauvegarde Immuable ou Hardened vient d&rsquo;un constat. Avec l&rsquo;évolution depuis 2015 des virus de nature cryptographique, les attaquants ne s&rsquo;amusent plus à effacer toutes traces d&rsquo;un SI (car c&rsquo;est moins drôle de nous jours ce coup de HOCUS, POCUS) mais de chiffrer ce dernier de virer les sauvegardes et de tenir une situation de prise d&rsquo;otage (sans permettre un syndrome de Stockholm) et de chantage à divulguer les données d&rsquo;entreprise sur le Dark &amp; Deep Web. Toutefois, les rançons demandées dans la grande majorité des cas sont indexées sur le CA des sociétés piègés ou de la nature critique des données extorquées&#8230;</p>



<p class="wp-block-paragraph">Alors il y a bien des techniques, mécanismes pour assurer une sauvegarde hors ligne. L&rsquo;une des plus vieilles à ma connaissance reste la sauvegarde sur bande (Tape). Même si cette dernière comme le langage <a href="https://fr.wikipedia.org/wiki/Cobol">COBOL</a> était amené à mourir car dépassé par notre évolution technologique. Force est de constatée, que cette technologie reste l&rsquo;un des mécanismes fiables pour assurer une sauvegarde hors ligne. Il y a bien la sauvegarde sur média externe (pour ne pas dire HDD) qui fonctionne très bien. Mais ce genre de solution, voyez vous, ça rentre parfaitement dans le cadre d&rsquo;une PME ou d&rsquo;un SI local (pour ne pas dire OnPremise) qui n&rsquo;a pas un SI avec des fluctuations de stockage à la hausse. Pour résumer, comment assurer la sauvegarde déconnecté dans un datacenter ou une infrastructure qui peut être amené à grossir rapidement ?</p>



<p class="wp-block-paragraph">Je vois (c&rsquo;est mon point de vu. Si vous n&rsquo;êtes pas d&rsquo;accord, je suis prêt à échanger sur le sujet) les avantages et inconvénients suivants :</p>



<figure class="wp-block-table"><table><tbody><tr><td class="has-text-align-center" data-align="center"></td><td>Tapes Serveur</td><td>USB External Drive</td><td>Repo Hardened</td></tr><tr><td class="has-text-align-center" data-align="center">Avantages</td><td>* Performances importantes<br>* Difficiles à exploiter sans lecteur<br></td><td>* Moindre cout<br>* Facile à exploiter en cas de sinistre<br>* Facilement évolutif</td><td>* Cout raisonnable<br>* Basée sur une technologie libre<br>* Maitrise des couts<br>* Difficilement exploitable en cas de vol ou d&rsquo;intrusion<br>* Facilement évolutif</td></tr><tr><td class="has-text-align-center" data-align="center">Inconvénients</td><td>* Cout du robot de sauvegarde<br>* Cout des bandes<br>* Penser à changer les bandes (si pas de robot rotatif)<br>* Limiter au nombre de bande<br>* Penser à stocker le média dans un lieu sûr<br>* Changement de robot, peut entrainer le changement des bandes ($$$)<br>* Difficilement évolutif</td><td>* Penser à changer le média physiquement<br>* Penser à stocker le média dans un lieu sûr<br>* Performances limités<br>* Facile à exploiter si les données ne sont pas chiffrées<br></td><td>* Serveur Physique dédié<br>* Compétences en Linux ++ (pour faire les choses bien)<br>* Equipement jamais vraiment déconnecté du SI<br><br><br></td></tr></tbody></table></figure>



<p class="has-text-align-center wp-block-paragraph"><strong>« Ouai mais qu&rsquo;est ce que tu fais du Stockage Objet, des buckets toussa toussa ? C&rsquo;est bien inaltérable non ? »</strong></p>



<p class="wp-block-paragraph">Oui et non. Je n&rsquo;ai pas encore eu le loisir de jouer avec les stockages objets S3 ou d&rsquo;autres technologies qui se base sur ce standard. Avant toutes choses, il est je pense important de se poser la question de la nature des données que nous souhaitons sauvegarder. Il y a des avantages et des inconvénients au type de sauvegarde en blocks et objets. Certains types de données sont plus favorables à l&rsquo;un ou l&rsquo;autre des technologies de sauvegarde. Bref, spoiler c&rsquo;est un billet en réflexion et sur lequel je me dois de me motiver (à coup de grand coup de pied au c*l car je suis à <a href="https://www.youtube.com/watch?v=a_oOPYvGzN8&amp;ab_channel=Hubert-F%C3%A9lixThi%C3%A9faine-Topic">l&rsquo;ouest du néant</a> en ce moment).</p>



<p class="wp-block-paragraph">Bref, si nous rattrapons notre fil d&rsquo;ariane, je vois dans une cloud privé un facilité à choisir la sauvegarde hardened sur un serveur dédié. Si le SI augmente et que nous devons ajouter des ressources des nœuds supplémentaires, j&rsquo;ajoute un nouveau repo. Si mon SI diminue, je recycle mon serveur de repository pour un autre usage. Seul hic, cela demande de bonnes compétences en GNU/LINUX (mais cela est il vraiment un frein ? Les compétences ça s&rsquo;acquiert non 🙂 ).</p>



<figure class="wp-block-table"><table><tbody><tr><td><strong>/!\ Attention /!\</strong><br>Je traiterai de la sauvegarde sur média USB dans un article futur (et encore c&rsquo;est pas super complexe) ou pas.<br>Je n&rsquo;ai jamais « joué » avec un serveur de bandes que ce soit dans le monde professionnel (oui j&rsquo;ai le malheurs d&rsquo;être un de ces milléniales des 90&rsquo;s qui est considéré comme un petit jeune/c*n par la génération 80&rsquo;s et un <em>has been</em> / <em>never been</em> par la génération 2000&#8230;) car plus présent lors de mon arrivée dans le milieu de l&rsquo;IT. Ni dans le monde personnel car pour le coup si je monte sur mon lab un robot de sauvegarde à bandes, je suis certains que je vais en entendre parler un moment&#8230;<br>Mais je suis preneur si l&rsquo;occasion se présente de plonger tête la première dans la techno.</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Pour ce billet, je vais tricher un peu. N&rsquo;ayant pas de repo physique sur mon lab (et que mon lab tiens à mon poste perso), nous partirons d&rsquo;un serveur virtuel qui « jouera » le rôle de notre repo physique.</p>



<p class="wp-block-paragraph">Ce dernier sera sur un SE<sup data-fn="c69c2835-a941-45dd-ba6c-71392873daa8" class="fn"><a href="#c69c2835-a941-45dd-ba6c-71392873daa8" id="c69c2835-a941-45dd-ba6c-71392873daa8-link">1</a></sup>, Ubuntu Server 20.04 LTS<sup data-fn="c5ab9c8c-0307-4b61-83b5-82041447e886" class="fn"><a href="#c5ab9c8c-0307-4b61-83b5-82041447e886" id="c5ab9c8c-0307-4b61-83b5-82041447e886-link">2</a></sup> durci préalablement selon le guide de recommandation de l&rsquo;ANSSI<sup data-fn="c7bb64ce-4db6-48ca-866d-f856e977c1a1" class="fn"><a href="#c7bb64ce-4db6-48ca-866d-f856e977c1a1" id="c7bb64ce-4db6-48ca-866d-f856e977c1a1-link">3</a></sup>. Un disque pour la sauvegarde est dédié, monté et formaté en XFS<sup data-fn="58bbf35d-a51b-4ba9-937a-d58393f894bc" class="fn"><a href="#58bbf35d-a51b-4ba9-937a-d58393f894bc" id="58bbf35d-a51b-4ba9-937a-d58393f894bc-link">4</a></sup>.</p>



<p class="has-text-align-center wp-block-paragraph"><strong>Euh Question M&rsquo;sieur GUIGUI ! Toi qui nous rabache du RHEL matin, midi et soir. Pourquoi d&rsquo;un coup tu pars sur un Ubuntu ? Ca t&rsquo;a pris comme un envie de ch**r de changer de distrib ?</strong></p>



<p class="wp-block-paragraph">A cette question, je répondrai tendrement qu&rsquo;il s&rsquo;agit simplement et tout bonnement des prérequis de l&rsquo;éditeur VEEAM. Sinon, la question n&rsquo;aurait pas eu lieu :rhel: (pour ceux qui ont connu le <a href="https://jvflux.fr/Noelisme">:noel:</a> ).</p>



<p class="wp-block-paragraph">Fin de l&rsquo;avant propos, place à la lecture du menu avant de mettre un coup de fourchette.</p>



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



<p class="wp-block-paragraph">Attaquons donc ce menu qui nous fait tant de l&rsquo;oeil. La première question que nous nous devons de poser est « Qu&rsquo;est ce que l&rsquo;immuabilité ? » et la seconde question, « Comment fonctionne t&rsquo;elle ? »</p>



<h3 class="wp-block-heading">Introduction à l&rsquo; i-mmuabilité</h3>



<p class="wp-block-paragraph">L&rsquo;immuabilité au sens UNIX du texte existe depuis le 16 Janvier 1996. Cette commande est présente dans le paquet E2fsprogs de la release 1.02. (Si je me fourvoie, merci de me le dire car j&rsquo;ai du mal à trouver l&rsquo;histoire de cette dernière&#8230;).</p>



<p class="wp-block-paragraph">Cette commande permet de définir des attributs complémentaires sur les systèmes de fichiers dont notamment l&rsquo;immuabilité des fichiers.</p>



<p class="wp-block-paragraph">Pour manipuler ces attributs, nous pouvons utiliser l&rsquo;ensemble des commandes suivantes :</p>



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



<li>lsattr</li>



<li>getattr</li>



<li>setxattr</li>
</ul>



<p class="wp-block-paragraph">Observons ci dessous l&rsquo;ensemble des commandes suivantes :</p>



<pre class="wp-block-code"><code><strong>$ sudo chattr +i test.txt
$ sudo lsattr test.txt
$ sudo rm -Rf test.txt
$ sudo chattr -i test.txt
$ sudo lsattr test.txt
$ sudo rm -Rf test.txt</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="698" height="258" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_017_Immu_chattr.png" alt="" class="wp-image-2145" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_017_Immu_chattr.png 698w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_017_Immu_chattr-300x111.png 300w" sizes="auto, (max-width: 698px) 100vw, 698px" /></figure>
</div>


<p class="wp-block-paragraph">J&rsquo;ai appliqué l&rsquo;attribut d&rsquo;immutabilité sur le fichier test.txt et surprise, même en élevant mes droits, je ne suis pas autorisé à supprimer le document. Cela ne sera possible qu&rsquo;en retirant l&rsquo;attribut. Nous tenons le début de notre mécanisme.</p>



<p class="wp-block-paragraph"><em>Ouvrez le GUILLEMARD </em>« </p>



<p class="wp-block-paragraph"><em>Je pense après une courte nuit de réflexion que je dédierai un article sur les attributs étendus car il y a énormément de matière sur le sujet. De plus, j&rsquo;ai ouvert the <a href="https://www.jeuxvideo.com/wikis-soluce-astuces/cheat-codes/235924">PANDORAS BOX</a> (toi aussi <a href="https://www.youtube.com/watch?v=_iq43Vs8CEw&amp;ab_channel=L%C3%A9oFerr%C3%A9">tu te souviens des jours anciens</a> des LANs sur AoM ? Petit canaillou de cheater va) et je me dois de boire jusqu&rsquo;à la lie ce module et l&rsquo;éventail des fonctionnalités qu&rsquo;il propose.</em></p>



<p class="wp-block-paragraph">« <em> Fermez le GUILLEMARD </em></p>



<p class="wp-block-paragraph">Mais alors comment cette fonctionnalité va t-elle être pilotée par notre serveur VEEAM ?</p>



<h3 class="wp-block-heading">V-immutability-M</h3>



<p class="wp-block-paragraph">Là deux possibilités. Either you speak and read english and you can directly jump to the <a href="https://helpcenter.veeam.com/docs/backup/vsphere/hardened_repository_immutability.html?ver=120">Veeam hardened guide</a>. Ou alors on peut regarder ensemble ma compréhension du sujet.</p>



<p class="wp-block-paragraph">Après tout, je n&rsquo;ai eu que 5/20 au BAC en LV1 Anglais, ça promet d&rsquo;être sympa 🙂 (Si si et j&rsquo;ai même pas été au rattrapage ! <a href="https://www.youtube.com/watch?v=ZAcvuP7UpL0&amp;ab_channel=MrToonfish">Et il est content</a>&#8230;)</p>



<p class="wp-block-paragraph">Bref, nous verrons plus bas lors du déploiement que lorsque nous ajoutons notre Serveur Ubuntu en tant que Single Use Credential nous allons déployer les rôles :</p>



<ul class="wp-block-list">
<li><strong>Transport</strong> : (veeamtransport) pour le service datamover (port tcp/6162)</li>



<li><strong>Installer</strong> : (veeamdeploymentsvc) pour déployer l&rsquo;ensemble des composants et permettre de maintenir à jour les différents composants (ports tcp/2500</li>
</ul>



<p class="wp-block-paragraph">Toutefois, c&rsquo;est lorsque nous déclarerons notre repository en tant que Hardened repository que cela va devenir intéressant. Car c&rsquo;est à ce moment que nous allons définir les paramètres de gestion de l&rsquo;immuabilité sur une période minimum de 7 jours (promis je reviendrai un jour sur la magie du nombre 7). Bref une fois configuré, voilà les services les plus importants.</p>



<ul class="wp-block-list">
<li><strong>VEEAM Data Mover</strong> : Ces ce dernier qui va communiquer avec notre serveur VEEAM et récupérer les paramètres de temps quant aux datas qui doivent être inaltérables. Une fois les informations en sa possession, il réalise une passe décisive au service ci dessous VEEAM Immutability Service (veeamimmureposvc), comme la passe décisive de Djorkaeff à Thuram à la 47eme minutes du match France-Croatie en 1998 (<a href="https://www.youtube.com/watch?v=91k5OTiKjAg&amp;ab_channel=FunkyMiK">Souviens toi du 12 Juillet 1998 !</a>).</li>



<li><strong>VEEAM Immutability Service</strong> : <a href="https://www.youtube.com/watch?v=0zqwMf_VDbU&amp;ab_channel=LesGuignols">Va aller mettre une patate à Jean-Pierre</a>&#8230; Promis j&rsquo;arrête, Bah Pourquoi ?&#8230; Tu vas la fermer ta grande gu***e !! Ce service va vérifier sur les chaque fichiers de backup toutes les 20 minutes les attributs immuables jusqu&rsquo;à ce que le date de fin soit atteinte. Ce service est un sous service de VEEAM Data Mover.</li>
</ul>



<p class="wp-block-paragraph">A partir de la version 12.1.0.2131, le mécanisme change avec un control, détection sur un potentiel décalage de temps.</p>



<p class="wp-block-paragraph">Lorsque le VEEAM Immutability Service démarre, un fichier <strong>timeLog</strong> va être créé sous <strong>/etc/veeam/immureposvc/</strong>. Ce fichier sera mis à jour toutes les 10 minutes.</p>


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


<p class="wp-block-paragraph">Oui mais que se passerai t-il si la valeur du moveTime ou accelerationTime dépasse 24 heures ?</p>



<p class="wp-block-paragraph">Par sécurité, les données relatifs aux opérations de rétentions seront bloqués. Un message d&rsquo;avertissement remontera dans la session du job de sauvegarde. Ce qui est rassurant. Oui mais voilà, comment j&rsquo;unlock la situation ? Ba en suivant le <a href="https://www.veeam.com/kb4482">KB</a> mon gars&#8230;</p>



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



<p class="wp-block-paragraph">Dans les recommandations et l&rsquo;un des prérequis de l&rsquo;implémentation d&rsquo;un repository hardened est d&rsquo;avoir un équipement dédié sans surcouche de virtualisation. Nous parlons donc de serveur et non pas d&rsquo;hyperviseur.</p>



<p class="wp-block-paragraph">En dehors des bonnes pratiques de configuration d&rsquo;un serveur, je ne m&rsquo;intéresserai qu&rsquo;à la partie réseau. La configuration de la partie ILO/IDRAC/IPMI ne sera pas abordée. Pourquoi ? car je n&rsquo;en ai pas envie et surtout je n&rsquo;ai pas les moyens de le mettre en œuvre sur mon lab. Peut être un jour dans un autre article.</p>



<p class="wp-block-paragraph">Au vu de la criticité de ce que nous souhaitons mettre en place, il nous faut dissocier la partie management de la partie sauvegarde.</p>



<p class="wp-block-paragraph">Avec des équipements d&rsquo;infrastructures adéquates et selon la volumétrie de datas à sauvegarder, l&rsquo;agrégation d&rsquo;interfaces est nécessaire. Au minima SFP+<sup data-fn="3b6c0862-32cf-4554-ac0a-e9cfe2377193" class="fn"><a href="#3b6c0862-32cf-4554-ac0a-e9cfe2377193" id="3b6c0862-32cf-4554-ac0a-e9cfe2377193-link">5</a></sup>, au maximum FC<sup data-fn="cc7945a0-53b5-45d9-8bac-c78a1fd6053a" class="fn"><a href="#cc7945a0-53b5-45d9-8bac-c78a1fd6053a" id="cc7945a0-53b5-45d9-8bac-c78a1fd6053a-link">6</a></sup>. Assurer les performances réseaux sont un fait, toutefois si le stockage ne suit pas et génère un goulot d&rsquo;étranglement (bolteneck), cela ne sert pas à grand chose.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="633" height="257" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_026_Immu_arch_server.png" alt="" class="wp-image-2180" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_026_Immu_arch_server.png 633w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_026_Immu_arch_server-300x122.png 300w" sizes="auto, (max-width: 633px) 100vw, 633px" /></figure>
</div>


<h4 class="wp-block-heading">Réseau</h4>



<p class="wp-block-paragraph">Bien entendu, si notre Firewall gère les liaisons supérieurs à 1 Gbits/s, il y a un intérêt de faire un VLAN dédié à l&rsquo;immuabilité dissocié de la sauvegarde. Dans le cas contraire et assurer de bonne performance, il conviendra de rester dans le même subnet et de passer par commutation.</p>



<p class="wp-block-paragraph">Encore une fois, si nous avons de la micro segmentation, cela facilitera grandement les choses sur un même subnet. Dans le cas contraire, il sera nécessaire de définir les règles côté repo selon les interfaces, sources et destinations avec les ports et protocoles autorisées à transiter.</p>



<p class="wp-block-paragraph">Lors de la configuration du repository et donc sans restriction les flux réseaux sont les suivants :</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="606" height="239" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_027_Immu_arch_allFlux.png" alt="" class="wp-image-2182" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_027_Immu_arch_allFlux.png 606w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_027_Immu_arch_allFlux-300x118.png 300w" sizes="auto, (max-width: 606px) 100vw, 606px" /></figure>
</div>


<p class="wp-block-paragraph">Une fois les ressources push du serveur VEEAM vers le serveur hardened (tcp:22), le service VEEAM Installer se charge d&rsquo;installer et de déployer les composants (tcp:6160). Une fois les dépendances installées, la sauvegarde se déroulera à travers le service VEEAM Data Mover (tcp:6162) ainsi que le service Mount Server (tcp:2500-3000).</p>



<p class="wp-block-paragraph">Soit au final nous n&rsquo;avons besoin que des flux suivants :</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="581" height="229" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_027_Immu_arch_someFlux.png" alt="" class="wp-image-2183" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_027_Immu_arch_someFlux.png 581w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_027_Immu_arch_someFlux-300x118.png 300w" sizes="auto, (max-width: 581px) 100vw, 581px" /></figure>
</div>


<p class="wp-block-paragraph"><strong>Ok, ça c&rsquo;est pour VEEAM, mais niveau serveur physique, il n&rsquo;y a pas des choses à faire ? </strong></p>



<p class="wp-block-paragraph">Bien vu l&rsquo;aveugle. Il sera nécessaire d&rsquo;autoriser les protocoles :</p>



<figure class="wp-block-table"><table><tbody><tr><td class="has-text-align-center" data-align="center"><strong>Sens</strong></td><td class="has-text-align-center" data-align="center"><strong>Protocoles</strong></td><td class="has-text-align-center" data-align="center"><strong>Sources</strong></td><td class="has-text-align-center" data-align="center"><strong>Destinations</strong></td><td class="has-text-align-center" data-align="center"><strong>Actions</strong></td></tr><tr><td class="has-text-align-center" data-align="center">IN</td><td class="has-text-align-center" data-align="center">tcp:22</td><td class="has-text-align-center" data-align="center">Subnet de management</td><td class="has-text-align-center" data-align="center">Repo Hardened</td><td class="has-text-align-center" data-align="center">Deny</td></tr><tr><td class="has-text-align-center" data-align="center">LAN</td><td class="has-text-align-center" data-align="center">udp:161-162</td><td class="has-text-align-center" data-align="center">Repo Hardened</td><td class="has-text-align-center" data-align="center">SNMP Server</td><td class="has-text-align-center" data-align="center">Allow</td></tr><tr><td class="has-text-align-center" data-align="center">OUT</td><td class="has-text-align-center" data-align="center">tcp:80</td><td class="has-text-align-center" data-align="center">Repo Hardened (ILO)</td><td class="has-text-align-center" data-align="center">*.builder.com</td><td class="has-text-align-center" data-align="center">Allow</td></tr><tr><td class="has-text-align-center" data-align="center">OUT</td><td class="has-text-align-center" data-align="center">tcp:443</td><td class="has-text-align-center" data-align="center">Repo Hardened (ILO)</td><td class="has-text-align-center" data-align="center">*.builder.com</td><td class="has-text-align-center" data-align="center">Allow</td></tr><tr><td class="has-text-align-center" data-align="center">OUT</td><td class="has-text-align-center" data-align="center">tcp:25,465,587</td><td class="has-text-align-center" data-align="center">Repo Hardened (ILO)</td><td class="has-text-align-center" data-align="center">relai smtp<em>(s) over tls</em></td><td class="has-text-align-center" data-align="center">Allow</td></tr><tr><td class="has-text-align-center" data-align="center">IN</td><td class="has-text-align-center" data-align="center">http</td><td class="has-text-align-center" data-align="center">ANY</td><td class="has-text-align-center" data-align="center">Repo Hardened (ILO)</td><td class="has-text-align-center" data-align="center">Deny</td></tr><tr><td class="has-text-align-center" data-align="center">IN</td><td class="has-text-align-center" data-align="center">https</td><td class="has-text-align-center" data-align="center">ANY</td><td class="has-text-align-center" data-align="center">Repo Hardened (ILO)</td><td class="has-text-align-center" data-align="center">Deny</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">Users &amp; Permissions</h4>



<p class="wp-block-paragraph">Dans l&rsquo;idée, il convient d&rsquo;utiliser un compte utilisateur pour la sauvegarde veeam. Ce dernier aura la charge de quelques services. Ce compte ne doit en aucun cas être membre du groupe SUDO. Il l&rsquo;est uniquement lors du déploiement et lors du MCO logiciel. Ensuite les droits doivent lui être retirés.</p>



<p class="wp-block-paragraph">Il en va de même que l&rsquo;accès au répertoire qui va contenir les sauvegardes doivent avoir des droits restreints à notre seul et unique utilisateur VEEAM que ce soit en tant qu&rsquo;utilisateur et groupe.</p>



<p class="wp-block-paragraph">Les droits devant être défini sur 700.</p>



<p class="wp-block-paragraph">Mouai, c&rsquo;est enfoncer une porte ouverte non ? Ouai ba j&rsquo;ai vu des SysAdmins faire des choses à la limite de faire<a href="https://www.youtube.com/watch?v=YTtbg71Tj5M&amp;ab_channel=Whitesos"> voir des choses terribles à un petit garçon</a>.</p>



<p class="wp-block-paragraph">Il en va de soi, mais le sticky bit on oublie. Perso, je ne comprends qu&rsquo;elle serait l&rsquo;utilité du sticky bit. Mais bon, si VEEAM le précise, c&rsquo;est bien que certains SysAdmins ont essayés.</p>



<h3 class="wp-block-heading">Chaînes, maillons, et immutabilité</h3>



<p class="wp-block-paragraph">Pour assurer l&rsquo;immuabilité des données de nos chaines, le mécanisme qui sera utilisé sera le même que pour la Foreward Incremental avec automatiquement une active full ou une syntetic full. </p>



<p class="wp-block-paragraph">Pourquoi ? Une petit schéma s&rsquo;impose.</p>



<p class="wp-block-paragraph">Partons du principe que nous définissions le nombre de point d&rsquo;immuabilité à 7 jours. Avec une synthétique full hebdomadaire tous les dimanches.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="216" height="80" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_028_Immu_chain_1.png" alt="" class="wp-image-2184"/></figure>
</div>


<p class="wp-block-paragraph">Sauf que voilà, il y a un problème. Le premier point immuable est une full et le dernier point avant la dernière full est une incrémental (Sunday to Saturday). L&rsquo;immuabilité étant défini à 7 jours les points sont donc inaltérables tant que l&rsquo;échéance du dernier point incrémental n&rsquo;est pas atteint. Si la full est supprimée les incréments ne sont pas utile. Donc nous devons attendre de nouveau 7 jours pour supprimer la première chaine et la création d&rsquo;une troisième full.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="371" height="79" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_028_Immu_chain_2.png" alt="" class="wp-image-2185" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_028_Immu_chain_2.png 371w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_028_Immu_chain_2-300x64.png 300w" sizes="auto, (max-width: 371px) 100vw, 371px" /></figure>
</div>


<p class="wp-block-paragraph">Nous avons pas 7 points inaltérables mais 13 points.</p>



<p class="wp-block-paragraph">Une fois la full réalisée le 3 dimanches nous passons à 14 points. C&rsquo;est à ce moment là, une fois la full terminée et rendu inaltérable que les 6 premières points de la chaine se verront retirés l&rsquo;attribut d&rsquo;immuabilité puis les maillons seront supprimés (Le principe, se base sur le Grand-Père, Père et fils).</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="404" height="80" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_028_Immu_chain_3.png" alt="" class="wp-image-2186" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_028_Immu_chain_3.png 404w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_028_Immu_chain_3-300x59.png 300w" sizes="auto, (max-width: 404px) 100vw, 404px" /></figure>
</div>


<p class="wp-block-paragraph">Et puis on recommence.</p>



<p class="wp-block-paragraph">Donc nous avons un minimum de 7 points de rétention et un maximum de 13 points.</p>



<p class="wp-block-paragraph">Un point sur lequel je n&rsquo;ai toutefois pas encore fait de test, reste le traitement de l&rsquo;externalisation (backup copy). Le principe de GFS doit alors être configuré. J&rsquo;essaierai plus tard.</p>



<p class="wp-block-paragraph">Je pense que maintenant nous avons toutes les informations requises pour passer à la pratique. Il n&rsquo;est pas impossible que certaines parties ne soient pas toutes à fait complètes. Il est difficile de tout couvrir et de ne rien oublier. Mais on peut toujours échanger pour toutes questions.</p>



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



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



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id2111_71e697-c7 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-pane2111_51b63b-19"><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; Création du compte VEEAM</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="wp-block-paragraph">Nous créons donc notre utilisateur dédié à VEEAM et nous lui définissons un mot de passe robuste.</p>



<pre class="wp-block-code"><code><strong>$ sudo useradd usr.veeam</strong>
<strong>$ sudo passwd usr.veeam</strong></code></pre>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane2111_c172fd-ea"><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; Ajout au groupe SUDO</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="wp-block-paragraph">L&rsquo;utilisateur créé, il nous faudra lui donner temporairement les droits d&rsquo;élévation de privilége (sudo) que nous lui retirerons une fois l&rsquo;installation des composants et dépendances terminées.</p>



<pre class="wp-block-code"><code><strong>$ sudo usermod -aG sudo usr.veeam</strong></code></pre>



<p class="wp-block-paragraph">Puis plus ultérieurement</p>



<pre class="wp-block-code"><code><strong>$ sudo gpasswd -d usr.veeam sudo</strong></code></pre>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane2111_c138db-3c"><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; Partition dédiée</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="wp-block-paragraph">Il en va de soi que nous ne stockerons pas les données de sauvegarde sur la partition et disque système.</p>



<p class="wp-block-paragraph">Nous allourons un disque dédié sur un volume autre que le système pour stocker nos datas immuable. L&rsquo;un des prérequis, le format doit être en XFS.</p>



<p class="wp-block-paragraph">Il n&rsquo;est pas improbable qu&rsquo;à la suite vous rencontriez des problèmes quant à la capacité de votre stocakge. Je m&rsquo;explique, au délà de 2 TB de données, il ne sera pas possible de créer la partition avec l&rsquo;utilitaire <strong>fdisk</strong>, mais avec <strong>gdisk</strong>.</p>



<p class="wp-block-paragraph">Les commandes sont sensiblement les mêmes que pour <strong>fdisk</strong>. Un mémo, plus qu&rsquo;un mode opératoire (attention les commandes qui suivent sont expéditives. Enfin vous pouvez admirer un des rares moments de travaille bâcler 🙂 ).</p>



<pre class="wp-block-code"><code><strong>$ sudo gdisk /dev/sdX
   * n
   * 1
   * Paramètres par défaut
   * 8300
   * w
   * y</strong></code></pre>



<p class="wp-block-paragraph">Nous formatons la partoche</p>



<pre class="wp-block-code"><code><strong>$ sudo mkfs.xfs /dev/sdX1</strong></code></pre>



<p class="wp-block-paragraph">Petit montage dans les règles de l&rsquo;art (je passe la partie fstab, là on est sur du standard de chez standard. Dans le cas contraire, faite un tour <a href="https://erwanguillemard.com/linux-disk-part/">ici</a>).</p>



<pre class="wp-block-code"><code><strong>$ sudo mkdir /mnt/veeam
$ sudo mkdir /mnt/veeam/hardened_repository
$ sudo mount -o rw /dev/sdX1 /mnt/veeam/hardened_repository</strong></code></pre>



<p class="wp-block-paragraph"> Notre partition est montée.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane2111_82b9ac-70"><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; Permissions et répertoire</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="wp-block-paragraph">Afin de se prémunir contre toutes potentielles intrusions de la part d&rsquo;un autre utilisateur sur notre repo est donc sur notre point de montage, nous allons définir l&rsquo;accès uniquement à notre utilisateur et son groupe en modification utilisateur uniquement.</p>



<p class="wp-block-paragraph">Soit par une traduction en shell par :</p>



<pre class="wp-block-code"><code><strong>$ sudo chmod 700 -R /mnt/veeam/hardened_repository</strong>
<strong>$ sudo chown usr.veeam:usr.veeam /mnt/veeam/hardened_repository</strong></code></pre>
</div></div></div>
</div></div></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Si je n&rsquo;ai rien omis, nous pouvons passer à la suite et toutes les étapes devraient bien se passer. Dans le cas contraire, je vous autorise à me donner une grande tape sur l&rsquo;épaule, promis je vous dirai merci pour ne pas m&rsquo;en reprendre une dizaine.</p>



<h3 class="wp-block-heading">Intégration dans VEEAM</h3>



<h4 class="wp-block-heading">Ajout du serveur Linux</h4>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id2111_38aa8b-93 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-pane2111_de2b0f-2d"><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; Scream my Name !</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="wp-block-paragraph">Dans l&rsquo;onglet Backup Infrastructure, sélectionnez ajouter un serveur. Puis ajouter un nouveau serveur Linux.</p>



<p class="wp-block-paragraph">Comme ci-dessous vous avez deux possibilités. Soit vous ajoutez l&rsquo;IP de votre repo (absence de serveur DNS dans mon cas et flemme d&rsquo;aller faire une surcharge dans le fichier host juste pour le lab) ou d&rsquo;ajouter le nom DNS. Ayant plusieurs repositories, j&rsquo;aime bien mettre une petite description (surtout en l&rsquo;absence de nom DNS).</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="759" height="541" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_001_Desciription.png" alt="" class="wp-image-2113" style="width:459px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_001_Desciription.png 759w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_001_Desciription-300x214.png 300w" sizes="auto, (max-width: 759px) 100vw, 759px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane2111_46ad1b-5a"><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; Linux Credential (une fois seulement)</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="wp-block-paragraph">Dans la partie SSH Connection, nous n&rsquo;avons pas d&rsquo;entrée dans le gestionnaire de mot de passe de notre VEEAM. Et nous ne voulons surtout pas que nos informations d&rsquo;authentifications soient stockées (Sinon à quoi faire du hardened ?).</p>



<p class="wp-block-paragraph">Cliquons donc sur Add et sélectionnons la dernière proposition « <strong>Single-use credentials</strong>« . Normalement vous devriez avoir l&rsquo;écran ci-dessous.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="759" height="540" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_002_Credentials.png" alt="" class="wp-image-2114" style="width:388px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_002_Credentials.png 759w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_002_Credentials-300x213.png 300w" sizes="auto, (max-width: 759px) 100vw, 759px" /></figure>
</div>


<p class="wp-block-paragraph">Si vous avez fait les choses proprement, vous renseignez le login de votre compte utilisateur propre à VEEAM avec son petit mot de passe. Dans mon cas <strong>svc.veeam</strong> et <strong>password1234</strong> ou <strong>azerty1234</strong>. Cochez la case d&rsquo;élévation de privilège ainsi que la case « Use su if sudo fails » et là, renseigner le mot de passe du compte root.</p>



<p class="wp-block-paragraph">Toujours si vous avez bien fait les choses, le compte <strong>svc.veeam</strong> est à ce moment un compte membre du groupe <strong>sudo</strong>. Donc un utilisateur à privilège le temps de l&rsquo;installation. Si ce n&rsquo;est pas le cas, ajoutez le :</p>



<pre class="wp-block-code"><code><strong>$ sudo usermod -aG sudo svc.veeam</strong></code></pre>



<p class="wp-block-paragraph">Pour le fun, essayer de mettre en compte utilisateur le compte root. Normalement, VEEAM devrait exprimer votre nom indien avec sa main « <a href="https://www.youtube.com/watch?v=LcuR7cuEKQI&amp;ab_channel=Ons%27enBaluchon">Dresser avec le Majeur</a>« . 🙂</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane2111_92f922-3f"><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; Actions Review</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="wp-block-paragraph">Si vous êtes là c&rsquo;est que le serveur VEEAM arrive à pu initier la connexion en SSH avec notre futur repository immuable.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="757" height="543" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_003_Review.png" alt="" class="wp-image-2115" style="width:436px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_003_Review.png 757w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_003_Review-300x215.png 300w" sizes="auto, (max-width: 757px) 100vw, 757px" /></figure>
</div>


<p class="wp-block-paragraph">Les composants transport et installer vont être déployés. Ces derniers ne sont pas déjà présent sur le serveur. Pour le moment pas un faux pas !</p>



<p class="wp-block-paragraph">Passons à l&rsquo;étape suivante.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane2111_1e4f8a-f0"><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; Jamais du premier coup 😉</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="wp-block-paragraph">Bon ba nous voilà comme un con sur un quai de gare un jour de grève à la SNCF&#8230; Ca ne fonctionne pas BORDEL ! (Pourquoi tu n&rsquo;as pas censurer l&rsquo;injure ? Parce que je suis frustré d&rsquo;avoir durci une saloperie de système GNU/LINUX dans l&rsquo;état de l&rsquo;art et d&rsquo;avoir des erreurs de ce type. Je suis pas une base de loisir MERDE !)</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="757" height="543" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_004_Apply_ErrorDeployement.png" alt="" class="wp-image-2116" style="width:506px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_004_Apply_ErrorDeployement.png 757w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_004_Apply_ErrorDeployement-300x215.png 300w" sizes="auto, (max-width: 757px) 100vw, 757px" /></figure>
</div>


<p class="wp-block-paragraph"><a href="https://www.youtube.com/watch?v=FRV3y2OWT-w&amp;ab_channel=JohnnyCadillac">Monsieur, Calmez vous !</a> Oui, c&rsquo;est bon. Pas de castagne. LINUX et VEEAM sont sympa car ils nous donnent gentiment le message d&rsquo;insulte que l&rsquo;un donne à l&rsquo;autre. C&rsquo;est alors qu&rsquo;en bon copain nous allons arrondir les angles pour que VEEAM et notre repo LINUX puissent fleurter ensemble.</p>



<p class="wp-block-paragraph">L&rsquo;une des mesures de sécurité que j&rsquo;applique sur mes systèmes GNU en terme de durcissement est d&rsquo;interdire l&rsquo;exécution sur la partition <strong>/var</strong> et <strong>/tmp</strong>. Donc un petit remove de l&rsquo;argument <strong>noexec</strong> et un remount des partitions et c&rsquo;est repartie comme en 40 ! (Il y a quelques choses d&rsquo;autres à faire mais je le garde pour moi).</p>



<p class="wp-block-paragraph">On relance un Previous, puis un Next pour relancer le déploiement. Là, à la surprise générale, l&rsquo;installation se déroule sans accro.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="758" height="542" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_004_Apply_Succeed.png" alt="" class="wp-image-2117" style="width:501px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_004_Apply_Succeed.png 758w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_004_Apply_Succeed-300x215.png 300w" sizes="auto, (max-width: 758px) 100vw, 758px" /></figure>
</div>


<p class="wp-block-paragraph">Alors elle est pas belle la vie ?</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-5 kt-pane2111_c126fe-58"><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">5 &#8211; Congratulations</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="wp-block-paragraph">L&rsquo;installation est terminée. Les composants ont bien été déployées nous avons ci-dessous le récapitulatif.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="759" height="541" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_005_Recap.png" alt="" class="wp-image-2118" style="width:515px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_005_Recap.png 759w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_005_Recap-300x214.png 300w" sizes="auto, (max-width: 759px) 100vw, 759px" /></figure>
</div>


<p class="wp-block-paragraph">Toutefois, nous devons remettre en l&rsquo;état les quelques points de sécurité que nous avons assouplis pour permettre l&rsquo;arrimage de notre repository Hardened LINUX à notre serveur VEEAM.</p>



<ul class="wp-block-list">
<li>Retirer l&rsquo;utilisateur <strong>svc.veeam</strong> du groupe <strong>sudo</strong></li>



<li>Rétablir les arguments <strong>noexec</strong> sur les partitions <strong>/var</strong>, <strong>/tmp</strong></li>



<li>Rétablir les paramètres que l&rsquo;auteur a vraiment décider de ne pas divulger</li>
</ul>



<p class="wp-block-paragraph"></p>
</div></div></div>
</div></div></div>



<h4 class="wp-block-heading">Ajout du repository</h4>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id2111_43e5d9-7a kt-accordion-has-8-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-pane2111_ad1e78-56"><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; Quels types choisir ?</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="wp-block-paragraph">Choisissons le type de repository pour déclarer notre repo hardened, soit Direct Attached Storage.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="715" height="614" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_006_AddRepo.png" alt="" class="wp-image-2119" style="width:292px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_006_AddRepo.png 715w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_006_AddRepo-300x258.png 300w" sizes="auto, (max-width: 715px) 100vw, 715px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane2111_2d477b-47"><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; Linux Hardened 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 class="wp-block-paragraph">Dans les choix, j&rsquo;hésite vraiment sur l&rsquo;option pour notre type de repo. Peut-être la réponse numéro 3, <strong>Linux (Hardened Repository)</strong> ?</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="714" height="618" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_007_HardenedRepo.png" alt="" class="wp-image-2120" style="width:326px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_007_HardenedRepo.png 714w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_007_HardenedRepo-300x260.png 300w" sizes="auto, (max-width: 714px) 100vw, 714px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane2111_abeae7-47"><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; Scream my Name (Again)</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="wp-block-paragraph">On note le nom de notre repo. Tachons donc de rester logique et de choisir un nom dans le standard des repositories. Pour ma part REPO_HARDENED_01. Comme j&rsquo;aurais pu avoir un REPO_SVG_01 ou REPO_EXT_01. Soignons pragmatique <a href="https://www.youtube.com/watch?v=_vuzhkEkNSQ&amp;ab_channel=Filmentaria">Père UBU</a> par ma chandelle verte !</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="758" height="542" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_008_HardenedRepo_Name.png" alt="" class="wp-image-2121" style="width:327px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_008_HardenedRepo_Name.png 758w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_008_HardenedRepo_Name-300x215.png 300w" sizes="auto, (max-width: 758px) 100vw, 758px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane2111_79f04f-f3"><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; Server Selection</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="wp-block-paragraph">Le serveur ayant été ajouté précédemment nous avons le listing de chacune des partitions présentent et montée.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="757" height="541" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_009_HardenedRepo_Target.png" alt="" class="wp-image-2122" style="width:424px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_009_HardenedRepo_Target.png 757w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_009_HardenedRepo_Target-300x214.png 300w" sizes="auto, (max-width: 757px) 100vw, 757px" /></figure>
</div>


<p class="wp-block-paragraph">Dans la liste (5ème positions) nous retrouvons bien notre partition sous <strong>/mnt/veeam/hardened_repository</strong> monté sur <strong>/dev/sdb1</strong>.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-5 kt-pane2111_f9aa4e-e9"><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">5 &#8211; Choix du repository (Path) </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="wp-block-paragraph">Sélectionnons la partition qui nous intéresse.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="760" height="544" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_010_HardenedRepo_RepoSettings.png" alt="" class="wp-image-2123" style="width:430px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_010_HardenedRepo_RepoSettings.png 760w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_010_HardenedRepo_RepoSettings-300x215.png 300w" sizes="auto, (max-width: 760px) 100vw, 760px" /></figure>
</div>


<p class="wp-block-paragraph">Activons ensuite les paramètres de clonage rapide sur les volumes XFS. Je défini la durée de l&rsquo;immuabilité sur 14 jours (le minimum étant 7 jours). Je limite le nombre de tâche parallélisé à 4.</p>



<p class="wp-block-paragraph">Dans les options avancées, j&rsquo;ai pour habitude d&rsquo;activer l&rsquo;alignement des blocks pour améliorer les performances quant à la sauvegarde et à la restauration malgré une légère hausse du CPU.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="758" height="542" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_011_HardenedRepo_RepoSettings_Advanced.png" alt="" class="wp-image-2124" style="width:403px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_011_HardenedRepo_RepoSettings_Advanced.png 758w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_011_HardenedRepo_RepoSettings_Advanced-300x215.png 300w" sizes="auto, (max-width: 758px) 100vw, 758px" /></figure>
</div>


<p class="wp-block-paragraph">J&rsquo;active également le paramètre d&rsquo;utiliser le paramètre per machine backup files car il améliore les performances de stockage pour les équipements qui bénéficient de flux important d&rsquo;I/O. Ce qui tombe bien est notre cas.</p>



<p class="wp-block-paragraph">Les deux autres options ne doivent pas être cochés, puisque nous n&rsquo;avons pas de support rotatif et l&rsquo;option de décompression n&rsquo;est pas compatible avec la sauvegarde immuable.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-6 kt-pane2111_23e170-e2"><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">6 &#8211; Where is the mount Server ?</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="wp-block-paragraph">De nouveau nous avons un petit récapitulatif des rôles à ajouter ou déjà présent sur notre repo.</p>



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



<li>vPower NFS</li>



<li>Mount Server</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="761" height="541" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_013_HardenedRepo_Recap.png" alt="" class="wp-image-2126" style="width:426px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_013_HardenedRepo_Recap.png 761w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_013_HardenedRepo_Recap-300x213.png 300w" sizes="auto, (max-width: 761px) 100vw, 761px" /></figure>
</div>


<p class="wp-block-paragraph">Il est possible de cocher la case de recherche de chaine existante. Ce n&rsquo;est pas notre cas.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-7 kt-pane2111_87fb20-16"><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">7 &#8211; Applying</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="wp-block-paragraph">Nous appliquons la configuration de notre repo. Deux avertissements toutefois. Dû au durcissement de mon SE GNU/LINUX. Toutefois rien de bien méchant car on regarde l&rsquo;avertissement lié au service de déploiement.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="760" height="543" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_014_HardenedRepo_Apply.png" alt="" class="wp-image-2127" style="width:435px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_014_HardenedRepo_Apply.png 760w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_014_HardenedRepo_Apply-300x214.png 300w" sizes="auto, (max-width: 760px) 100vw, 760px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-8 kt-pane2111_3b0f88-bc"><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">8 &#8211; Petit Résumé</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="wp-block-paragraph">Encore une fois, le petit récapitulatif nous informant que le repo a bien été créé.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="758" height="542" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_015_HardenedRepo_Summary.png" alt="" class="wp-image-2128" style="width:513px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_015_HardenedRepo_Summary.png 758w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_015_HardenedRepo_Summary-300x215.png 300w" sizes="auto, (max-width: 758px) 100vw, 758px" /></figure>
</div></div></div></div>
</div></div></div>



<h3 class="wp-block-heading">Backup Job &amp; Tests</h3>



<p class="wp-block-paragraph">Pour ce point, je ne vois pas de grand intérêt à décrire comme créer un jobs de backup. C&rsquo;est pourquoi j&rsquo;irai à l&rsquo;essentiel, un en mot un seul, pour être succinct, sans détour et fioriture, bref j&rsquo;irai droit au but&#8230;</p>



<p class="wp-block-paragraph">Pourquoi cette entrée en matière dans cette partie ? Simplement car cela dépend de la source sur laquelle le serveur de sauvegarde se base.</p>



<ul class="wp-block-list">
<li>VMWare VCenter</li>



<li>VMWare ESXi</li>



<li>NUTANIX Prism Element</li>



<li>NUTANIX Prism Central</li>



<li>MICROSOFT HyperV</li>



<li>VEEAM Backup Agent</li>



<li>etc</li>
</ul>



<p class="wp-block-paragraph">La liste pourrait s&rsquo;allonger comme un jour sans pain au vu du nombre de point d&rsquo;entrée OnPremise et Cloud.</p>



<p class="wp-block-paragraph">Dans mon cas et sur mon petit environnement de lab, ça sera sur un job de sauvegarde pour du VEEAM Backup Agent pour Windows (en Guest Processing) d&rsquo;un serveur local.</p>



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



<p class="wp-block-paragraph">Nous considérons qu&rsquo;un compte d&rsquo;administration est déjà présent pour la sauvegarde est durci dans les règles de l&rsquo;art et que le serveur source se trouve dans la bonne configuration pour être sauvegardé.</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id2111_a3b94c-87 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-pane2111_e7a21f-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; Storage</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="wp-block-paragraph">Dans la partie Storage de notre job (peut importe le type), il nous suffit de sélectionner notre repository hardened.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="798" height="580" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_022_Immu_Storage-1.png" alt="" class="wp-image-2175" style="width:409px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_022_Immu_Storage-1.png 798w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_022_Immu_Storage-1-300x218.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_022_Immu_Storage-1-768x558.png 768w" sizes="auto, (max-width: 798px) 100vw, 798px" /></figure>
</div>


<p class="wp-block-paragraph">Le nombre de point de rétention doit être en adéquation avec la politique d&rsquo;immuabilité en place comme décris dans la partie théorique. Dans mon cas 14 jours.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane2111_1c0c32-9a"><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; Storage GFS</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="wp-block-paragraph">La sauvegarde hardened se base sur le principe GFS<sup data-fn="ec6aa003-32a1-49af-8a77-ef1a9eb1ddb1" class="fn"><a href="#ec6aa003-32a1-49af-8a77-ef1a9eb1ddb1" id="ec6aa003-32a1-49af-8a77-ef1a9eb1ddb1-link">7</a></sup>. Effectivement et comme une nouvelle fois expliqué précédemment, il n&rsquo;est pas possible et cela n&rsquo;a pas de sens de faire de la RI<sup data-fn="aaaaa269-53a7-47ca-b188-00da64f0a9c7" class="fn"><a href="#aaaaa269-53a7-47ca-b188-00da64f0a9c7" id="aaaaa269-53a7-47ca-b188-00da64f0a9c7-link">8</a></sup> mais bien FI<sup data-fn="55b862c5-880a-4a67-bd76-304f10074f68" class="fn"><a href="#55b862c5-880a-4a67-bd76-304f10074f68" id="55b862c5-880a-4a67-bd76-304f10074f68-link">9</a></sup>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="799" height="582" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_023_Immu_GFS-2.png" alt="" class="wp-image-2174" style="width:362px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_023_Immu_GFS-2.png 799w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_023_Immu_GFS-2-300x219.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_023_Immu_GFS-2-768x559.png 768w" sizes="auto, (max-width: 799px) 100vw, 799px" /></figure>
</div>


<p class="wp-block-paragraph">Je défini donc de réaliser une full backup synthétique de manière hebdomadaire, le 7 jour de la semaine, 7 jour où le Seigneur exténué (comme moi d&rsquo;ailleurs) d&rsquo;avoir travaillé si dure les 6 jours précédents de prendre un jour de repo. Et comme la sauvegarde est là pour nous prémunir de tout aléas</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Les premiers seront les derniers, et les derniers seront les premiers</em></p>
<cite>Marc 10:31</cite></blockquote>



<p class="wp-block-paragraph">Nous pouvons faire confiance à Saint Marc. Amen. </p>
</div></div></div>
</div></div></div>



<p class="wp-block-paragraph">Laissons notre job tourner et admirer les performances et actions en cours.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1019" height="724" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_018_Immu_Ongoing.png" alt="" class="wp-image-2159" style="width:456px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_018_Immu_Ongoing.png 1019w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_018_Immu_Ongoing-300x213.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_018_Immu_Ongoing-768x546.png 768w" sizes="auto, (max-width: 1019px) 100vw, 1019px" /></figure>
</div>


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



<p class="wp-block-paragraph">Une fois le job terminé avec succès. L&rsquo;une de nos grandes questions que nous devons nous poser en tant que SysAdmin (et que n&rsquo;importe quel client, chef d&rsquo;entreprise doit se poser) est <strong>« Comment s&rsquo;assurer que la chaine de sauvegarde est bien inaltérable, immuable ? » </strong></p>



<p class="wp-block-paragraph">Le plus simple, c&rsquo;est de supprimer la chaine de sauvegarde ou l&rsquo;une des ressources protégées. Normalement, dans la boite de dialogue se préparant à l&rsquo;exécution de la suppression, vous devriez avoir un violent message d&rsquo;avertissement vous informant que <a href="https://www.youtube.com/watch?v=eq1xiZDhBvs&amp;ab_channel=Ch%C3%B4meurDigne">NON, VEEAM ne veut pas.</a> Mais comme VEEAM n&rsquo;est pas si en désaccord avec votre volonté de supprimer le backup, il vous donne toutefois la date d&rsquo;échéance où il sera possible de supprimer la chaine si et seulement si le job est désactivé naturellement.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="958" height="521" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_020_Immu_NODELETE.png" alt="" class="wp-image-2161" style="width:522px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_020_Immu_NODELETE.png 958w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_020_Immu_NODELETE-300x163.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_020_Immu_NODELETE-768x418.png 768w" sizes="auto, (max-width: 958px) 100vw, 958px" /></figure>
</div>


<p class="wp-block-paragraph">Si nous voulons allés plus loin, c&rsquo;est du côté repo qu&rsquo;il faudra contrôler que l&rsquo;attribut d&rsquo;immutabilité est bien positionné sur nos fichiers. Un petit coup de <strong>lsattr</strong> et le tour est joué.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="806" height="135" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_021_Immu_attributeJobs.png" alt="" class="wp-image-2162" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_021_Immu_attributeJobs.png 806w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_021_Immu_attributeJobs-300x50.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_021_Immu_attributeJobs-768x129.png 768w" sizes="auto, (max-width: 806px) 100vw, 806px" /></figure>
</div>


<h3 class="wp-block-heading">Altérer l&rsquo;inaltérable ?</h3>



<p class="wp-block-paragraph">Super cette sauvegarde immuable ! Avec ça, nous sommes paré à toutes éventualités contre la suppression et altération de nos chaines de sauvegarde.</p>



<p class="wp-block-paragraph">Sauf que ce n&rsquo;est pas tout à fait vrai. Désolé de vous mettre un stop. En haut de ce billet, j&rsquo;ai insisté sur la topologie et l&rsquo;architecture. Tout va reposer sur  cette dernière pour ne pas altérer le contenu de votre repository hardened.</p>



<p class="wp-block-paragraph">Avant de rentrer plus dans les explications, je rappel dans le contexte que le système GNU est durci. Le compte utilisateur dédié à la sauvegarde n&rsquo;a pas de droit d&rsquo;élévation, le daemon ssh est désactivé.</p>



<p class="wp-block-paragraph"><a href="https://www.youtube.com/watch?v=ZZ6plV0dH6s&amp;ab_channel=RaoulPetiteOfficiel">Allez, faut y aller</a>, oui mais où ? Maintenant rentrons dans le vif du sujet.</p>



<p class="wp-block-paragraph">En me connectant directement à mon repo en console ou en direct. Regardons nos différents maillons de chaines pour notre job. J&rsquo;ai deux full. Pourquoi ? Parce que je suis un abruti qui lors du la configuration de mon job, j&rsquo;ai oublié de chiffrer ma chaine. M&rsquo;en rendant compte après coup, j&rsquo;ai donc corrigé ce petit détail. Sauf que activer le chiffrement d&rsquo;un job implique forcément de repartir sur un full. Merdouille non ?</p>



<p class="wp-block-paragraph">Alors comment faire pour supprimer le premier maillon .vbk qui est indépendant de mon second .vbk ?</p>



<ul class="wp-block-list">
<li>Je suis patient et j&rsquo;attends 28 jours</li>



<li>Je supprime le point au niveau système et je clean ma configuration</li>
</ul>



<p class="wp-block-paragraph">Pour le coup je ne serai pas patient et je vais donc contourner l&rsquo;immuabilité.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="840" height="241" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_025_Immu_remove_IMMU-1.png" alt="" class="wp-image-2170" style="width:763px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_025_Immu_remove_IMMU-1.png 840w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_025_Immu_remove_IMMU-1-300x86.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_025_Immu_remove_IMMU-1-768x220.png 768w" sizes="auto, (max-width: 840px) 100vw, 840px" /></figure>
</div>


<ol class="wp-block-list">
<li>Je liste uniquement les maillons de la chaine qui sont des fulls (.vbk) afin d&rsquo;identifier le point que je souhaite faire disparaitre</li>



<li>Etant en root, je retire l&rsquo;attribut d&rsquo;immuabilité sur le fichier</li>



<li>Je liste de nouveau les attributs des maillons de la chaine qui sont des fulls (.vbk) pour vérifier que c&rsquo;est bon</li>



<li>Je supprime le fichier</li>



<li>Je liste de nouveau les attributs des maillons de la chaine qui sont des fulls (.vbk) pour vérifier que je n&rsquo;ai plus qu&rsquo;un fichier vbk</li>
</ol>



<p class="wp-block-paragraph">Nous nous déconnectons de notre console. Et regardons notre chaine côté VEEAM Ordo.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="827" height="312" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_025_Immu_remove_IMMU_1.png" alt="" class="wp-image-2171" style="width:562px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_025_Immu_remove_IMMU_1.png 827w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_025_Immu_remove_IMMU_1-300x113.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_025_Immu_remove_IMMU_1-768x290.png 768w" sizes="auto, (max-width: 827px) 100vw, 827px" /></figure>
</div>


<p class="wp-block-paragraph">Là j&rsquo;ai été un vite en besogne car j&rsquo;ai déjà nettoyer la configuration. Mais notre point remontait comme inaccessible car nous l&rsquo;avons supprimé (petite icone rouge et police en italique). Mais une fois nettoyé, nous avons 4 points en lieu et place de 5.</p>



<p class="wp-block-paragraph">Donc il est possible d&rsquo;altérer l&rsquo;inaltérable sous certaines conditions.</p>



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



<p class="wp-block-paragraph">La sauvegarde immuable ou hardened est vraiment une solution indispensable des organisations. Cette dernière ne doit pas être négligé. Malheureusement et c’est là un triste constat les organisations et entreprises pour des raisons de coût néglige cette protection supplémentaire.</p>



<p class="has-text-align-center wp-block-paragraph"><strong>«&nbsp;J’ai déjà une sauvegarde et une externalisation, je ne risque rien. Mon Service interne est parano ou Mon prestataire informatique me prend pour une vache à lait&nbsp;»</strong></p>



<p class="wp-block-paragraph">Ce sentiment de puissance, de confiance et d’invincibilité pourtant ne tiens qu’à un fil et c’est lorsque ça tourne mal qu’il nous reste plus qu’à pleurer en regardant comme Loth, sa femme pétrifié de sel (Genése 19:26). <a href="https://www.youtube.com/watch?v=VGN8G6eSVqU&amp;ab_channel=thiefaineVEVO">Attention, la facture est salée</a>.</p>



<p class="wp-block-paragraph">Toutefois, l’implémentation d’un tel système nécessite des aptitudes avancées pour les systèmes LINUX/GNU ce qui peut représenter un frein à la mise en place de ce dernier. Notamment sur la partie durcissement. A cela peut s’ajouter des budgets ainsi que des ressources limitées sur l’infrastructures ne permettant pas d’assurer cette fonctionnalité.</p>



<p class="wp-block-paragraph">Il reste à moindre cout l’usage et l’implémentation d’une sauvegarde sur disque externe. Cependant je pense que cette solution est moins performante, plus espacée dans le temps, moins adapté à l’évolution du SI et soumis au risque humain (oublie, corruption, etc). Mais cela reste une solution.</p>



<p class="wp-block-paragraph">Encore une fois la question de curseur se pose sur le rapport bénéfices risques. Qu’est ce que je suis prêt à accepter pour mon organisation&nbsp;? Il suffit d’avoir frôlé la banque route ou d’avoir dans ces connaissances un patron qui a perdu son entreprise ou sauver de peu son business pour se sentir concerné.</p>



<p class="wp-block-paragraph">Ouai mais tu nous as démontré que ce n’était pas inaltérable à 100%. Tu ne serais pas en train de nous refourguer une solution pour éviter le <a href="https://fr.wikipedia.org/wiki/Passage_informatique_%C3%A0_l%27an_2000">bug de l’an 2000</a>&nbsp;?</p>



<p class="wp-block-paragraph">Oui je conçois et l’ai démontré. Nulle solution n’est parfaite est sécurisé à 100%. Toutefois les opérations pour retirer l’immuabilité nécessite de passer plusieurs mécanismes de sécurités et le risque bien de présent est minime voir nul. Disons que si un individu malveillant s’attaque à la sauvegarde immuable, normalement l’équipe interne ou le service IT seront informés car c’est le point d’entrée le plus complexe à infiltrer. Et donc, cet individu aura pris le temps de mettre un joyeux bor**l sur l’ensemble de notre infra au préalable.</p>



<p class="wp-block-paragraph">Nous pourrions également dire que 7 jours ou 14 jours d’immuabilité c’est peu. Et pourtant il faut voir cette sauvegarde comme l’as dans la manche qui nous sortira de l’échec et compromission de notre sauvegarde et externalisation. C’est une sauvegarde certes, mais la dernière carte à jouer. Sincèrement, vous SysAdmin/DSI persuadez votre DG, DAF ou PDG d’implémenter cette fonctionnalité. </p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="728" height="416" src="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_029_SysAdmin_DAF.jpg" alt="" class="wp-image-2196" style="width:347px;height:auto" title="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_029_SysAdmin_DAF.jpg 728w, https://erwanguillemard.com/wp-content/uploads/2024/06/AP_007_029_SysAdmin_DAF-300x171.jpg 300w" sizes="auto, (max-width: 728px) 100vw, 728px" /></figure>
</div>


<p class="has-text-align-center has-small-font-size wp-block-paragraph"><em>Rare image d&rsquo;échange entre un DAF avec un DSI/SysAdmin concernant le budget informatique</em></p>



<p class="wp-block-paragraph">Vous DG, DAF ou PDG, écoutez votre SysAdmin/DSI et permettez lui de passer des nuits tranquilles loin des <a href="https://www.youtube.com/watch?v=LPmUcSowpko&amp;ab_channel=Hubert-F%C3%A9lixThi%C3%A9faine-Topic">valium, tranxène, nembutal</a> (ouai je sais ça faut beaucoup de référence à HFT, mais je suis dans ma période de vilain garnement 🙂 ).</p>



<p class="wp-block-paragraph">Le mot de la fin</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Consonnes, Voyelles. Je demande un 50/50 sur une garde sans. Risquez comme opération, mais ça passe et vous partez avec Maïté car votre préféré c’est le rondelé.</em></p>
<cite>Erwan GUILLEMARD</cite></blockquote>



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



<ul class="wp-block-list">
<li><a href="https://www.larousse.fr/dictionnaires/francais/immuable/41744#:~:text=1.,soi%2Dm%C3%AAme%20%3A%20V%C3%A9rit%C3%A9s%20immuables.&amp;text=2.,ciel%20d'un%20bleu%20immuable.">Définition Immuable</a></li>



<li><a href="https://helpcenter.veeam.com/docs/backup/vsphere/hardened_repository.html?ver=120">VEEAM B&amp;R 12.1 &#8211; Hardened Guide</a></li>



<li><a href="https://man7.org/linux/man-pages/man1/chattr.1.html">Linux &#8211; chattr</a></li>



<li><a href="https://e2fsprogs.sourceforge.net/e2fsprogs-release.html#1.47.1">E2fsprogs</a></li>
</ul>



<p class="has-small-font-size wp-block-paragraph"><em>Je remercie LLU, d’avoir su me mettre sur la voie et d’avancer sur ce sentier.</em></p>


<ol class="wp-block-footnotes"><li id="c69c2835-a941-45dd-ba6c-71392873daa8"><strong>SE</strong> : Système d&rsquo;Exploitation <a href="#c69c2835-a941-45dd-ba6c-71392873daa8-link" aria-label="Aller à la note de bas de page 1">↩︎</a></li><li id="c5ab9c8c-0307-4b61-83b5-82041447e886"><strong>LTS</strong> : Long Time Support <a href="#c5ab9c8c-0307-4b61-83b5-82041447e886-link" aria-label="Aller à la note de bas de page 2">↩︎</a></li><li id="c7bb64ce-4db6-48ca-866d-f856e977c1a1"><strong>ANSSI</strong> : Agence National de Sécurité des Systèmes d&rsquo;Informations <a href="#c7bb64ce-4db6-48ca-866d-f856e977c1a1-link" aria-label="Aller à la note de bas de page 3">↩︎</a></li><li id="58bbf35d-a51b-4ba9-937a-d58393f894bc"><strong>XFS</strong> : X File System <a href="#58bbf35d-a51b-4ba9-937a-d58393f894bc-link" aria-label="Aller à la note de bas de page 4">↩︎</a></li><li id="3b6c0862-32cf-4554-ac0a-e9cfe2377193"><strong>SFP+</strong> : Small Form-Factor Pluggable+ (10 Gb/s) <a href="#3b6c0862-32cf-4554-ac0a-e9cfe2377193-link" aria-label="Aller à la note de bas de page 5">↩︎</a></li><li id="cc7945a0-53b5-45d9-8bac-c78a1fd6053a"><strong>FC</strong> : Fiber Channnel <a href="#cc7945a0-53b5-45d9-8bac-c78a1fd6053a-link" aria-label="Aller à la note de bas de page 6">↩︎</a></li><li id="ec6aa003-32a1-49af-8a77-ef1a9eb1ddb1"><strong>GFS</strong> : Grand Father, Father, Son <a href="#ec6aa003-32a1-49af-8a77-ef1a9eb1ddb1-link" aria-label="Aller à la note de bas de page 7">↩︎</a></li><li id="aaaaa269-53a7-47ca-b188-00da64f0a9c7"><strong>RI</strong> : Reverse Incremental <a href="#aaaaa269-53a7-47ca-b188-00da64f0a9c7-link" aria-label="Aller à la note de bas de page 8">↩︎</a></li><li id="55b862c5-880a-4a67-bd76-304f10074f68"><strong>FI</strong> : Forward Incremental <a href="#55b862c5-880a-4a67-bd76-304f10074f68-link" aria-label="Aller à la note de bas de page 9">↩︎</a></li></ol>]]></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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Attention spoiler, ça ne va pas se terminer avec l&rsquo;anneau dans le volcan !). </p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Pour vous résumer mon état :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph"><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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">La réponse est oui ! Mais ça ne me convient pas !  </p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph"><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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 wp-block-paragraph">Editez le fichier ou copiez le fichier suivant&nbsp;: <em><strong>SS_015_E_LINUX_MYSQL_DUMP-BDD.sh</strong></em></p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 wp-block-paragraph"><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 wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Dans cette fonction, les commandes les plus intéressantes sont bien entendu les commandes <strong>mysqldump</strong> et <strong>gzip</strong>.</p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Et donc si nous souhaitons faire cette opération en une fois ?</p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">(<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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Qui dit notification mail, dit serveur de messagerie (<a href="https://erwanguillemard.com/apps-mutt/">Apps &#8211; MUTT</a>).</p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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-111"><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 wp-block-paragraph"><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 class="wp-block-paragraph">Je répondrai à cette question par une question me chuchote mon avocat. </p>



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



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 wp-block-paragraph"><strong>DiskSize (Go) = (BDDSize (Go) * AVG Compression Rate * NBRetentionPoints) * 30 %</strong></p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph"><strong>DiskSize (Go)</strong> = (2 Go * 0,46 * (2*5)) * 1,3</p>



<p class="wp-block-paragraph"><strong>DiskSize (Go)</strong> = 11,96 Go</p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Pour la suite, je considère donc que nous avons monté un disque de 12 Go sous <strong>/mnt/backup/</strong>.</p>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Et le reste, pas touche, sauvegarder les modifications.</p>



<p class="wp-block-paragraph">Bon, plus qu&rsquo;à tester.</p>



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



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">Le mot de la fin :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><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 class="wp-block-paragraph"><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>Apps &#8211; SFTP</title>
		<link>https://erwanguillemard.com/apps-sftp/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Mon, 18 Mar 2024 21:00:00 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Application]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=1740</guid>

					<description><![CDATA[Ce billet est en lien étroit avec l&#8217;article Apps &#8211; FTPx. Nous pouvons voir se dernier comme une ramification de l&#8217;article précédent. Cependant, j&#8217;ai insisté sur la différence entre le protocole FTP/FTPS et SFTP. Alors pourquoi faire tronc commun et parler de ramification ? Le seul point commun qu&#8217;il peut avoir dans un premier temps...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ce billet est en lien étroit avec l&rsquo;article <a href="https://erwanguillemard.com/?p=1688">Apps &#8211; FTPx</a>. Nous pouvons voir se dernier comme une ramification de l&rsquo;article précédent. </p>



<p class="wp-block-paragraph">Cependant, j&rsquo;ai insisté sur la différence entre le protocole FTP<sup data-fn="627249c2-57d4-4aff-9759-c73f8a053439" class="fn"><a href="#627249c2-57d4-4aff-9759-c73f8a053439" id="627249c2-57d4-4aff-9759-c73f8a053439-link">1</a></sup>/FTPS<sup data-fn="1cdc31fd-ddf3-4a68-93ae-9d8e89de2751" class="fn"><a href="#1cdc31fd-ddf3-4a68-93ae-9d8e89de2751" id="1cdc31fd-ddf3-4a68-93ae-9d8e89de2751-link">2</a></sup> et SFTP<sup data-fn="7693c419-1df0-45b8-8a57-e83ce2c30cbd" class="fn"><a href="#7693c419-1df0-45b8-8a57-e83ce2c30cbd" id="7693c419-1df0-45b8-8a57-e83ce2c30cbd-link">3</a></sup>. Alors pourquoi faire tronc commun et parler de ramification ? Le seul point commun qu&rsquo;il peut avoir dans un premier temps et le SE puisque c&rsquo;est UNIX et dans un second temps la présence de FTP dans le nom. Puis je dirai que c&rsquo;est tout&#8230;Ha si, tertio ils sont tous deux utilisés pour l&rsquo;échange de fichiers.</p>



<p class="wp-block-paragraph">Le protocole SFTP se base pour échanger des données sur la création d&rsquo;un tunnel SSH entre le client et le serveur via le protocole SSH. Nulle autre dépendance n&rsquo;est nécessaire contrairement à FTP/FTPS qui nécessite un daemon à installer. </p>



<p class="wp-block-paragraph"><strong>Et SSHD c&rsquo;est du nougat ?</strong> Non, bien entendu, c&rsquo;est un daemon aussi. Ce que je veux dire par là, c&rsquo;est que dans 99% des cas SSHD est présent dans le déploiement de base des SEs LINUX.</p>



<p class="wp-block-paragraph">Nous allons utiliser le daemon <strong>openssh</strong> ( ou <strong>SSHD</strong>) pour notre serveur SFTP. Ce dernier est dans la grande majorité des cas présent sur le système d&rsquo;exploitation lors du déploiement. La configuration du service aura été préalablement modifiée dans le cadre du durcissement de notre SE. Nous ne réaliserons que la configuration nécessaire au fonctionnement du service SFTP.</p>



<p class="wp-block-paragraph">La finalité de ce billet sera comme pour l&rsquo;article mentionné ci-haut de comprendre le déploiement et l&rsquo;implémentation d&rsquo;un service SFTP encore et toujours sur un environnement durci GNU.</p>





<h2 class="wp-block-heading">Théorie &#8211; SFTP</h2>



<p class="wp-block-paragraph">Contrairement aux protocoles FTP et FTPS, SFTP est un protocole dédié, basé sur le protocole SSH.</p>



<p class="wp-block-paragraph">SFTP est un protocole récent puisqu&rsquo;il a été créé en 2001 par l&rsquo;organisme IETF<sup data-fn="d07b3205-475c-4897-9b4f-536f970a7e30" class="fn"><a href="#d07b3205-475c-4897-9b4f-536f970a7e30" id="d07b3205-475c-4897-9b4f-536f970a7e30-link">4</a></sup>. Il s&rsquo;inscrit dans un sens comme le successeur du protocole SCP<sup data-fn="94786394-aed8-4c3c-bc8a-65468a33f983" class="fn"><a href="#94786394-aed8-4c3c-bc8a-65468a33f983" id="94786394-aed8-4c3c-bc8a-65468a33f983-link">5</a></sup>. Le protocole SFTP se rapproche plus du système de fichiers que SCP et donc supporte une plus grande flexibilité.</p>



<p class="wp-block-paragraph">Si nous venons à comparer les protocoles FTPx et SFTP sur le plan réseau, SFTP se veut plus simple car la notion de mode Actif, Passif, Explicite, Implicite n&rsquo;existe pas. Là où il est nécessaire d&rsquo;avoir les ports 21,20, 990, 989 avec SFTP seul le port 22 est nécessaire.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="595" height="249" src="https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_001_schema.jpg" alt="" class="wp-image-1747" style="width:385px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_001_schema.jpg 595w, https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_001_schema-300x126.jpg 300w" sizes="auto, (max-width: 595px) 100vw, 595px" /></figure>
</div>


<p class="wp-block-paragraph">J&rsquo;apporte toutefois une nuance dans le protocole SFTP vis à vis des protocoles FTPx. A ce jour le protocole SFTP ne possède pas de RFC<sup data-fn="d5e78572-d265-4325-b720-cfb2eb51a621" class="fn"><a href="#d5e78572-d265-4325-b720-cfb2eb51a621" id="d5e78572-d265-4325-b720-cfb2eb51a621-link">6</a></sup> à proprement parlé. Un projet à toutefois été initié mais celui ci est resté à l&rsquo;état de brouillon et n&rsquo;a plus à ce jour avancé (le RFC draft doit dater de 2006). Il est légitime de se demander si l&rsquo;avenir et la stabilité du protocole sont viables dans le temps. Bien que le risque soit minime, il subsiste quant même.</p>



<h2 class="wp-block-heading">Pratique &#8211; SFTP</h2>



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



<p class="wp-block-paragraph">Je dirais que cette sous-partie n&rsquo;a pas lieu d&rsquo;être puisque openssh a été déployé lors de la configuration de notre appliance.</p>



<p class="wp-block-paragraph">La configuration de base a été supprimée et remplacée par une configuration customisée pour répondre aux recommandations de l&rsquo;ANSSI concernant les systèmes UNIX.</p>



<p class="wp-block-paragraph">Eventuellement nous pourrions nous inquiéter de la publication du port 22 sur notre daemon firewalld. Mais contrairement au service FTP, il ne sera pas utile d&rsquo;ouvrir de port car celui ci est déjà présent dans le daemon firewalld.</p>



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



<p class="wp-block-paragraph">A la différence des services FTPx, nous n&rsquo;allons plus/pas modifier la configuration du fichier <strong>vsftpd.conf </strong>(puisque nous ne l&rsquo;avons pas installé, et qu&rsquo;il n&rsquo;est pas utile pour le fonctionnement de notre service SFTP ! 🙂 ). Comme présenté en amont, le SFTP se base sur l&rsquo;établissement d&rsquo;un tunnel SSH. Donc nous allons devoir ajuster la configuration de notre fichier <strong>sshd_config</strong>.</p>



<pre class="wp-block-code"><code><strong>$ sudo vim /etc/sshd/sshd_config</strong></code></pre>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-3-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-112"><code># override default of no subsystems
Subsystem      sftp    /usr/libexec/openssh/sftp-server -l VERBOSE

Match Group sftp-user
        X11forwarding no
        AllowTcpForwarding no
        ChrootDirectory %h
        ForceCommand internal-sftp -u 0007

#Allow Users And Groups to uses SSHD
AllowGroups ssh-user sftp-user
</code></pre>



<pre class="wp-block-code"><code><strong>$ sudo systemctl reload sshd</strong></code></pre>



<p class="wp-block-paragraph">Et si nous disséquions ce brin de conf ?</p>



<ul class="wp-block-list">
<li><strong>Match Group sftp-user</strong> : Nous indiquons ici que l&rsquo;ensemble des commandes ci-dessous vont s&rsquo;appliquer aux utilisateurs membre du groupe sftp-user. Dans notre cas, le groupe n&rsquo;existe pas encore et il sera nécessaire de créer ce dernier. Il est bien évidemment possible de définir plusieurs politiques sur plusieurs groupes.</li>



<li><strong>X11forwarding no</strong> : Désactive la fonctionnalité X11 forwarding pour le groupe sftp-user et limite les utilisateurs membre de ce groupe à l&rsquo;utilisation d&rsquo;application GUI via SSH.</li>



<li><strong>AllowTcpForwarding no</strong> : N&rsquo;autorise pas le transfert TCP et limite les applications internes qui pourraient être accessible des membres du groupes sftp-user.</li>



<li><strong>ChrootDirectory %h</strong> : Indique que les répertoires sont chrootés (restreints) au <em>home</em> des utilisateurs.</li>



<li><strong>ForceCommand internal-sftp -u 0007 :</strong> Lors de la connexion, le système va exécuter le processus internal-sftp en appliquant le masque 0007 sur tous les éléments qui font être up/down par l&rsquo;utilisateur.</li>



<li><strong>AllowGroups ssh-user sftp-user :</strong> Les groupes <strong>ssh-user</strong> et <strong>sftp-user</strong> sont autorisés à utiliser le daemon SSHD.</li>
</ul>



<p class="wp-block-paragraph">Bon nous y voyons un peu plus clair. Mais vient alors une question sécurité. Comment nous assurons nous que les utilisateurs membres du groupes <strong>ssh-user</strong> n&rsquo;ont pas accès aux SFTP et que les membres du groupes <strong>sftp-user</strong> ne puissent pas ouvrir de connexion en SSH ?</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id1740_65a9fe-1d 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-pane1740_1a7ec5-d8"><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"><strong>Ouvrons une (</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="wp-block-paragraph">Avant de poursuivre, je me suis aperçu avec le temps qu&rsquo;il était bon dans notre gestion au quotidien de notre service VSFTP mutualisé de ne pas avoir une configuration générique mais d&rsquo;adopter une configuration par organisation ou utilisateur.<br>Si nous reprenons la configuration ci-haut tout se base sur les membres du groupe <strong>sftp-user</strong> (ce qui va bien pour notre lab). Mais dans la logique, nous devrions faire un bout de configuration avec un groupe <strong>sftp-customer1, sftp-customer2,&#8230;sftp-customerN</strong>.<br><br>Cette approche permet d&rsquo;identifier facilement les différents groupes et membres, en cas d&rsquo;urgence de désactiver rapidement l&rsquo;accès au service SFTP sans impacter les autres utilisateurs, d&rsquo;autres organisations. De faciliter la gestion et la sécurité journalière.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane1740_581ac3-a8"><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"><strong>Fermons la )</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="wp-block-paragraph">Ce qui nous donnerait donc la configuration suivante :</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-3-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-113"><code># override default of no subsystems
Subsystem      sftp    /usr/libexec/openssh/sftp-server -l VERBOSE

Match Group sftp-customer1
        X11forwarding no
        AllowTcpForwarding no
        ChrootDirectory %h
        ForceCommand internal-sftp -u 0007

Match Group sftp-customer2
        X11forwarding no
        AllowTcpForwarding no
        ChrootDirectory %h
        ForceCommand internal-sftp -u 0007

Match Group sftp-customer2_providers
        X11forwarding no
        AllowTcpForwarding no
        ChrootDirectory %h
        ForceCommand internal-sftp -u 0077
...
...
...
Match Group sftp-customerN
        X11forwarding no
        AllowTcpForwarding no
        ChrootDirectory %h
        ForceCommand internal-sftp -u 0007

#Allow Users And Groups to uses SSHD
AllowGroups ssh-user sftp-customer1 sftp-customer2 sftp-customer2_providers sftp-customerN
</code></pre>



<p class="wp-block-paragraph">Ainsi, nous gagnons en sécurité, en flexibilité et en lisibilité.</p>
</div></div></div>
</div></div></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Dans le cas des utilisateurs qui sont exclusivement destinés à la consommation de notre service SFTP, nous devons nous assurer :</p>



<ul class="wp-block-list">
<li>Pas de connexion en SSH à la console : Lors de la création des comptes utilisateurs, bien préciser en valeur de l&rsquo;argument <strong>&#8211;shell</strong> le <strong>/sbin/nologin</strong> ou <strong>/bin/false</strong> </li>



<li>De chrooter le home des utilisateurs. Mais en leurs créant un sous-répertoire où ils pourront tout de même réaliser des actions de création, modification, suppression</li>
</ul>



<p class="wp-block-paragraph">Dans le cas des utilisateurs système (root) ou administrateur (membre de wheel ou sudo), l&rsquo;approche est différente. Il n&rsquo;est pas possible de limiter un utilisateur système à ne pas utiliser le protocole SFTP. Et dans un sens c&rsquo;est logique. Néanmoins, il est possible de reprendre le principe suivant de moindre privilège et de silotage des comptes.</p>



<figure class="wp-block-table aligncenter"><table><tbody><tr><td>Ainsi nous devons nous assurer que le compte utilisateur r.one :<br><br>1 &#8211; Ne soit pas administrateur, mais bien utilisateur<br>2 &#8211; De chrooter son home à l&rsquo;identique des utilisateurs du groupe SFTP<br>3 &#8211; Que le compte puisse être verrouiller en cas d&rsquo;êchec d&rsquo;authentification<br>4 &#8211; De demander une authentification supplémentaire (MFA)</td><td><img decoding="async" src="https://erwanguillemard.com/wp-content/uploads/2024/01/IL01_059_R59_schema.png" alt=""></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Mais bon, en règle générale rien ne justifie l&rsquo;usage d&rsquo;un compte utilisateur à usage d&rsquo;exploitation d&rsquo;avoir un accès SFTP. Néanmoins, et par sécurité les comptes utilisateurs doivent ou devraient être restreints (chrootés). Nous ne sommes jamais assez prudent.</p>



<p class="wp-block-paragraph">Autres points, QUID des logs de notre serveur SFTP ? Ces derniers sont consignés sous <strong>/var/log/secure</strong> pour la partie authentification et sous <strong>/var/log/messages</strong> pour la partie commande SFTP (à condition de préciser -l VERBOSE ou INFO à la fin de l&rsquo;instruction de commande Subsystem. Tout dépendra du niveau d&rsquo;information que vous souhaitez faire remonter).</p>



<h3 class="wp-block-heading">Groups, Users and CHROOT</h3>



<p class="wp-block-paragraph">Je vais pour le coup « recycler » mon utilisateur Customer1 ainsi que son home créé dans l&rsquo;article traitant du FTPx.</p>



<pre class="wp-block-code"><code><strong>$ sudo adduser Customer1 --home-dir /mnt/customer1 --shell /sbin/nologin --badname</strong></code></pre>



<p class="wp-block-paragraph">Créons le groupe sftp-user et ajoutons l&rsquo;utilisateur Customer1 comme membre de ce dernier.</p>



<pre class="wp-block-code"><code><strong>$ sudo groupadd sftp-user
$ sudo usermod -aG sftp-user Customer1</strong></code></pre>



<p class="wp-block-paragraph">Maintenant, un partie plus délicate qui nécessite un peu de gymnastique mentale ou tout aussi bien un papier, crayon. Les droits et le chroot d&rsquo;un répertoire peut vite devenir un calvaire. Nous allons donc bien définir notre contexte. </p>



<p class="has-text-align-center wp-block-paragraph"><em>Nous souhaitons que le répertoire home de l&rsquo;utilisateur soit restreint pour l&#8217;empêcher de s&rsquo;échapper de son home ainsi que de lui interdire de créer, modifier et supprimer l&rsquo;arborescence en place au niveau de son home mais de lui permettre dans un répertoire « home » de pouvoir faire ce qu&rsquo;il souhaite.</em></p>



<p class="wp-block-paragraph">Commençons par chroot le home </p>



<pre class="wp-block-code"><code><strong>$ sudo chmod 2750 -R /mnt/customer</strong>1</code></pre>



<p class="wp-block-paragraph">Créons et appliquons les droits sur le répertoire « home »</p>



<pre class="wp-block-code"><code><strong>$ sudo mkdir /mnt/customer1/home
$ sudo chmod 700 -R /mnt/customer1/home
$ sudo chown Customer1:Customer1 -R /mnt/customer1/home/</strong></code></pre>



<p class="wp-block-paragraph">Maintenant reste plus qu&rsquo;à tester le bon fonctionnement. <em>Y à plus qu&rsquo;à, faut qu&rsquo;on</em> comme dirait l&rsquo;autre.</p>



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



<p class="wp-block-paragraph">Je reprends mon client FTPx/SFTP de prédilection sur Windows (WinSCP me susurre-t-on à l&rsquo;oreille) et indique le couple login, mot de passe de l&rsquo;utilisateur Customer1. Diantre que c&rsquo;est agréable de constater que cela fonctionne 🙂</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="945" height="247" src="https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_003_SFTP.jpg" alt="" class="wp-image-1771" srcset="https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_003_SFTP.jpg 945w, https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_003_SFTP-300x78.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_003_SFTP-768x201.jpg 768w" sizes="auto, (max-width: 945px) 100vw, 945px" /></figure>
</div>


<p class="wp-block-paragraph">Nous constatons que les droits du répertoire « Home » (le <strong>/mnt/customer1</strong> et non le répertoire <strong>/home</strong> affiché. Oui j&rsquo;aurais du choisir un nom moins ambigüe. Toutefois, notons que cela nous force à faire travailler notre cafetière qui nous sert de cerveau) de l&rsquo;utilisateur est bien restreint (chroot).</p>



<p class="wp-block-paragraph">Nous constatons également que le fichier<strong> test.html</strong> a des droits qui sont différent et ne semble pas hérité du répertoire /mnt/customer1. C&rsquo;est normal puisque j&rsquo;ai fait des tests auparavant et se fichier va nécessiter l&rsquo;intervention d&rsquo;un administrateur du serveur. </p>



<p class="wp-block-paragraph"><strong>Pourquoi ?</strong> Comme indiqué plus haut, nous n&rsquo;avons pas souhaité laisser la possibilité à l&rsquo;utilisateur de créer, modifier ou supprimer des ressources à la racine de son home.</p>



<p class="wp-block-paragraph">Si nous rentrons dans le répertoire <strong>./home</strong>, les permissions sont différentes et offrent ainsi la possibilité à l&rsquo;utilisateur Customer1 de créer, modifier, supprimer le contenu de ce répertoire.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="956" height="89" src="https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_004_SFTP_N-1.jpg" alt="" class="wp-image-1772" srcset="https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_004_SFTP_N-1.jpg 956w, https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_004_SFTP_N-1-300x28.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_004_SFTP_N-1-768x71.jpg 768w" sizes="auto, (max-width: 956px) 100vw, 956px" /></figure>
</div>


<p class="wp-block-paragraph">Ok nous sommes donc d&rsquo;accord sur la partie restriction et droits sur la partie SFTP mais sommes nous certains que l&rsquo;utilisateur ne peut pas se connecter via un terminal SSH ? Pour le coup, il suffit de faire un test de connexion via un terminal et de consulter les journaux relatifs aux événements d&rsquo;authentification.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="940" height="249" src="https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_005_terminalSSH_failed.jpg" alt="" class="wp-image-1773" style="width:536px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_005_terminalSSH_failed.jpg 940w, https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_005_terminalSSH_failed-300x79.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/02/AP_004_005_terminalSSH_failed-768x203.jpg 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></figure>
</div>


<p class="wp-block-paragraph">Le message est clair, l&rsquo;utilisateur n&rsquo;est pas autorisé à ouvrir de session depuis un terminal. Donc tout va bien puisque tout est conforme à nos attentes.</p>



<p class="wp-block-paragraph">Si nous voulions aller plus loin et s&rsquo;est ce que nous allons faire (libre à vous de passer votre route), penchons nous sur la différence entre FTPS et SFTP sur le plan réseau nous aurions les trames suivantes :</p>



<figure class="wp-block-table aligncenter"><table><tbody><tr><td>SFTP</td><td>FTPS</td></tr><tr><td><img loading="lazy" decoding="async" width="500" height="271" class="wp-image-1775" style="width: 500px;" src="https://erwanguillemard.com/wp-content/uploads/2024/03/AP_004_002_WS_SFTP.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/AP_004_002_WS_SFTP.jpg 955w, https://erwanguillemard.com/wp-content/uploads/2024/03/AP_004_002_WS_SFTP-300x162.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/AP_004_002_WS_SFTP-768x416.jpg 768w" sizes="auto, (max-width: 500px) 100vw, 500px" /></td><td><img loading="lazy" decoding="async" width="500" height="170" class="wp-image-1733" style="width: 500px;" src="https://erwanguillemard.com/wp-content/uploads/2024/03/AP_005_018_connexionFTPES.png" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/03/AP_005_018_connexionFTPES.png 1517w, https://erwanguillemard.com/wp-content/uploads/2024/03/AP_005_018_connexionFTPES-300x102.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/03/AP_005_018_connexionFTPES-1024x349.png 1024w, https://erwanguillemard.com/wp-content/uploads/2024/03/AP_005_018_connexionFTPES-768x262.png 768w" sizes="auto, (max-width: 500px) 100vw, 500px" /></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Rien de magique en sommes si ce n&rsquo;est la mise en évidence de l&rsquo;établissement des transactions via le protocole SSH2 pour le SFTP et l&rsquo;utilisation du protocole SSL/TLS dans sa version 1.3.</p>



<p class="wp-block-paragraph">La grosse différence se trouve sur le mécanisme de chiffrement. L&rsquo;un use d&rsquo;un certificat le second d&rsquo;un jeu de clé. Il sera plus facile de maintenir un jeu de clé qu&rsquo;un certificat. Toutefois, il faut se noter par sécurité de changer de clé au bout d&rsquo;une durée définit comme nous pourrions le faire avec un certificat qui arrive à expiration.</p>



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



<p class="wp-block-paragraph">Nous sommes arrivés au bout des objectifs que nous nous étions fixés au début de ce billet.</p>



<p class="wp-block-paragraph">Le SFTP a pour moi toute ça place dans un service à la demande (SaaS) comme le serait FTPS. Toutefois bien qu&rsquo;il offre certains avantages il a (pour moi) le lourd inconvénient de ne pas être reconnu officiellement (quel inconvénient sans être boudé pour autant).</p>



<p class="wp-block-paragraph">Si la mise en place du service relève de la simplicité, il est nécessaire d&rsquo;être rigoureux et méthodique quand à la création des utilisateurs, la restriction des répertoires « home ». Se basant directement sur le daemon sshd (openssh) la moindre erreur pourrait rendre le système vulnérable par l&rsquo;escalade de privilège ou évasion de l&rsquo;espace restreint. Je recommande fortement la mise en place d&rsquo;une matrice ainsi qu&rsquo;une revue périodique des droits d&rsquo;accès. Egalement, lorsqu&rsquo;un client ou utilisateur n&rsquo;utilise plus le service, il est nécessaire de nettoyer le système dans les règles de l&rsquo;art.</p>



<p class="wp-block-paragraph">Il n&rsquo;est toutefois pas exclu comme pour FTPx de renforcer la sécurité quant à l&rsquo;accès du service si ce dernier est publié vers l&rsquo;extérieur.</p>



<p class="wp-block-paragraph">Au minimum et si possible sur le firewall :</p>



<ul class="wp-block-list">
<li>Activation de l&rsquo;IPS</li>



<li>Activation de l&rsquo;Application Control (fonctionnalité WatchGuard) sur une politique définit</li>



<li>Activation de la Géolocalisation sur la liste des pays autorisées à se connecter au service publié</li>



<li>Utilisation d&rsquo;un proxy FTP </li>
</ul>



<p class="wp-block-paragraph">Au maximum et si possible sur le firewall :</p>



<ul class="wp-block-list">
<li>Filtrer les adresses IP entrantes aux seules IP habilitées. (Généralement les IPs clientes).</li>
</ul>



<p class="wp-block-paragraph">Aujourd&rsquo;hui, il convient à chacun de dire que SFTP > FTPS ou FTPS > SFTP. Pour ma part je prendrai le partie suivant SFTP est équivalent à FTPS, j&rsquo;ai toutefois une préférence SFTP. Néanmoins, basé sur deux technologies différentes, tout dépendra du contexte ainsi que des moyens mis à disposition pour choisir l&rsquo;une ou l&rsquo;autre des protocoles.</p>



<p class="wp-block-paragraph">A d&rsquo;autres égards, il est souvent si ce n&rsquo;est systématiquement privilégié par les éditeurs vis à vis du protocole FTPS.</p>



<p class="wp-block-paragraph">Le mot de la fin :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>« Donne moi ta Key baby, ton port baby hey ! Discute avec moi baby, je veux un serveur SFTP like you ! » Très joli interprétation, vous sortez de votre chroot et zoukez avec Patrick BALKANY en sortie de détention.  </em></p>
<cite>Erwan GUILLEMARD</cite></blockquote>



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



<ul class="wp-block-list">
<li><a href="https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-02#section-10">SFTP</a></li>



<li><a href="https://man.openbsd.org/sshd_config">SSHD_CONFIG</a></li>



<li><a href="https://winscp.net/eng/docs/lang:fr">WINSCP</a></li>



<li><a href="https://www.wireshark.org/">WIRESHARK</a></li>
</ul>


<ol class="wp-block-footnotes"><li id="627249c2-57d4-4aff-9759-c73f8a053439">FTP : File Transfert Protocol <a href="#627249c2-57d4-4aff-9759-c73f8a053439-link" aria-label="Aller à la note de bas de page 1">↩︎</a></li><li id="1cdc31fd-ddf3-4a68-93ae-9d8e89de2751">FTPS : File Transfert Protocol over SSL <a href="#1cdc31fd-ddf3-4a68-93ae-9d8e89de2751-link" aria-label="Aller à la note de bas de page 2">↩︎</a></li><li id="7693c419-1df0-45b8-8a57-e83ce2c30cbd">SFTP : Secure File Transfert Protocol <a href="#7693c419-1df0-45b8-8a57-e83ce2c30cbd-link" aria-label="Aller à la note de bas de page 3">↩︎</a></li><li id="d07b3205-475c-4897-9b4f-536f970a7e30">IETF : Internet Engineering Task Force <a href="#d07b3205-475c-4897-9b4f-536f970a7e30-link" aria-label="Aller à la note de bas de page 4">↩︎</a></li><li id="94786394-aed8-4c3c-bc8a-65468a33f983">SCP : Secure Copy Protocol <a href="#94786394-aed8-4c3c-bc8a-65468a33f983-link" aria-label="Aller à la note de bas de page 5">↩︎</a></li><li id="d5e78572-d265-4325-b720-cfb2eb51a621">RFC : Request For Comments <a href="#d5e78572-d265-4325-b720-cfb2eb51a621-link" aria-label="Aller à la note de bas de page 6">↩︎</a></li></ol>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
