<?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>BDD &#8211; erwan.guillemard</title>
	<atom:link href="https://erwanguillemard.com/tag/bdd/feed/" rel="self" type="application/rss+xml" />
	<link>https://erwanguillemard.com</link>
	<description></description>
	<lastBuildDate>Mon, 08 Dec 2025 14:54:18 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://erwanguillemard.com/wp-content/uploads/2024/02/cropped-Logo-sans-baseline-32x32.png</url>
	<title>BDD &#8211; erwan.guillemard</title>
	<link>https://erwanguillemard.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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>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>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"><strong>$$$ Bonjour le bandit manchot $$$</strong></p>



<p>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"><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">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>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>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>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>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>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>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>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"><strong>M&rsquo;sieur? Et pour l&rsquo;identification des flux ? Pour l&rsquo;attribution des ressources ? Comment on fait ?</strong></p>



<p>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>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 fetchpriority="high" 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></p>



<h4 class="wp-block-heading">Hardware Requirements</h4>



<p>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>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>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>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>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>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>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 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="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>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>A partir du lien fournit par le webwizard installer le nouveau repo :</p>



<p></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-3e11edfbd187fc3db365a2de1d87c0a8"><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 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="(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>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>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></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-70f2c5674e9fe72800367c1d4d6a77f2"><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>Rien de plus simple, il suffit de faire une petite recherche par précaution puis une installation de notre package.</p>



<p></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-2e80e318489950533c87033c0281a6a3"><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>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>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-4a134f820aa2ee375752bbdba91dcb4e"><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>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></p>



<p>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"><a href="https://www.youtube.com/watch?v=B4WJk2G9g38">C&rsquo;est qu&rsquo;un éléphant ça trompe énormément !</a></p>



<p>Et voilà comment on casse tout 😀</p>



<h3 class="wp-block-heading">Déplacement de la BDD Location</h3>



<p>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>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>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-1f8706e1f6978715559ed7a91ef7839e"><code>$ sudo systemctl stop postgresql-18.service
$ sudo systemctl status postgresql-18.service</code></pre>



<p>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>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-447885826fb32d8410dc80fb0c19add8"><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>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>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-d167a86f4bff37aaedd56d0ad0b28f24"><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>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>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>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-5799c527e76b3dd224841f47fcb9af5d"><code>$ sudo mkdir -p /etc/systemd/system/postgresql-18.service.d</code></pre>



<p>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-c0124622492296520e59a54ef19baf65"><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>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-eea78f3bea8eda733c5558b86588ba7e"><code>$ sudo cat /etc/systemd/system/postgresql-18.service.d/override.conf</code></pre>



<p>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-647d939155d8cb9e3cad7b43f10ba049"><code>$ sudo systemctl daemon-reload</code></pre>



<p></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>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>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>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>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>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-61e8cef06eef9a02ab603be7b4d7da6e"><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>Le moment de vérité.</p>



<p class="has-text-align-center"><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-d8b07f4b785f3f155bdcd6b81f7a6b46"><code>$ sudo systemctl start postgresql-18
$ sudo systemctl status postgresql-18</code></pre>



<p></p>
</div></div></div>
</div></div></div>



<p></p>



<p>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-8ac2a6e23ab32c55e977a18495a997d8"><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>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-9b56dcd5448d18c407b282c364d85d41"><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">Ouf ça fonctionne 🙂</p>



<p>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>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>Donc, je me retrousse les manches car je ne suis pas un manche !</p>



<p>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>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>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>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-206bf12b018f671dfb5a3a5538e74534"><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>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>Ouvrons le fichier de configuration <strong>/mnt/database/postgresql/data/postgresql.conf</strong>.</p>



<p>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">Recherchez la section CONNECTIONS AND AUTHENTIFICATION.</p>



<p>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>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>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>Direction <strong>/mnt/database/postgresql/data/pg_hba.conf</strong></p>



<p>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>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>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-04f92932758700a31ff7c7cf90098ec9"><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>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>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>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-d747d17bea2ce23c46de4de55c118af6"><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>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>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>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-ec0a5579650dc9a16dc8cbd6a240b2aa"><code>$ sudo chown -R postgres:postgres /mnt/database/postgresql/data
$ sudo chmod 700 /mnt/database/postgresql/data</code></pre>



<p></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>Nous retrouvons la commande saisie ci-haut si nous avons modifié le database location.</p>



<p>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-61e8cef06eef9a02ab603be7b4d7da6e"><code>$ sudo semanage fcontext -a -t postgresql_db_t "/mnt/database/postgresql(/.*)?"
$ sudo restorecon -Rv /mnt/database/postgresql/</code></pre>



<p></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>Avant c&rsquo;était iptables maintenant c&rsquo;est firewalld ou ufw. Personnellement je reste sur la configuration de firewalld.</p>



<p>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-f3a79338853f5457c41683c309df7089"><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>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>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>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-363e1d6b3d3216113e190e6c29ea0d2b"><code># vim /mnt/database/postgresql/data/postgresql.conf</code></pre>



<p>Se rendre ensuite dans la section REPORTING AND LOGGING. Puis vérifiez que la configuration suivante est active.</p>



<p></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></p>



<p>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-98dfa67952528c695eccdaeed06c0a5c"><code>$ sudo systemctl restart postgresql-18</code></pre>



<p>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>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>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>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>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-00badcfad096e143c66e3e97bb28621c"><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>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-db61721f40e581d497a6d2a796b33b2f"><code>postgres=# CREATE DATABASE bdd_odoo;</code></pre>



<p>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-d8ca2461b14d8ccc2be296cc60c4fc52"><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"><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></p>



<p>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-2129546e20ca91bc0ad4b0849350e583"><code>$ sudo locale -a | grep fr</code></pre>



<p>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-0f16e386d4fd3cd8ec3758c328dc2098"><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>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>Comme tous systèmes de base de données, un incontournable reste la notion de rôle et de privilège. </p>



<p>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>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>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></p>



<p>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-d87a71f61879722c82d63d05166a54de"><code>postgres=# CREATE ROLE r_odoo LOGIN CREATEDB;</code></pre>



<p>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-2b890c0dd8242c780f421a72dff43509"><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>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>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>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>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>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>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 kt-carousel-container-dotstyle-dark"><div class="kt-blocks-carousel-init kb-blocks-fluid-carousel 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"><li class="kb-slide-item kb-gallery-carousel-item"><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"><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"><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"><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"><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"><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"><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"><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></div></div></div></div>


<p>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>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>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-5de0cdf00246c3c34a09d22a2381ba79"><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>Impeccable. Tout fonctionne 🙂</p>



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



<p>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>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>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>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>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>Le mot de la fin :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><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>PROJET &#8211; ITOP, MARIADB &#038; DUMP</title>
		<link>https://erwanguillemard.com/projet-dump-sql/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Tue, 26 Mar 2024 00:43:00 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[iTop]]></category>
		<category><![CDATA[Projet]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=1782</guid>

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



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



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



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



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



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



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



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





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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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


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


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



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



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



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



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



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



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


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


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



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

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

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

Bisous, 

Erwan</code></pre>



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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


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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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


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


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


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


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



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



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



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



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



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



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



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



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



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



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



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


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


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



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



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


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


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


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


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



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



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



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



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



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



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



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



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



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


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


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



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



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



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



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



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



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



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



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


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


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



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



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



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



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



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


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


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



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



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



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



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



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



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



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

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

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



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


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


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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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


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


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



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



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



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



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



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



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



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



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



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



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



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



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

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



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


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


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


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


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



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



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


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


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



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



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


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


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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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


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

					<description><![CDATA[J&#8217;ai toujours préférer les otaries aux dauphins 🙂 Je crois que l&#8217;un des mes plus gros choques (et pas phoques, à une lettre prés ça n&#8217;a plus le même sens !) de mes études et mon implication dans le monde de l&#8217;opensource a été le rachat de MySQL par SUN puis ORACLE. Je n&#8217;ai pas...]]></description>
										<content:encoded><![CDATA[
<p>J&rsquo;ai toujours préférer les otaries aux dauphins 🙂 Je crois que l&rsquo;un des mes plus gros choques (et pas phoques, à une lettre prés ça n&rsquo;a plus le même sens !) de mes études et mon implication dans le monde de l&rsquo;opensource a été le rachat de MySQL par SUN puis ORACLE. </p>



<p>Je n&rsquo;ai pas bien compris dans un premier temps pourquoi un géant tel qu&rsquo;ORACLE avait besoin d&rsquo;acquérir un « petit » tel que MySQL. Puis après quelques soirées à refaire le monde, à boire plus que de raison et hoqueter des requêtes SQL en fin de soirée que ma petite vertu de la BDD relationnel à disparu. </p>



<p>Commençant à me dire que MySQL deviendrait payant comme ORACLE et donc inaccessible pour ma curiosité et appétit intellectuel, je commençais à planifier d&rsquo;écouter la compilation intégrale d&rsquo;Evanescence (fraichement téléchargement sur MegaUpload) sous la douche (habillé naturellement) tout en me lamentant sur mon sort et avenir.</p>



<p>Mais voyez vous, bien que je n&rsquo;ai rien contre Evanescence, une lueur est apparu dans le néant de mes canalisations. Le fork de MySQL était là devant moi, le Dauphin c&rsquo;était métamorphosé en <a href="https://www.youtube.com/watch?v=yUH8KZLeS3g&amp;ab_channel=ArneVinzon">Otarie (aussi douce qu&rsquo;un wapiti)</a>, venant rassurer le jeune étudiant que j&rsquo;étais.</p>



<p class="has-text-align-center"><strong><em>Ouai t&rsquo;as surtout pris une méga caisse sur Dijon, d&rsquo;ailleurs t&rsquo;as terminé dans la fontaine Wilson&#8230;</em></strong></p>



<p>Bon, vous conviendrez que nous distinguons facilement les articles rédigés tard dans la nuit ou tôt le matin.</p>



<p>J&rsquo;aborde dans cet article, l&rsquo;installation de MariaDB. Vous me direz qu&rsquo;il n&rsquo;y a rien de bien sorcier et pourtant vous ne pouvez pas savoir ô combien je me suis cassé les dents sur l&rsquo;implémentation de se SGBD sur un système DURCI RHEL avec une partition dédiée. Etant un grand utilisateur des solutions open sources et communautaires, ce billet sera automatiquement déterré lorsque j&rsquo;aurais besoin de MariaDB.      </p>





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



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



<li><strong>Apps :</strong>&nbsp;MariaDB 10.6</li>



<li><strong>Autres :</strong>&nbsp;<a href="https://erwanguillemard.com/?p=1419">LINUX &#8211; Durcissement GNU, Recommandation ANSSI</a>, <a href="https://erwanguillemard.com/?p=1572">LINUX &#8211; Disk &amp; Part</a></li>
</ul>



<h3 class="wp-block-heading">Installation &#8211; Mariadb</h3>



<p>Si vous êtes sur un environnement durci, avant de lancer les installations il y a quelques choses à faire, sinon vous allez être marron 🙂</p>



<p>J&rsquo;ai choisi de réaliser l&rsquo;installation de Mariadb-server dans sa version 10.6. <strong>Et pourquoi pas la version 10.3 ?</strong> La majorité des applications que j&rsquo;utilise ou que j&rsquo;ai « POC<sup data-fn="0587cb67-4ea4-4d15-92c7-10684b482e4d" class="fn"><a href="#0587cb67-4ea4-4d15-92c7-10684b482e4d" id="0587cb67-4ea4-4d15-92c7-10684b482e4d-link">1</a></sup>é » utilise cette version actuellement. Cela ne change pas grand chose, hormis peut-être dans la configuration du daemon et du client avec la variation de certains paramètres et valeurs d&rsquo;arguments.</p>



<p>Afin de ne pas avoir de problème de version lors de l&rsquo;installation et bien se limiter à la version 10.6 de notre SGBD, nous allons ajouter un repo.</p>



<p>Créer le fichier mariadb.repo et ajouter les informations suivantes (cf le site officiel, <a href="https://mariadb.com/kb/en/yum/">lien</a>).</p>



<pre class="wp-block-code"><code><strong>$ sudo vim /etc/yum.repo.d/mariadb.repo</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="759" height="117" src="https://erwanguillemard.com/wp-content/uploads/2024/02/AP_002_014_mariadb_repo.png" alt="" class="wp-image-1539" srcset="https://erwanguillemard.com/wp-content/uploads/2024/02/AP_002_014_mariadb_repo.png 759w, https://erwanguillemard.com/wp-content/uploads/2024/02/AP_002_014_mariadb_repo-300x46.png 300w" sizes="auto, (max-width: 759px) 100vw, 759px" /></figure>
</div>


<p>Relançons un petit update pour récupérer les metadatas du repo Mariadb. Profitez également de ce moment pour mettre à jour votre système. Attention toutefois si le système est durci. Puis installer le package mariadb-server est mysql (vérifier que la source du paquet est bien le repo ajouté précédemment).</p>



<pre class="wp-block-code"><code><strong>$ sudo dnf clean all 
# dnf update
# dnf install mariadb-server mysql</strong></code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="939" height="403" src="https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_015_mariadb_install.png" alt="" class="wp-image-1540" srcset="https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_015_mariadb_install.png 939w, https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_015_mariadb_install-300x129.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_015_mariadb_install-768x330.png 768w" sizes="auto, (max-width: 939px) 100vw, 939px" /></figure>



<p>IM-PEC-CA-BLE ! (D&rsquo;un autre côté c&rsquo;est pas fou ce que nous venons de faire&#8230;). Ajoutons le daemon mariadb-server comme service à lancer automatiquement au démarrage (sinon c&rsquo;est c*n va falloir le faire manuellement si la bécane va reboot).</p>



<pre class="wp-block-code"><code>$ sudo systemctl enable mariadb</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="936" height="85" src="https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_016_mariadb_enable.png" alt="" class="wp-image-1541" srcset="https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_016_mariadb_enable.png 936w, https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_016_mariadb_enable-300x27.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_016_mariadb_enable-768x70.png 768w" sizes="auto, (max-width: 936px) 100vw, 936px" /></figure>



<h3 class="wp-block-heading">Configuration &#8211; Daemon Mariadb</h3>



<p>Pour faire simple, le server mariadb dans sa configuration par défaut tourne sur le disque système (dans la partition <strong>/var</strong> si nous voulons être plus précis). Ce qui n&rsquo;est absolument pas ce que nous souhaitons puisque comme c&rsquo;est un SGBD, il est inconservable de laisser ce dernier sur l&rsquo;une des partitions système. Dédions un disque et montons la partition sous <strong>/mnt/databases</strong> (si besoin, Je vous invite à parcourir la section déjà documentée dans l&rsquo;article <a href="https://erwanguillemard.com/apps-mutt/" data-type="link" data-id="https://erwanguillemard.com/apps-mutt/"></a><a href="https://erwanguillemard.com/?p=1572">LINUX &#8211; Disk &amp; Part</a>). </p>



<p>Copier les données du répertoire mysql dans le répertoire databases.</p>



<pre class="wp-block-code"><code><strong>$ sudo rsync -av /var/lib/mysql /mnt/databases/</strong></code></pre>



<p>Supprimer le répertoire d&rsquo;origine ou renommer le si vous êtes frileux (perso j&rsquo;ai toujours froid).</p>



<pre class="wp-block-code"><code><strong>$ sudo mv /var/lib/mysql /var/lib/mysql.d.ori</strong></code></pre>



<p>Modifier le contenu du fichier de configuration de mysql en ajoutant le contenu suivant. </p>



<figure class="wp-block-table"><table><tbody><tr><td><strong>/!\ Attention</strong> à bien adapter les chemins d&rsquo;accès au répertoire mysql. A vous d&rsquo;adapter si besoin la configuration selon les performances de votre serveur et des prérequis éditeur relatif à votre application.</td></tr></tbody></table></figure>



<pre class="wp-block-code"><code><strong>$ sudo mv /etc/my.cnf /etc/my.cnf.ori
$ sudo vim /etc/my.cnf
$ sudo chmod 644 /etc/my.cnf</strong></code></pre>



<pre class="wp-block-code has-theme-palette-8-background-color has-background"><code>&#91;mysqld]
#datadir=/var/lib/mysql
<strong>datadir=/mnt/databases/mysql</strong>
#socket=/var/lib/mysql/mysql.sock
<strong>socket=/mnt/databases/mysql/mysql.sock</strong>
log-bin=mysql-bin
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
innodb_buffer_pool_size = 512M
innodb_log_buffer_size = 512M
key_buffer_size = 512M
key_buffer = 512M
query_cache_size = 256M
query_cache_limit = 4M
query_cache_type = 1
max_allowed_packet = 2048M
max_connections = 300
# # Settings user and group are ignored when systemd is used.
# # If you need to run mysqld under a different user or group,
# # customize your systemd unit file for mariadb according to the
# # instructions in http://fedoraproject.org/wiki/Systemd
#
&#91;mysqld_safe]
log-error=/var/log/mariadb/error.log
pid-file=/var/run/mariadb/mariadb.pidu
max_allowed_packet=2048M
#
#
# This group is read both both by the client and the server
# use it for options that affect everything
#
&#91;client-server]
<strong>socket=/mnt/databases/mysql/mysql.sock</strong>
#innodb_buffer_pool_size = 512M
#query_cache_size = 32M
#query_cache_limit = 1M
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
</code></pre>



<p>C&rsquo;est bien joli, mais dans notre environnement durci, le changement d&#8217;emplacement du répertoire mysql a un impact. Si nous essayons de démarrer le service nous aurons un « petit » message d&rsquo;erreur. Deux possibilités</p>



<ul class="wp-block-list">
<li>🙁 : Désactiver le SELinux</li>



<li>🙂 : Changer le contexte de fichier propre à mysql/mariadb</li>
</ul>



<p>Le doute m&rsquo;habite, que choisir ? </p>



<p>Vous avez compris, nous allons redéfinir et relabeliser le contexte de fichier pour le daemon mariadb quant à son nouvel emplacement.</p>



<pre class="wp-block-code"><code><strong># semanage fcontext -a -t mysqld_db_t "/mnt/databases/mysql(/.*)?"
# restorecon -R /mnt/databases/mysql</strong></code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="933" height="60" src="https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_017_mariadb_semanage.png" alt="" class="wp-image-1545" srcset="https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_017_mariadb_semanage.png 933w, https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_017_mariadb_semanage-300x19.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_017_mariadb_semanage-768x49.png 768w" sizes="auto, (max-width: 933px) 100vw, 933px" /></figure>



<p>Vous noterez que j&rsquo;ai fait une erreur. Normal car j&rsquo;ai du retaper la commande suite à une erreur de couche 8&#8230; En temps normal, vous n&rsquo;avez pas de retour si la commande se passe bien. Pour vérifier que tout est bien fonctionnel, démarrer le daemon et vérifier qu&rsquo;il tourne bien. Vous pouvez aussi reboot la machine.</p>



<p>Si vous n&rsquo;avez pas reboot la bécane et que vous avez un environnement durci, il y a un autre petit truc à faire 🙂</p>



<pre class="wp-block-code"><code><strong>$ sudo systemctl start mariadb
$ systemctl status mariadb</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="933" height="401" src="https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_018_mariadb_result.png" alt="" class="wp-image-1546" srcset="https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_018_mariadb_result.png 933w, https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_018_mariadb_result-300x129.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_018_mariadb_result-768x330.png 768w" sizes="auto, (max-width: 933px) 100vw, 933px" /></figure>
</div>


<h3 class="wp-block-heading">Sécurisation &#8211; Daemon Mariadb</h3>



<p>C&rsquo;est la dernière ligne droite. Il ne nous reste plus qu&rsquo;à sécuriser le daemon mariadb. Cette sécurisation vise à définir le mot de passe du compte root, nettoyer la BDD de test, les connexions anonymes et potentiellement les comptes root accessibles depuis l&rsquo;extérieur.</p>



<pre class="wp-block-code"><code><strong># mariadb-secure-installation -S /mnt/databases/mysql/mysql.sock</strong></code></pre>



<p>Si vous ne précisez pas le <strong>-S</strong>, la commande ira chercher dans le chemin par défaut (<strong>/var/lib/mysql</strong>) le fichier mysql.sock. Comme nous avons déplacé le moteur de la base de données, il convient de lui donner le bon chemin.</p>



<figure class="wp-block-table"><table><tbody><tr><td><img loading="lazy" decoding="async" width="500" height="529" class="wp-image-1547" style="width: 500px;" src="https://erwanguillemard.com/wp-content/uploads/2024/02/AP_002_019_mariadb_secure1.png" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/02/AP_002_019_mariadb_secure1.png 935w, https://erwanguillemard.com/wp-content/uploads/2024/02/AP_002_019_mariadb_secure1-284x300.png 284w, https://erwanguillemard.com/wp-content/uploads/2024/02/AP_002_019_mariadb_secure1-768x812.png 768w" sizes="auto, (max-width: 500px) 100vw, 500px" /></td><td><img loading="lazy" decoding="async" width="500" height="316" class="wp-image-1548" style="width: 500px;" src="https://erwanguillemard.com/wp-content/uploads/2024/02/AP_002_019_mariadb_secure2.png" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2024/02/AP_002_019_mariadb_secure2.png 936w, https://erwanguillemard.com/wp-content/uploads/2024/02/AP_002_019_mariadb_secure2-300x190.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/02/AP_002_019_mariadb_secure2-768x486.png 768w" sizes="auto, (max-width: 500px) 100vw, 500px" /></td></tr></tbody></table></figure>



<p>Ca m&rsquo;a l&rsquo;air pas mal cette histoire, et si nous vérifions que c&rsquo;est bien fonctionnel ?</p>



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



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="867" height="292" src="https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_020_mariadb_result.png" alt="" class="wp-image-1550" srcset="https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_020_mariadb_result.png 867w, https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_020_mariadb_result-300x101.png 300w, https://erwanguillemard.com/wp-content/uploads/2024/01/AP_002_020_mariadb_result-768x259.png 768w" sizes="auto, (max-width: 867px) 100vw, 867px" /></figure>



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



<p>L&rsquo;installation et configuration réalisées nous garantissent une sécurité quand à la disponibilité de notre système ainsi qu&rsquo;a l&rsquo;accès de notre SGBD. D&rsquo;autres actions restent à réaliser sur la couche système pour durcir d&rsquo;avantages la sécurité.</p>



<p>La configuration du moteur SQL relève de la plus grande criticitée et nécessite d&rsquo;être adapter en conséquence selon les performances du chaque serveur. Une mauvaise configuration peut entrainer le crash de la bécane. Il est impératif d&rsquo;opérer les changements en dehors des heures de production ou dans un environnement de préproduction (c&rsquo;est un conseil et du vécu).</p>



<p>L&rsquo;une des grandes questions qui me taraude à sec depuis un moment serait d&rsquo;étudier le comportement d&rsquo;une mise à niveau du moteur dans une version supérieure en restant sur un environnement durci dédié et non conteneurisé. Comment cela se comportera t&rsquo;il ? Quel serait l&rsquo;impact sur le service ? Serait il plus chronophage que de migrer sur un environnement franchement déployé ? <em>To be continued&#8230;</em></p>



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



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>Je Select une Otarie et JOIN IN un kebab WHERE prix_id = 17€. </em></p>
<cite>Erwan GUILLEMARD</cite></blockquote>



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



<ul class="wp-block-list">
<li><a href="https://mariadb.com/kb/en/yum/">Mariadb &#8211; Repo</a></li>
</ul>


<ol class="wp-block-footnotes"><li id="0587cb67-4ea4-4d15-92c7-10684b482e4d"><strong>POC</strong> : Proof Of Concept, soit Preuve de Concept pour étudier ou non la faisabilité d&rsquo;un projet. <a href="#0587cb67-4ea4-4d15-92c7-10684b482e4d-link" aria-label="Aller à la note de bas de page 1">↩︎</a></li></ol>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
