<?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>Administration système &#8211; Manoa Ratefiarison</title>
	<atom:link href="https://manoa.ratefiarison.com/category/sysadmin/feed/" rel="self" type="application/rss+xml" />
	<link>https://manoa.ratefiarison.com</link>
	<description>Music &#38; code</description>
	<lastBuildDate>Tue, 07 Jan 2025 08:55:42 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://manoa.ratefiarison.com/wp-content/uploads/2022/09/cropped-manoaratefiarison-favicon-32x32.png</url>
	<title>Administration système &#8211; Manoa Ratefiarison</title>
	<link>https://manoa.ratefiarison.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>CodeIgniter : corriger les requêtes lentes SELECT GET_LOCK() sur ci_sessions</title>
		<link>https://manoa.ratefiarison.com/2025/01/07/codeigniter-requetes-lentes-select-get_lock-ci_sessions/</link>
					<comments>https://manoa.ratefiarison.com/2025/01/07/codeigniter-requetes-lentes-select-get_lock-ci_sessions/#respond</comments>
		
		<dc:creator><![CDATA[Manoa Ratefiarison]]></dc:creator>
		<pubDate>Tue, 07 Jan 2025 10:00:00 +0000</pubDate>
				<category><![CDATA[Administration système]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[sessions]]></category>
		<guid isPermaLink="false">https://manoa.ratefiarison.com/?p=328</guid>

					<description><![CDATA[Dans ce petit article, je vous indique comment corriger les requêtes SQL lentes SELECT GET_LOCK() de la table ci_sessions sur une installation de CodeIgniter. Que signifient les requêtes lentes SELECT GET_LOCK() sur ci_sessions ? La table ci_sessions est destiné à stocker les sessions des visiteurs d&#8217;un site CodeIgniter. Celle-ci est notamment utilisée quand la session ... <a title="CodeIgniter : corriger les requêtes lentes SELECT GET_LOCK() sur ci_sessions" class="read-more" href="https://manoa.ratefiarison.com/2025/01/07/codeigniter-requetes-lentes-select-get_lock-ci_sessions/" aria-label="En savoir plus sur CodeIgniter : corriger les requêtes lentes SELECT GET_LOCK() sur ci_sessions">Lire la suite</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Dans ce petit article, je vous indique comment corriger les requêtes SQL lentes SELECT GET_LOCK() de la table ci_sessions sur une installation de CodeIgniter.</p>



<span id="more-328"></span>



<h2 class="wp-block-heading">Que signifient les requêtes lentes SELECT GET_LOCK() sur ci_sessions ?</h2>



<p class="wp-block-paragraph">La table <strong>ci_sessions</strong> est destiné à stocker les sessions des visiteurs d&rsquo;un site CodeIgniter. Celle-ci est notamment utilisée quand la <strong>session driver</strong> est configuré sur <strong>database</strong>.</p>



<p class="wp-block-paragraph">Elle permet à CodeIgniter de stocker les informations de sessions de chaque visiteur dans la base de données. Selon les cas, cela peut présenter un avantage ou un désavantage.</p>



<h2 class="wp-block-heading">Pourquoi la requête SELECT GET_LOCK() est lente ?</h2>



<p class="wp-block-paragraph">En vérité, la requête en elle-même n&rsquo;est pas lente. Elle est juste suspendue pendant la période de verrouillage. En effet, cette requête fait justement <a href="https://forum.codeigniter.com/showthread.php?tid=64893&amp;pid=330998#pid330998" data-type="link" data-id="https://forum.codeigniter.com/showthread.php?tid=64893&amp;pid=330998#pid330998" target="_blank" rel="noreferrer noopener">ce qu&rsquo;il est censé faire</a> : verrouiller la session durant le chargement d&rsquo;une page.</p>



<p class="wp-block-paragraph">La constatation de lenteur survient lorsque la requête a été initiée alors qu&rsquo;un autre chargement de page est en cours : il attend alors que l&rsquo;autre page ait fini de charger pour obtenir à son tour le verrou sur la table de session.</p>



<p class="wp-block-paragraph">Vous constaterez alors une entrée de ce type dans votre fichier log slow queries dans MySQL :</p>



<pre class="wp-block-code"><code># User@Host: codeigniter&#91;codeigniter] @ localhost &#91;127.0.0.1]
# Thread_id: 12345  Schema: codeigniter  QC_hit: No
# Query_time: 22.040801  Lock_time: 0.000000  Rows_sent: 1  Rows_examined: 0
# Rows_affected: 0  Bytes_sent: 70
SET timestamp=xxxxxxxxxx;
SELECT GET_LOCK('653407ce5dddb2b0745d76a5f6dc73c0', 300) AS ci_session_lock;</code></pre>



<h2 class="wp-block-heading">Comment éviter que la requête SELECT GET_LOCK() empêche le chargement simultané des pages ?</h2>



<p class="wp-block-paragraph">Si vous souhaitez permettre à un utilisateur de charger simultanément plusieurs pages, vous devriez songer à utiliser un autre système de stockage de session qui vous permet un accès simultané à celui-ci.</p>



<p class="wp-block-paragraph">Le plus simple est de basculer sur un stockage de session par fichiers. Pour cela, ajustez les paramètres suivants dans votre fichier de configuration CodeIgniter :</p>



<pre class="wp-block-code"><code>$config&#91;'sess_driver'] = 'files'; // was previously 'database'
$config&#91;'sess_save_path'] = sys_get_temp_dir();</code></pre>



<p class="wp-block-paragraph">Vous pouvez également envisager d&rsquo;utiliser d&rsquo;<a href="https://codeigniter.com/user_guide/libraries/sessions.html#session-drivers" data-type="link" data-id="https://codeigniter.com/user_guide/libraries/sessions.html#session-drivers" target="_blank" rel="noreferrer noopener">autres systèmes de stockage de sessions</a> telles que Memcached ou Redis, notamment si votre application requiert un système de session centralisée. </p>
]]></content:encoded>
					
					<wfw:commentRss>https://manoa.ratefiarison.com/2025/01/07/codeigniter-requetes-lentes-select-get_lock-ci_sessions/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mettre en cache les pages avec Varnish et WP Fastest Cache</title>
		<link>https://manoa.ratefiarison.com/2024/06/01/mettre-en-cache-les-pages-avec-varnish-et-wp-fastest-cache/</link>
					<comments>https://manoa.ratefiarison.com/2024/06/01/mettre-en-cache-les-pages-avec-varnish-et-wp-fastest-cache/#respond</comments>
		
		<dc:creator><![CDATA[Manoa Ratefiarison]]></dc:creator>
		<pubDate>Sat, 01 Jun 2024 08:30:40 +0000</pubDate>
				<category><![CDATA[Administration système]]></category>
		<category><![CDATA[Technologies web]]></category>
		<guid isPermaLink="false">https://manoa.ratefiarison.com/?p=319</guid>

					<description><![CDATA[WP Fastest Cache fait partie des plugins WordPress de cache qui désactivent le cache navigateur sur les pages HTML. Ceci a pour conséquence de désactiver également la mise en cache de ces pages sur Varnish. Voici comment résoudre le problème. Pourquoi les plugins WordPress désactivent le cache navigateur des pages HTML ? WP Fastest Cache ... <a title="Mettre en cache les pages avec Varnish et WP Fastest Cache" class="read-more" href="https://manoa.ratefiarison.com/2024/06/01/mettre-en-cache-les-pages-avec-varnish-et-wp-fastest-cache/" aria-label="En savoir plus sur Mettre en cache les pages avec Varnish et WP Fastest Cache">Lire la suite</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">WP Fastest Cache fait partie des plugins WordPress de cache qui désactivent le cache navigateur sur les pages HTML. Ceci a pour conséquence de désactiver également la mise en cache de ces pages sur Varnish. Voici comment résoudre le problème.</p>



<span id="more-319"></span>



<h2 class="wp-block-heading">Pourquoi les plugins WordPress désactivent le cache navigateur des pages HTML ?</h2>



<p class="wp-block-paragraph">WP Fastest Cache n&rsquo;est pas le seul à le faire. Selon les plugins, la manipulation des headers Expires, Cache-Control et autres leur permettent de forcer le navigateur à faire une requête HTTP au serveur, et ainsi éviter que le navigateur ait des données obsolètes.</p>



<p class="wp-block-paragraph">Cependant, puisque Varnish utilise aussi ces en-têtes HTTP pour prendre des décisions de mise en cache, cela désactive systématiquement le cache Varnish en marquant ces requêtes comme « uncacheable ».</p>



<p class="wp-block-paragraph">En plus, les plugins comme WP Fastest Cache intègrent un mécanisme de purge de Varnish, ce qui permet donc de supprimer immédiatement les données de cache obsolètes sur Varnish, sans attendre que le cache expire.</p>



<h2 class="wp-block-heading">Comment forcer la mise en cache ?</h2>



<p class="wp-block-paragraph">Il faut décomposer le problème en deux. D&rsquo;abord, il faut marquer les réponses HTTP concernées pour éviter qu&rsquo;on puisse forcer la mise en cache partout. Cela se fera au niveau d&rsquo;Apache. Ensuite, il faudra détecter ce marquage au niveau de Varnish pour forcer la mise en cache.</p>



<h3 class="wp-block-heading">Marquer les réponses HTTP servis depuis le cache WP Fastest Cache</h3>



<p class="wp-block-paragraph">WP Fastest Cache utilise <strong>mod_rewrite</strong> pour réécrire les URL vers les fichiers HTML préenregistrés dans le cache. Cela tombe bien, Apache sait ajouter des en-têtes HTTP selon la correspondance de dossier.</p>



<p class="wp-block-paragraph">Dans votre VirtualHost (typiquement dans <strong>/etc/apache2/sites-available/domaine.com</strong>), ajoutez la directive suivante pour ajouter un header aux réponses servies depuis le dossier de cache de WP Fastest Cache :</p>



<pre class="wp-block-code"><code>&lt;Directory ~ "wp\-content\/cache\/all(\/.*)*\/index\.html$"&gt;
    Header set Edge-Cache-Platform "wpfastestcache"
&lt;/Directory&gt;</code></pre>



<p class="wp-block-paragraph">Redémarrez Apache ensuite :</p>



<pre class="wp-block-code"><code>systemctl restart apache2</code></pre>



<p class="wp-block-paragraph">À partir de ce moment, si vous faites une requête HTTP sur votre site et que la réponse est en cache par WP Fastest Cache, vous pourriez voir l&rsquo;en-tête « Edge-Cache-Platform » (que vous pouvez d&rsquo;ailleurs ajuster avec un autre nom, si vous souhaitez) :</p>



<pre class="wp-block-code"><code>$ curl -I http://www.exemple.com
HTTP/2 200
date: Sat, 01 Jun 2024 08:21:04 GMT
content-type: text/html; charset=UTF-8
server: nginx
vary: User-Agent,Accept-Encoding
last-modified: Fri, 31 May 2024 09:16:26 GMT
edge-cache-platform: wpfastestcache
cache-control: max-age=0, no-cache, no-store, must-revalidate
pragma: no-cache
expires: Mon, 29 Oct 1923 20:30:00 GMT
age: 0
accept-ranges: bytes
edge-cache-status: MISS</code></pre>



<h3 class="wp-block-heading">Détecter le marquage et appliquer les caches</h3>



<p class="wp-block-paragraph">Maintenant, dans votre VCL, ajoutez ceci dans la subroutine <strong>vcl_backend_response </strong>:</p>



<pre class="wp-block-code"><code>sub vcl_backend_response {
    if (beresp.ttl &lt; 86400s &amp;&amp; beresp.http.Content-Type ~ "text/html" &amp;&amp; beresp.http.Edge-Cache-Platform ~ "wpfastestcache") {
        set beresp.ttl = 86400s;
        set beresp.grace = 86400s;
        return(deliver);
    }
}</code></pre>



<p class="wp-block-paragraph">Ceci détecte le header et le TTL (durée de validité du cache), et force celui-ci à 86 400 secondes (une journée) si elle est inférieure.</p>



<p class="wp-block-paragraph">Notez également la présence de <strong>return(deliver)</strong>, celui-ci est en place afin que le built-in VCL de Varnish n&rsquo;entre pas en action si la requête correspond aux conditions du <strong>if</strong>. En effet, le built-in VCL va réajuster le TTL à 120s et le beresp.uncacheable = true si elle est exécutée, à cause des headers Cache-Control et autres.</p>



<p class="wp-block-paragraph">Maintenant, la requête est bien mis en cache :</p>



<pre class="wp-block-code"><code>$ curl -I http://www.exemple.com
HTTP/2 200
date: Sat, 01 Jun 2024 08:26:04 GMT
content-type: text/html; charset=UTF-8
content-length: 85497
server: nginx
vary: User-Agent,Accept-Encoding
last-modified: Fri, 31 May 2024 09:16:26 GMT
edge-cache-platform: wpfastestcache
cache-control: max-age=0, no-cache, no-store, must-revalidate
pragma: no-cache
expires: Mon, 29 Oct 1923 20:30:00 GMT
age: 300
accept-ranges: bytes
edge-cache-status: HIT</code></pre>



<p class="wp-block-paragraph">Vous pouvez éventuellement décider de supprimer l&rsquo;en-tête de réponse HTTP <strong>Edge-Cache-Platform</strong> au niveau de Varnish dans le <strong>if</strong> précédemment proposé, si vous souhaitez que cette information ne soit pas publique.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://manoa.ratefiarison.com/2024/06/01/mettre-en-cache-les-pages-avec-varnish-et-wp-fastest-cache/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Remplacer FleetSSL par AutoSSL sur cPanel</title>
		<link>https://manoa.ratefiarison.com/2024/01/07/remplacer-fleetssl-par-autossl/</link>
					<comments>https://manoa.ratefiarison.com/2024/01/07/remplacer-fleetssl-par-autossl/#respond</comments>
		
		<dc:creator><![CDATA[Manoa Ratefiarison]]></dc:creator>
		<pubDate>Sun, 07 Jan 2024 07:00:00 +0000</pubDate>
				<category><![CDATA[Administration système]]></category>
		<category><![CDATA[autossl]]></category>
		<category><![CDATA[cpanel]]></category>
		<category><![CDATA[fleetssl]]></category>
		<category><![CDATA[let's encrypt]]></category>
		<guid isPermaLink="false">https://manoa.ratefiarison.com/?p=313</guid>

					<description><![CDATA[FleetSSL (anciennement connu sous le nom de Let&#8217;s Encrypt for cPanel) a annoncé en 2023 la fin du développement et de la maintenance de cet outil. Dans cet article, nous allons voir comment remplacer FleetSSL par AutoSSL. Dans les prémices des certificats SSL gratuits, cPanel n&#8217;avait pas proposé une intégration avec le service Let&#8217;s Encrypt ... <a title="Remplacer FleetSSL par AutoSSL sur cPanel" class="read-more" href="https://manoa.ratefiarison.com/2024/01/07/remplacer-fleetssl-par-autossl/" aria-label="En savoir plus sur Remplacer FleetSSL par AutoSSL sur cPanel">Lire la suite</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><a href="https://fleetssl.com/" target="_blank" rel="noreferrer noopener">FleetSSL</a> (anciennement connu sous le nom de Let&rsquo;s Encrypt for cPanel) a annoncé en 2023 la fin du développement et de la maintenance de cet outil. Dans cet article, nous allons voir comment remplacer FleetSSL par AutoSSL.</p>



<span id="more-313"></span>



<p class="wp-block-paragraph">Dans les prémices des certificats SSL gratuits, cPanel n&rsquo;avait pas proposé une intégration avec le service Let&rsquo;s Encrypt qui est, jusqu&rsquo;à maintenant, le service le plus populaire pour ce type de besoin. Pour palier à ce manque, FleetSSL a été créé. Ce plugin cPanel gère le processus complet de la création et de l&rsquo;installation des certificats SSL avec le service Let&rsquo;s Encrypt.</p>



<p class="wp-block-paragraph">Aujourd&rsquo;hui, cPanel a (enfin) intégré nativement Let&rsquo;s Encrypt dans son outil nommé AutoSSL. Et comme FleetSSL est désormais un outil abandonné, il est intéressant de rebasculer sur AutoSSL.</p>



<h2 class="wp-block-heading">Désinstallation de FleetSSL</h2>



<p class="wp-block-paragraph">Pour désinstaller FleetSSL, rien de plus simple. Dans le terminal root de votre serveur cPanel, désinstallez tout simplement le package :</p>



<pre class="wp-block-code"><code>yum -y remove letsencrypt-cpanel</code></pre>



<p class="wp-block-paragraph">À noter que sur la version 0.6.1 spécifiquement, la désinstallation peut échouer en raison d&rsquo;un bug dans le script de désinstallation intégré. Dans ce cas précis, il va falloir le désinstaller manuellement :</p>



<pre class="wp-block-code"><code>rpm -e --justdb letsencrypt-cpanel-0.6.1-1</code></pre>



<p class="wp-block-paragraph"><strong>Remarque : la désinstallation de FleetSSL ne supprime pas les certificats SSL créés avec celui-ci.</strong> Les paramètres utilisateurs et paramètres systèmes sont également préservés, chose que vous pouvez supprimer manuellement :</p>



<pre class="wp-block-code"><code>/home/*/.cpanel/nvdata/letsencrypt-cpanel
/etc/letsencrypt-cpanel.conf
/etc/letsencrypt-cpanel.licence</code></pre>



<h2 class="wp-block-heading">Activation de Let&rsquo;s Encrypt dans AutoSSL</h2>



<p class="wp-block-paragraph">Vous pouvez configurer Let&rsquo;s Encrypt comme fournisseur de certificat SSL dans WHM > SSL/TLS > Manage AutoSSL si ce n&rsquo;est pas déjà le cas.</p>



<p class="wp-block-paragraph">Si Let&rsquo;s Encrypt ne figure pas sur la liste, il sera nécessaire de l&rsquo;installer manuellement avec la commande suivante :</p>



<pre class="wp-block-code"><code>/usr/local/cpanel/scripts/install_lets_encrypt_autossl_provider</code></pre>



<h2 class="wp-block-heading">Mettre à jour les certificats SSL</h2>



<p class="wp-block-paragraph">Une fois AutoSSL configuré, vous pouvez cliquer sur « Run AutoSSL for all users » pour exécuter AutoSSL. Ceci permettra d&rsquo;anticiper le remplacement des certificats SSL Let&rsquo;s Encrypt créé par FleetSSL qui sont proches de la date d&rsquo;expiration.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://manoa.ratefiarison.com/2024/01/07/remplacer-fleetssl-par-autossl/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>16 actions pour optimiser une requête SQL</title>
		<link>https://manoa.ratefiarison.com/2023/10/20/16-actions-pour-optimiser-une-requete-sql/</link>
					<comments>https://manoa.ratefiarison.com/2023/10/20/16-actions-pour-optimiser-une-requete-sql/#respond</comments>
		
		<dc:creator><![CDATA[Manoa Ratefiarison]]></dc:creator>
		<pubDate>Fri, 20 Oct 2023 12:00:00 +0000</pubDate>
				<category><![CDATA[Administration système]]></category>
		<category><![CDATA[Technologies web]]></category>
		<guid isPermaLink="false">https://manoa.ratefiarison.com/?p=308</guid>

					<description><![CDATA[Voici 16 actions à faire pour optimiser votre requête SQL. L&#8217;optimisation permet de réduire le temps d&#8217;exécution et les ressources exploitées (CPU et I/O) pour l&#8217;exécution de la requête.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Voici 16 actions à faire pour optimiser votre requête SQL. L&rsquo;optimisation permet de réduire le temps d&rsquo;exécution et les ressources exploitées (CPU et I/O) pour l&rsquo;exécution de la requête.</p>



<ol class="wp-block-list">
<li>Créer des index sur les tables. Sélectionner les colonnes plus utilisées avec WHERE et les indexer.</li>



<li>Utiliser la fonction EXIST() au lieu de COUNT() pour vérifier l&rsquo;existence d&rsquo;un enregistrement dans la table.</li>



<li>Ne sélectionner que les champs utiles (éviter SELECT *)</li>



<li>Eviter les sous-requêtes dans WHERE</li>



<li>Eviter SELECT DISTINCT autant que possible</li>



<li>Utiliser WHERE au lieu de HAVING</li>



<li>Créer des jointures uniquement avec INNER JOIN (éviter des jointures avec WHERE)</li>



<li>Utiliser LIMIT pour limiter le volume de résultat</li>



<li>Utiliser UNION ALL au lieu de UNION autant que possible</li>



<li>Utiliser UNION WHERE au lieu d&rsquo;un long WHERE &#8230; or &#8230; or &#8230;</li>



<li>Exécuter les requêtes de maintenances pendant les périodes calmes en trafic (par exemple les requêtes de nettoyage de la base de données)</li>



<li>Eviter l&rsquo;utilisation de OR avec les jointures</li>



<li>Utiliser des tables temporaires</li>



<li>Supprimer les index avant d&rsquo;importer une large set de données et remettre après cela</li>



<li>Eviter les opérateurs de négation (!= ou &lt;>)</li>



<li>Réduire la quantité de sous-requêtes</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://manoa.ratefiarison.com/2023/10/20/16-actions-pour-optimiser-une-requete-sql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Comment réduire la taille utilisée par _wp_attachment_metadata sur WordPress ?</title>
		<link>https://manoa.ratefiarison.com/2023/09/29/nettoyer-wp-attachment-metadata/</link>
					<comments>https://manoa.ratefiarison.com/2023/09/29/nettoyer-wp-attachment-metadata/#respond</comments>
		
		<dc:creator><![CDATA[Manoa Ratefiarison]]></dc:creator>
		<pubDate>Fri, 29 Sep 2023 06:00:00 +0000</pubDate>
				<category><![CDATA[Administration système]]></category>
		<category><![CDATA[base de données]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[nettoyage]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://manoa.ratefiarison.com/?p=303</guid>

					<description><![CDATA[_wp_attachment_metadata peut être l&#8217;une des métadonnées les plus gourmands sur WordPress. Elle se situe dans la table wp_postmeta et concerne les médias dans WordPress. Voici comment optimiser sa taille. Que contient _wp_attachment_metadata ? _wp_attachment_metadata contient les métadonnées associées à votre image dans un format sérialisé pour se permettre d&#8217;être stocké dans un champ « string » (texte). ... <a title="Comment réduire la taille utilisée par _wp_attachment_metadata sur WordPress ?" class="read-more" href="https://manoa.ratefiarison.com/2023/09/29/nettoyer-wp-attachment-metadata/" aria-label="En savoir plus sur Comment réduire la taille utilisée par _wp_attachment_metadata sur WordPress ?">Lire la suite</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>_wp_attachment_metadata </strong>peut être l&rsquo;une des métadonnées les plus gourmands sur WordPress. Elle se situe dans la table <strong>wp_postmeta </strong>et concerne les médias dans WordPress. Voici comment optimiser sa taille.</p>



<span id="more-303"></span>



<h2 class="wp-block-heading">Que contient _wp_attachment_metadata ?</h2>



<p class="wp-block-paragraph"><strong>_wp_attachment_metadata </strong>contient les métadonnées associées à votre image dans un format sérialisé pour se permettre d&rsquo;être stocké dans un champ « string » (texte).</p>



<p class="wp-block-paragraph">Pour constater la taille utilisée par ce dernier, vous pouvez exécuter la requête SQL suivante sur votre base de données (depuis phpMyAdmin par exemple) :</p>



<pre class="wp-block-code"><code>SELECT SUM(LENGTH(meta_value)) as meta_size FROM wp_postmeta WHERE meta_key = '_wp_attachment_metadata';</code></pre>



<p class="wp-block-paragraph">À noter que la valeur indiquée est <strong>en octets</strong>. Ce type de métadonnées ne devrait être disponible que pour les posts de type <strong>« attachment »</strong>, autrement dit que les médias. Cela se vérifie assez facilement avec la requête SQL suivante :</p>



<pre class="wp-block-code"><code>SELECT wp_posts.post_type, meta_key FROM wp_postmeta INNER JOIN wp_posts ON wp_posts.ID = wp_postmeta.post_id WHERE meta_key = '_wp_attachment_metadata' GROUP BY wp_posts.post_type;</code></pre>



<p class="wp-block-paragraph">Vous ne devriez alors voir qu&rsquo;un seul post_type qui est attachment.</p>



<p class="wp-block-paragraph">Prenons maintenant une ligne au hasard :</p>



<pre class="wp-block-code"><code>SELECT meta_key, meta_value FROM wp_postmeta WHERE meta_key = '_wp_attachment_metadata' ORDER BY RAND() LIMIT 0,1;</code></pre>



<p class="wp-block-paragraph">Si nous regardons son contenu, nous verrons que celui-ci contient entre autres :</p>



<ul class="wp-block-list">
<li>Les métadonnées EXIF de l&rsquo;image (modèle de caméra, paramètres de la prise &#8230;)</li>



<li>Les miniatures existantes et leurs tailles</li>
</ul>



<h2 class="wp-block-heading">Comment réduire la taille de _wp_attachment_metadata ?</h2>



<h3 class="wp-block-heading">Réduire la quantité d&rsquo;images sur le site</h3>



<p class="wp-block-paragraph">Cela ne vient pas forcément à l&rsquo;esprit, mais plus il y a d&rsquo;images, plus il y aura de métadonnées d&rsquo;images. L&rsquo;action le plus simple et de supprimer les médias inutilisés sur votre site web. Le <a href="https://wordpress.org/plugins/media-cleaner/" data-type="link" data-id="https://wordpress.org/plugins/media-cleaner/" target="_blank" rel="noopener">plugin Media Cleaner</a> est justement là pour effectuer cette tâche.</p>



<h3 class="wp-block-heading">Réduire la quantité de miniatures sur votre site</h3>



<p class="wp-block-paragraph">Étant donné que chaque format de miniature rajoute des données pour chaque image sur _wp_attachment_metadata, réduire la quantité de miniatures vous aidera également à réduire les données.</p>



<p class="wp-block-paragraph">Pour commencer, vous pouvez <a href="https://developer.wordpress.org/cli/commands/media/image-size/" target="_blank" rel="noopener">lister les formats de miniatures existantes</a> sur votre site grâce à WP-CLI (disponible en ligne de commande) :</p>



<pre class="wp-block-code"><code>wp media image-size</code></pre>



<p class="wp-block-paragraph">Commencez alors par identifier les formats et leur origine : thème ou plugin. En effet, vous allez devoir faire un peu de recherche pour savoir quel plugin ou quel thème a introduit ce format de miniature.</p>



<p class="wp-block-paragraph">Le plugin ou le thème aura à utiliser la <a href="https://developer.wordpress.org/reference/functions/add_image_size/" target="_blank" rel="noopener">fonction WordPress <strong>add_image_size()</strong></a> pour effectuer cette action, vous pourrez alors rechercher les fichiers PHP utilisant cette commande pour constater les plugins et thèmes impliqués. Vous pouvez donc utiliser la commande « grep » pour rechercher rapidement ces fichiers :</p>



<pre class="wp-block-code"><code>cd /home/monsite/public_html/wp-content
grep -r -H 'add_image_size'</code></pre>



<p class="wp-block-paragraph">(assurez-vous de remplacer « /home/monsite/public_html » par la racine de votre site web)</p>



<p class="wp-block-paragraph">Désactivez et supprimez ensuite le plugin et/ou le thème de votre site web pour supprimer ce format de miniature, et regénérez vos miniatures avec WP-CLI :</p>



<pre class="wp-block-code"><code>wp media regenerate --yes</code></pre>



<p class="wp-block-paragraph">IMPORTANT !!! Cette commande prendra plusieurs minutes, voire plusieurs heures pour s&rsquo;exécuter, et sera gourmand en ressources CPU.</p>



<h3 class="wp-block-heading">Supprimer les données EXIF de vos images</h3>



<p class="wp-block-paragraph">Vous pouvez aussi supprimer vos données EXIF de vos images pour réduire la taille de la métadonnée _wp_attachment_metadata.</p>



<p class="wp-block-paragraph">Malheureusement, je n&rsquo;ai aujourd&rsquo;hui retrouvé aucun outil pour appliquer cela sur les images déjà existantes sur votre site. Je ne pourrais que vous conseiller de supprimer ces informations en amont, avant d&rsquo;ajouter l&rsquo;image sur le site. Vous pouvez faire cela avec votre éditeur de photo (Photoshop, Paint.NET, &#8230;) ou avec ce genre d&rsquo;outil en ligne : <a href="https://www.verexif.com" target="_blank" rel="noopener">verexif.com</a>.</p>



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



<p class="wp-block-paragraph">Si vous avez un problème avec _wp_attachment_metadata, c&rsquo;est sûrement que votre site web contient beaucoup d&rsquo;images et/ou votre thème et vos plugins demandent à ce que WordPress génère beaucoup de miniatures.</p>



<p class="wp-block-paragraph">Un nettoyage de cette métadonnée allègera votre table wp_postmeta et améliorera vos performances, toutefois si vous n&rsquo;avez pas la possibilité de réduire cela et que cela vous pose un problème, il sera nécessaire d&rsquo;envisager un serveur MySQL (et donc probablement une formule d&rsquo;hébergement web) avec plus de ressources.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://manoa.ratefiarison.com/2023/09/29/nettoyer-wp-attachment-metadata/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Pourquoi vous ne devriez pas cacher l&#8217;accès administrateur sur votre site WordPress</title>
		<link>https://manoa.ratefiarison.com/2023/06/22/pourquoi-vous-ne-devriez-pas-cacher-lacces-administrateur-sur-votre-site-wordpress/</link>
					<comments>https://manoa.ratefiarison.com/2023/06/22/pourquoi-vous-ne-devriez-pas-cacher-lacces-administrateur-sur-votre-site-wordpress/#respond</comments>
		
		<dc:creator><![CDATA[Manoa Ratefiarison]]></dc:creator>
		<pubDate>Thu, 22 Jun 2023 19:49:37 +0000</pubDate>
				<category><![CDATA[Technologies web]]></category>
		<category><![CDATA[Administration système]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wp-login]]></category>
		<guid isPermaLink="false">https://manoa.ratefiarison.com/?p=298</guid>

					<description><![CDATA[Cacher l&#8217;accès administrateur sur un site WordPress, à savoir wp-admin et wp-login.php, me semble aujourd&#8217;hui une pratique assez répandue pour « sécuriser » un site WordPress. Malheureusement, je ne pense pas que ce soit une bonne pratique de sécurité. Voici pourquoi La sécurité par l&#8217;obscurité Cette pratique de sécurité consiste à déplacer l&#8217;URL effective pour se connecter ... <a title="Pourquoi vous ne devriez pas cacher l&#8217;accès administrateur sur votre site WordPress" class="read-more" href="https://manoa.ratefiarison.com/2023/06/22/pourquoi-vous-ne-devriez-pas-cacher-lacces-administrateur-sur-votre-site-wordpress/" aria-label="En savoir plus sur Pourquoi vous ne devriez pas cacher l&#8217;accès administrateur sur votre site WordPress">Lire la suite</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Cacher l&rsquo;accès administrateur sur un site WordPress, à savoir wp-admin et wp-login.php, me semble aujourd&rsquo;hui une pratique assez répandue pour « sécuriser » un site WordPress. Malheureusement, je ne pense pas que ce soit une bonne pratique de sécurité. Voici pourquoi</p>



<span id="more-298"></span>



<h2 class="wp-block-heading">La sécurité par l&rsquo;obscurité</h2>



<p class="wp-block-paragraph">Cette pratique de sécurité consiste à déplacer l&rsquo;URL effective pour se connecter à WordPress. Dans les dessous des plugins comme <a href="https://wordpress.org/plugins/wps-hide-login/" target="_blank" rel="noreferrer noopener">WPS Hide Login</a> se trouve des directives pour déporter l&rsquo;URL wp-login.php vers un autre URL, en passant par la réécriture d&rsquo;URL. Quant à l&rsquo;accès à l&rsquo;URL wp-admin, ce type de plugin remplace la redirection vers la page de connexion en une erreur 404 ou en une redirection vers la page d&rsquo;accueil.</p>



<p class="wp-block-paragraph">Certes, cette pratique peut rebuter pas mal de robots qui sont programmés à n&rsquo;utiliser que les URLs par défaut, mais ce n&rsquo;est pas pour autant que votre site web soit sécurisé. Déjà, il est assez rare que les hébergeurs limitent les erreurs 404 ni par adresse IP, ni par nom de domaine. Donc, votre site web n&rsquo;est probablement pas immunisé de robots qui tenteraient d&rsquo;accéder à l&rsquo;URL en testant différentes combinaisons possibles (une attaque par bruteforce).</p>



<h2 class="wp-block-heading">Les accès machines (API)</h2>



<p class="wp-block-paragraph">Mais le pire, c&rsquo;est que wp-login.php n&rsquo;est pas le seul moyen de se connecter à WordPress. Aujourd&rsquo;hui, nous avons le REST API et le vieux XML-RPC qui permet également de se connecter au site. Vous ne pouvez donc tout simplement pas vous reposer sur vos lauriers après avoir déplacé wp-login.php. Et, vous ne pouvez malheureusement pas déplacer le REST API. Déjà, déplacer wp-login.php présente des risques d&rsquo;incompatibilités avec certains plugins (notamment ceux qui pourraient proposer des mécanismes de connexions comme les plugins d&rsquo;espace membre, de forum ou d&rsquo;espace client) ; désactiver le XML-RPC se fait, mais quelques vieux plugins risquent d&rsquo;en avoir toujours besoin ; et REST API, malheureusement, vous ne pouvez pas le déplacer sans casser WordPress.</p>



<p class="wp-block-paragraph">Vous pouvez remarquer rapidement en ayant un plugin qui comptabilise le nombre de connexions échoué que même si vous déplacez wp-login.php, vous continuez à avoir des robots qui tentent de se connecter.</p>



<h2 class="wp-block-heading">Alors, qu&rsquo;est-ce qu&rsquo;il faut faire pour sécuriser WordPress ?</h2>



<p class="wp-block-paragraph">Au lieu de dépenser vos efforts pour cacher les pages de connexion, vous devriez miser plus sur la sécurisation de la page de connexion lui-même.</p>



<h3 class="wp-block-heading">Limiter les adresses IP</h3>



<p class="wp-block-paragraph">Autant que possible, limitez l&rsquo;accès aux pages de connexion et au REST API / XMLRPC par une liste d&rsquo;adresse IP / géolocalisation. Si vous vivez en France, par exemple, vous pouvez restreindre l&rsquo;accès uniquement à ce pays.</p>



<p class="wp-block-paragraph">Il y a plusieurs techniques possibles, que ce soit avec un plugin, avec un .htaccess, dans les configurations serveurs voire même au niveau du proxy CDN (comme Cloudflare). A titre personnel, je recommande toujours de régler ce problème le plus tôt possible : donc au niveau du CDN, ou au niveau de la configuration serveur.</p>



<h3 class="wp-block-heading">Limiter les accès robots</h3>



<p class="wp-block-paragraph">Si vous êtes dans l&rsquo;obligation d&rsquo;exposer votre page de connexion (site ayant un accès membre, par exemple), assurez-vous de bloquer les robots sur ces pages.</p>



<p class="wp-block-paragraph">La méthode la plus classique est d&rsquo;y activer un système captcha. Malheureusement, le captcha peut être relou pour l&rsquo;expérience utilisateur et en plus, il est aujourd&rsquo;hui facilement outrepassé par les robots grâce à de l&rsquo;IA et aux fermes de clics.</p>



<p class="wp-block-paragraph">La solution que je recommande est de se baser sur une solution de réputation. Beaucoup de services proposent aujourd&rsquo;hui (gratuit ou payant) une certaine liste d&rsquo;adresse IP qui ont déjà attaqué d&rsquo;autres sites WordPress. Il suffira d&rsquo;ajouter cette liste dans vos listes de blocages.</p>



<p class="wp-block-paragraph">C&rsquo;est d&rsquo;ailleurs pour cette raison que les solutions de pare-feu en proxy comme Cloudflare et Sucuri sont puissants. En effet, ils peuvent détecter, sur une très large échelle, le comportement d&rsquo;une adresse IP sur des millions de sites et repérer ainsi les robots d&rsquo;attaques pour pouvoir ensuite les bloquer à échelle globale.</p>



<p class="wp-block-paragraph">Vous pouvez aussi bloquer les adresses IP non résidentielles (adresses IP qui sont dans des datacenters), qui représente une masse non négligeable des attaquants. Malheureusement, je n&rsquo;ai trouvé à ce jour aucune liste assez fiable.</p>



<h3 class="wp-block-heading">Limitez les tentatives infructueuses</h3>



<p class="wp-block-paragraph">On ne dirait pas comme ça, mais WordPress n&rsquo;en est pas immunisé, de nature. Il faut implémenter vous-même une solution pour limiter les tentatives infructueuses. Personnellement, j&rsquo;ai implémenté cela par le biais de scripts LUA sur mon serveur NGINX, mais c&rsquo;est une solution qui peut aussi être implémenté avec un simple plugin.</p>



<p class="wp-block-paragraph">Certains hébergeurs proposent également cette solution sous forme de règles ModSecurity ou de limitation de trafic L7 sur son serveur web, ou encore les CDN proxy orienté sécurité comme Sucuri.</p>



<h3 class="wp-block-heading">Utiliser un mot de passe fort et l&rsquo;authentification à deux facteurs</h3>



<p class="wp-block-paragraph">Évidemment, si votre ensemble nom d&rsquo;utilisateur / mot de passe est facilement identifiable, alors c&rsquo;est nécessaire d&rsquo;améliorer cela en mettant un mot de passe fort (long et complexe) et surtout de mettre l&rsquo;authentification à deux facteurs afin que, même si les robots passent la page de connexion, l&rsquo;authentification à deux facteurs vont les garder derrière une autre porte.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://manoa.ratefiarison.com/2023/06/22/pourquoi-vous-ne-devriez-pas-cacher-lacces-administrateur-sur-votre-site-wordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Protéger WordPress du bruteforce sans plugin (avec NGINX et fail2ban)</title>
		<link>https://manoa.ratefiarison.com/2022/05/07/protection-bruteforce-wordpress-nginx-fail2ban/</link>
					<comments>https://manoa.ratefiarison.com/2022/05/07/protection-bruteforce-wordpress-nginx-fail2ban/#respond</comments>
		
		<dc:creator><![CDATA[Manoa Ratefiarison]]></dc:creator>
		<pubDate>Fri, 06 May 2022 22:11:02 +0000</pubDate>
				<category><![CDATA[Administration système]]></category>
		<category><![CDATA[bruteforce]]></category>
		<category><![CDATA[fail2ban]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[serveur web]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://manoa.ratefiarison.com/?p=133</guid>

					<description><![CDATA[Dans cette documentation, je vais vous montrer comment protéger WordPress du brute force sans utiliser aucun plugin WordPress. Qu&#8217;est-ce que le brute force ? Rien de tel qu&#8217;une article Wikipédia pour nous l&#8217;expliquer : L&#8217;attaque par force brute est une méthode utilisée en cryptanalyse pour trouver un mot de passe ou une clé. Il s&#8217;agit ... <a title="Protéger WordPress du bruteforce sans plugin (avec NGINX et fail2ban)" class="read-more" href="https://manoa.ratefiarison.com/2022/05/07/protection-bruteforce-wordpress-nginx-fail2ban/" aria-label="En savoir plus sur Protéger WordPress du bruteforce sans plugin (avec NGINX et fail2ban)">Lire la suite</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Dans cette documentation, je vais vous montrer comment protéger WordPress du brute force sans utiliser aucun plugin WordPress.</p>



<span id="more-133"></span>



<h2 class="wp-block-heading">Qu&rsquo;est-ce que le brute force ?</h2>



<p class="wp-block-paragraph">Rien de tel qu&rsquo;une article Wikipédia pour nous l&rsquo;expliquer :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>L&rsquo;attaque par force brute est une méthode utilisée en cryptanalyse pour trouver un mot de passe ou une clé. Il s&rsquo;agit de tester, une à une, toutes les combinaisons possibles.</p><cite><a href="https://fr.wikipedia.org/wiki/Attaque_par_force_brute" target="_blank" rel="noreferrer noopener">Attaque par force brute &#8211; Wikipédia</a></cite></blockquote>



<p class="wp-block-paragraph">C&rsquo;est assez simpliste comme attaque, il suffit de tester un à un la liste de mot de passe compatible. Bien évidemment, <a href="https://github.com/22XploiterCrew-Team/WpCrack" target="_blank" rel="noreferrer noopener">des logiciels</a> sont en place pour que l&rsquo;opération soit automatisée.</p>



<p class="wp-block-paragraph">Et aujourd&rsquo;hui, elle est, la plupart du temps, opéré depuis des serveurs piratés/vérolés (ce qui permet de faire beaucoup de requêtes en parallèle et cibler ainsi plus de sites et/ou tester beaucoup plus de mot de passe par seconde) ou depuis des PC ou autres appareils du quotidiens qui sont piratés ou également vérolés.</p>



<p class="wp-block-paragraph">La deuxième technique est fortement répandue du fait qu&rsquo;aujourd&rsquo;hui, la plupart des pages de connexion ne sont pas accessibles depuis des adresses IPs de datacenter : pour se préserver de ce type d&rsquo;attaque, certains administrateurs systèmes bloquent systématiquement l&rsquo;accès aux pages de connexion dès que l&rsquo;adresse IP est détectée comme provenant d&rsquo;un datacenter.</p>



<p class="wp-block-paragraph">Et pour finir le tour de ce type d&rsquo;attaque, sachez qu&rsquo;aujourd&rsquo;hui les hackers ne testent pas toutes les combinaisons, mais « juste » les combinaisons les plus probables : les mots de passes les plus utilisés, les mots de passes possible en exploitant des informations depuis le site lui-même (url du site, nom du compte administrateur, &#8230;) ou depuis vos données personnelles visible en ligne (votre date de naissance, retrouvé depuis un réseau social, par exemple).</p>



<h2 class="wp-block-heading">Ne pas se protéger, la meilleure solution</h2>



<p class="wp-block-paragraph">C&rsquo;est interloquant comme titre, non ? Oui, ne pas se protéger est la meilleure solution. Ceci consiste tout simplement à fermer la porte pour tout le monde et sans exception. De cette façon, vous ne dépensez pas inutilement de ressources pour identifier si tel ou tel requête fait partie d&rsquo;une attaque ou non.</p>



<p class="wp-block-paragraph">Ainsi, restreindre l&rsquo;accès à <code>wp-login.php</code> et <code>wp-admin</code> à seulement votre adresse IP reste la meilleure solution. Mais ce n&rsquo;est malheureusement toujours pas possible. C&rsquo;est notamment le cas quand vous avez des adresses IPs dynamiques, quand vous êtes plusieurs à travailler sur le site, &#8230; Bref, faire disparaître la porte peut causer des tas d&rsquo;inconforts du côté des administrateurs du site.</p>



<h2 class="wp-block-heading">Pourquoi ne pas utiliser un plugin ?</h2>



<p class="wp-block-paragraph">Là, vite fait, j&rsquo;ai trois arguments à vous proposer :</p>



<ul class="wp-block-list"><li>Moins de plugin = moins d&#8217;emmerdes sur WordPress. Je ne sais pas si vous avez déjà fait le test mais l&rsquo;ajout d&rsquo;un plugin (n&rsquo;importe lequel) augmente le temps de réponse de WordPress et diminue donc sa vitesse de chargement. Et installer un plugin WordPress c&rsquo;est aussi un peu plus de risque de bugs et d&rsquo;instabilité, même si franchement les développeurs de plugins de sécurité WordPress font actuellement un travail très propre. <strong>J&rsquo;estime que le jeu n&rsquo;en vaut pas la chandelle.</strong></li><li>Faire des actions sur WordPress n&rsquo;est pas toujours possible. Notamment si on est dans la position d&rsquo;<strong>hébergeur web</strong>. Modifier le site d&rsquo;un client serait très mal vu, même si c&rsquo;est pour mieux lui protéger, car vous risquez fortement d&rsquo;induire des problèmes dans le site lui-même (incompatibilité avec votre plugin de sécurité, modifications particulières faites sur WordPress par le développeur, &#8230;).</li><li>Un plugin WordPress n&rsquo;a pas les outils nécessaires pour agir en amont. Le plugin WordPress ne peut rien exécuter tant que WordPress n&rsquo;est pas démarré. Donc, à chaque requête, WordPress démarre d&rsquo;abord, avant qu&rsquo;un plugin de sécurité ne puisse finalement annuler la requête d&rsquo;un attaquant. Agir à un niveau plus haut permet d&#8217;empêcher WordPress de gaspiller un temps de chargement et des ressources pour les attaquants.</li><li>Bonus ou argument numéro 3 bis (à vous de voir), je vois beaucoup de plugin de sécurité de faire l&rsquo;erreur de stocker les adresses IPs bloqués dans MySQL. Le souci se manifeste quand vous commencez à avoir <strong>40 000 ou 70 000 IPs bloqués</strong>. C&rsquo;est un nombre tout à fait raisonnable vu le fléau d&rsquo;attaque sur internet, mais c&rsquo;est très « amateur » de vouloir rechercher des données sur 70 000 lignes sur MySQL <strong>à chaque ouverture de page</strong>. Et encore pire quand on sait que l&rsquo;adresse IP est stocké dans un champ non indexé ou un champ VARCHAR ou TEXT. Et loguer tout cela, en prime, c&rsquo;est l&rsquo;enfer. Or, avec des outils comme fail2ban, il y a des moyens de loguer cela en asynchrone.</li></ul>



<p class="wp-block-paragraph">Et de l&rsquo;autre côté, j&rsquo;ai quelques 3 avantages à mettre en avant :</p>



<ul class="wp-block-list"><li>La mise en place peut se faire sans accès au tableau de bord du site. Ceci permet notamment de protéger en une opération tous les sites d&rsquo;un même serveur.</li><li>Les logs ne sont pas dans MySQL. C&rsquo;est un avantage non négligeable pour garder la base de données WordPress léger et rapide à accéder. wp_postmeta chauffe déjà assez. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f605.png" alt="😅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li><li>Le blocage se fait au niveau du service web voire même au niveau du kernel (iptables) ce qui permet d&rsquo;économiser les ressources.</li></ul>



<h2 class="wp-block-heading">Mise en place de la protection bruteforce sur NGINX</h2>



<p class="wp-block-paragraph">Dans un premier temps, j&rsquo;ai ajouté une zone de limite de requête dans NGINX :</p>



<pre class="wp-block-code"><code>echo "limit_req_zone $server_name$binary_remote_addr zone=wpratelimit:10m rate=10r/m;" > /etc/nginx/conf.d/wp-rate-limit.conf</code></pre>



<p class="wp-block-paragraph">Vous pouvez notamment constater :</p>



<ul class="wp-block-list"><li>limit_req_zone : la directive NGINX utilisée</li><li>$server_name$binary_remote_addr : la clé d&rsquo;identification du client. Dans mon cas, j&rsquo;ai mis à la fois $server_name (nom du site) et $binary_remote_addr (adresse IP du client en binaire) pour pouvoir identifier les clients différemment par site. Ceci me permet de ne pas bloquer un client parce qu&rsquo;il accède à 10 sites WordPress sur le même serveur.</li><li>zone=wpratelimit:10m : création de la zone « wpratelimit » et qui a 10 Mo de taille</li><li>rate=10r/m : la limite est de 10 requêtes par minute.</li></ul>



<p class="wp-block-paragraph">Ensuite, il faut appliquer cette zone de limite aux fichiers wp-login.php et xmlrpc.php. Pour ma part, j&rsquo;ai imbriqué les directives location étant donné que j&rsquo;utilise fastcgi directement pour servir les fichiers PHP :</p>



<pre class="wp-block-code"><code>location ~ \.php$ {
    &#91;...]

    location ~* (wp-login|xmlrpc)\.php$ {
      limit_req zone=wpratelimit;
      add_header RateLimit "yes";
    }
  }</code></pre>



<p class="wp-block-paragraph">Si vous utilisez NGINX comme reverse proxy, il faudra implémenter différemment, mais le principe reste le même. Il faudra également avoir un log d&rsquo;erreur que fail2ban analysera régulièrement :</p>



<pre class="wp-block-code"><code>error_log /home/monsite/logs/error.log</code></pre>



<p class="wp-block-paragraph">N&rsquo;oubliez pas de recharger NGINX après les modifications :</p>



<pre class="wp-block-code"><code>systemctl reload nginx</code></pre>



<h2 class="wp-block-heading">Bloquer les attaques répétés avec fail2ban</h2>



<p class="wp-block-paragraph">Une fois les attaques par bruteforce bloqués sur NGINX, il faudra bloquer les attaques répétés depuis iptables pour réduire le risque de sécurité (un attaquant pourrait potentiellement essayer autre chose que WordPress) et les ressources consommés.</p>



<p class="wp-block-paragraph">Pour cela, il faut créer un nouveau filtre fail2ban dans /etc/fail2ban/filter.d/wp-rate-limit.conf :</p>



<pre class="wp-block-code"><code>&#91;Definition]
ngx_limit_req_zones = wpratelimit
failregex = ^\s*\&#91;&#91;a-z]+\] \d+#\d+: \*\d+ limiting requests, excess: &#91;\d\.]+ by zone "(?:%(ngx_limit_req_zones)s)", client: &lt;HOST>,
ignoreregex =
datepattern = {^LN-BEG}</code></pre>



<p class="wp-block-paragraph">Notez que c&rsquo;est basé sur le fichier etc/fail2ban/filter.d/nginx-limit-req.conf disponible sur fail2ban par défaut.</p>



<p class="wp-block-paragraph">Ensuite, dans /etc/fail2ban/jail.local, j&rsquo;ajoute un nouveau prison :</p>



<pre class="wp-block-code"><code>&#91;wp-rate-limit]
enabled = true
bantime = 86400
maxretry = 3
logpath = /home/*/logs/error.log tail</code></pre>



<p class="wp-block-paragraph">Comme vous voyez, je bloque pour 86 400 secondes (24h si vous voulez) au bout de 3 blocages détectés sur NGINX. Et j&rsquo;analyse les fichiers d&rsquo;erreurs sur /home/*/logs/error.log. Le <strong>tail</strong> à la fin de logpath me permet de ne pas recharger les fichiers en entier au démarrage de fail2ban, ce qui diminue fortement la charge I/O engendrée (ça se voit beaucoup sur un serveur à 1000 sites).</p>



<p class="wp-block-paragraph">N&rsquo;oubliez pas de redémarrer fail2ban par la suite :</p>



<pre class="wp-block-code"><code>systemctl restart fail2ban</code></pre>



<h2 class="wp-block-heading">Place aux tests</h2>



<p class="wp-block-paragraph">Pour tester, j&rsquo;ai utilisé Apache Benchmark (ab) pour effectuer « beaucoup » de requêtes sur wp-login.php :</p>



<pre class="wp-block-code"><code>ab -n 20 https://www.monsite.com/</code></pre>



<p class="wp-block-paragraph">Au bout de 10 requêtes, l&rsquo;IP est bloquée. On peut constater cela depuis le fail2ban-client :</p>



<pre class="wp-block-code"><code>fail2ban-client status wp-rate-limit</code></pre>



<p class="wp-block-paragraph">Et les blocages faites par NGINX sont logués :</p>



<pre class="wp-block-code"><code>&#91;root@serveur ~] tail /home/monsite/logs/error.log
2022/05/06 20:49:03 &#91;error] 14560#14560: *312 limiting requests, excess: 0.991 by zone "wpratelimit", client: <strong>1.2.3.4</strong>, server: www.monsite.com, request: "GET /wp-login.php HTTP/1.0", host: "www.monsite.com"
2022/05/06 20:49:03 &#91;error] 14560#14560: *312 limiting requests, excess: 0.991 by zone "wpratelimit", client: <strong>1.2.3.4</strong>, server: www.monsite.com, request: "GET /wp-login.php HTTP/1.0", host: "www.monsite.com"
2022/05/06 20:49:03 &#91;error] 14560#14560: *312 limiting requests, excess: 0.991 by zone "wpratelimit", client: <strong>1.2.3.4</strong>, server: www.monsite.com, request: "GET /wp-login.php HTTP/1.0", host: "www.monsite.com"
2022/05/06 20:49:03 &#91;error] 14560#14560: *312 limiting requests, excess: 0.991 by zone "wpratelimit", client: <strong>1.2.3.4</strong>, server: www.monsite.com, request: "GET /wp-login.php HTTP/1.0", host: "www.monsite.com"
2022/05/06 20:49:03 &#91;error] 14560#14560: *312 limiting requests, excess: 0.991 by zone "wpratelimit", client: <strong>1.2.3.4</strong>, server: www.monsite.com, request: "GET /wp-login.php HTTP/1.0", host: "www.monsite.com"
2022/05/06 20:49:03 &#91;error] 14560#14560: *312 limiting requests, excess: 0.991 by zone "wpratelimit", client: <strong>1.2.3.4</strong>, server: www.monsite.com, request: "GET /wp-login.php HTTP/1.0", host: "www.monsite.com"
2022/05/06 20:49:03 &#91;error] 14560#14560: *312 limiting requests, excess: 0.991 by zone "wpratelimit", client: <strong>1.2.3.4</strong>, server: www.monsite.com, request: "GET /wp-login.php HTTP/1.0", host: "www.monsite.com"
2022/05/06 20:49:03 &#91;error] 14560#14560: *312 limiting requests, excess: 0.991 by zone "wpratelimit", client: <strong>1.2.3.4</strong>, server: www.monsite.com, request: "GET /wp-login.php HTTP/1.0", host: "www.monsite.com"
2022/05/06 20:49:03 &#91;error] 14560#14560: *312 limiting requests, excess: 0.991 by zone "wpratelimit", client: <strong>1.2.3.4</strong>, server: www.monsite.com, request: "GET /wp-login.php HTTP/1.0", host: "www.monsite.com"
2022/05/06 20:49:03 &#91;error] 14560#14560: *312 limiting requests, excess: 0.991 by zone "wpratelimit", client: <strong>1.2.3.4</strong>, server: www.monsite.com, request: "GET /wp-login.php HTTP/1.0", host: "www.monsite.com"
2022/05/06 20:49:03 &#91;error] 14560#14560: *312 limiting requests, excess: 0.991 by zone "wpratelimit", client: <strong>1.2.3.4</strong>, server: www.monsite.com, request: "GET /wp-login.php HTTP/1.0", host: "www.monsite.com"</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://manoa.ratefiarison.com/2022/05/07/protection-bruteforce-wordpress-nginx-fail2ban/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Sécuriser SSH sous Debian 11</title>
		<link>https://manoa.ratefiarison.com/2022/04/21/securiser-ssh-debian-11/</link>
					<comments>https://manoa.ratefiarison.com/2022/04/21/securiser-ssh-debian-11/#respond</comments>
		
		<dc:creator><![CDATA[Manoa Ratefiarison]]></dc:creator>
		<pubDate>Thu, 21 Apr 2022 21:19:12 +0000</pubDate>
				<category><![CDATA[Administration système]]></category>
		<category><![CDATA[debian 11]]></category>
		<category><![CDATA[fail2ban]]></category>
		<category><![CDATA[ipset]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[pare-feu]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[ssh]]></category>
		<guid isPermaLink="false">https://manoa.ratefiarison.com/?p=126</guid>

					<description><![CDATA[L&#8217;accès SSH est l&#8217;accès le plus crucial pour un serveur. Dans ce tutoriel, nous allons appliquer quelques bonnes pratiques pour sécuriser au maximum l&#8217;accès SSH. Désactiver l&#8217;accès SSH avec mot de passe Un mot de passe ne signifie quasiment plus rien en 2022. Si auparavant, celui-ci permettait de sécuriser l&#8217;accès à un service, aujourd&#8217;hui, nous ... <a title="Sécuriser SSH sous Debian 11" class="read-more" href="https://manoa.ratefiarison.com/2022/04/21/securiser-ssh-debian-11/" aria-label="En savoir plus sur Sécuriser SSH sous Debian 11">Lire la suite</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">L&rsquo;accès SSH est l&rsquo;accès le plus crucial pour un serveur. Dans ce tutoriel, nous allons appliquer quelques bonnes pratiques pour sécuriser au maximum l&rsquo;accès SSH.</p>



<span id="more-126"></span>



<h2 class="wp-block-heading">Désactiver l&rsquo;accès SSH avec mot de passe</h2>



<p class="wp-block-paragraph">Un mot de passe ne signifie quasiment plus rien en 2022. Si auparavant, celui-ci permettait de sécuriser l&rsquo;accès à un service, aujourd&rsquo;hui, nous avons atteint un capacité de calcul et un capacité de trafic réseau suffisamment énorme pour envisager d&rsquo;essayer toutes les caractères possibles.</p>



<p class="wp-block-paragraph">Cette technique s&rsquo;appelle le <strong>bruteforce</strong> et consiste tout simplement à demander à un ou plusieurs PC, Mac, serveurs Linux, votre frigo connecté ou votre smartphone, d&rsquo;essayer un à un une liste de mot de passe sur un service. Grâce à internet et une petite armée d&rsquo;appareils infectés, les hackers arrivent à essayer des milliers si ce n&rsquo;est des millions de combinaisons de mots de passe en quelques minutes. Il est aussi courant de voir des pirates louer des serveurs ou pirater des sites justement pour cet usage.</p>



<p class="wp-block-paragraph">Le meilleur moyen de leur couper l&rsquo;herbe sous le pied et tout simplement de ne pas disposer de mot de passe. S&rsquo;il n&rsquo;y a pas de mot de passe à pirater, alors leur bruteforce ne vont pas du tout aboutir.</p>



<p class="wp-block-paragraph">En remplacement du mot de passe, nous pouvons utiliser la cryptographie à notre avantage et utiliser donc une paire de clé privée/publique pour s&rsquo;authentifier sur notre serveur SSH.</p>



<h3 class="wp-block-heading">Création d&rsquo;une paire de clé SSH</h3>



<p class="wp-block-paragraph">Vous pouvez créer une paire de clé SSH depuis votre PC ou depuis le serveur lui-même. D&rsquo;ailleurs vous pouvez le créer sur n&rsquo;importe quel appareil. Sous Windows, l&rsquo;<a href="https://akril.net/cle-ssh-sous-windows-avec-putty/" target="_blank" rel="noreferrer noopener">outil PuTTY</a> vous permet de le faire. Sous Linux et Mac, vous pouvez utiliser la commande suivante :</p>



<pre class="wp-block-code"><code>ssh-keygen -t rsa</code></pre>



<p class="wp-block-paragraph">L&rsquo;option <strong>-t rsa</strong> permet d&rsquo;indiquer l&rsquo;algorithme à utiliser. Une fois vos clés créés, vous devez être en possession d&rsquo;une clé privée et d&rsquo;une clé publique.</p>



<h3 class="wp-block-heading">Autoriser la clé SSH à se connecter à un utilisateur sur le serveur SSH</h3>



<p class="wp-block-paragraph">Ensuite, il s&rsquo;agit d&rsquo;ajouter votre clé SSH à un utilisateur du serveur. Pour cela, ouvrez le fichier de clé publique qui devrait contenir la clé publique de la forme <strong>ssh-rsa XXXXXXXXXXXX(&#8230;) user@hostname</strong>. Copiez tout cela et ajoutez-le au fichier <strong>/root/.ssh/authorized_keys </strong>du serveur (créez le fichier et le dossier si nécessaire).</p>



<p class="wp-block-paragraph">Une fois ajouté au fichier, essayez de vous connecter au SSH. Le serveur ne devrait plus vous demander de mot de passe lors de la connexion.</p>



<h3 class="wp-block-heading">Désactiver la connexion par mot de passe</h3>



<p class="wp-block-paragraph">Enfin, nous pouvons désactiver la connexion par mot de passe pour l&rsquo;utilisateur root. Dans le fichier de configuration de votre serveur SSH (/etc/ssh/sshd_config), remplacez :</p>



<pre class="wp-block-code"><code>PermitRootLogin yes</code></pre>



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



<pre class="wp-block-code"><code>PermitRootLogin without-password</code></pre>



<p class="wp-block-paragraph">et redémarrez le service SSH :</p>



<pre class="wp-block-code"><code>systemctl restart sshd</code></pre>



<h2 class="wp-block-heading">Bannir les tentatives de connexion avec mauvais mot de passe avec fail2ban</h2>



<p class="wp-block-paragraph">Une autre chose qui peut être faite est de bannir une adresse IP s&rsquo;il a obtenu trop d&rsquo;échec de connexion pour mauvais mot de passe. L&rsquo;outil fail2ban est justement destiné à cet usage. Pour l&rsquo;installer :</p>



<pre class="wp-block-code"><code>apt-get install -y fail2ban</code></pre>



<p class="wp-block-paragraph">Ensuite, pour la configuration, il nous faudra créer le fichier <strong>/etc/fail2ban/jail.local</strong> avec comme contenu :</p>



<pre class="wp-block-code"><code>&#91;DEFAULT]
bantime = 3600

&#91;sshd]
maxretry = 3
action = iptables-multiport</code></pre>



<p class="wp-block-paragraph">Dans la section <strong>DEFAULT</strong>, je définis le temps de blocage sur 3600 secondes (1 heure). Ceci s&rsquo;appliquera alors à tous les services surveillé par fail2ban. Rien ne vous empêche de spécifier un <strong>bantime</strong> différent par service en utilisant la même directive dans les sections des services.</p>



<p class="wp-block-paragraph">La section <strong>sshd</strong> s&rsquo;applique du coup pour le service SSH uniquement. J&rsquo;ai mis <strong>maxretry</strong> sur <strong>3</strong> pour limiter la connexion à <strong>3</strong> tentatives. L&rsquo;action <strong>iptables-multiport</strong> est une action prédéfinie dans <strong>fail2ban</strong> qui permet de bloquer l&rsquo;adresse IP détectée sur tous les ports du serveurs et ce en utilisant IPTables.</p>



<p class="wp-block-paragraph">Maintenant, il s&rsquo;agit de démarrer fail2ban :</p>



<pre class="wp-block-code"><code>systemctl restart fail2ban</code></pre>



<p class="wp-block-paragraph">N&rsquo;oublions pas de l&rsquo;activer au démarrage :</p>



<pre class="wp-block-code"><code>systemctl enable fail2ban</code></pre>



<p class="wp-block-paragraph">Vous pouvez ensuite visualiser l&rsquo;état global de fail2ban avec la commande suivante :</p>



<pre class="wp-block-code"><code>fail2ban-client status</code></pre>



<p class="wp-block-paragraph">Et vous pouvez voir l&rsquo;état du monitoring du SSH avec la commande suivante :</p>



<pre class="wp-block-code"><code>fail2ban-client status sshd</code></pre>



<p class="wp-block-paragraph">Je ne serais pas du tout surpris que vous aillez déjà quelques adresses IP bloqués. Vive internet.</p>



<h2 class="wp-block-heading">Limiter l&rsquo;accès SSH à quelques adresses IP de confiance</h2>



<p class="wp-block-paragraph">C&rsquo;est la solution que je préconise au maximum. Si un voleur ne peut pas toucher votre porte, alors il ne pourra pas faire sauter votre serrure. Malheureusement, je suis dans un cas où mon adresse IP n&rsquo;est pas fixe, et par conséquent, je peux risquer de me bloquer moi-même si je mets une adresse IP aujourd&rsquo;hui et que demain je ne peux plus m&rsquo;y connecter en utilisant cette même adresse IP.</p>



<p class="wp-block-paragraph">Ainsi, j&rsquo;utilise l&rsquo;approche suivante. J&rsquo;ai listé tous les adresses IPs que mes fournisseurs d&rsquo;accès Internet pourraient me fournir. Ceci se liste facilement grâce aux informations liés au ASN et aux routes BGP ainsi associés. Pour faire simple, un fournisseur d&rsquo;accès Internet dispose généralement sa propre numéro AS (le ASN du coup) et chaque adresse IP est associé à un ASN. Une fois l&rsquo;ASN de votre fournisseur identifié sur peeringdb.com, vous pouvez <a href="https://hackertarget.com/as-ip-lookup/" target="_blank" rel="noreferrer noopener">rechercher les blocs d&rsquo;IPs associés sur hackertarget</a>.</p>



<p class="wp-block-paragraph">J&rsquo;ajoute dans la liste également quelques adresses IPs de confiance, notamment l&rsquo;adresse IP de quelques un de mes autres serveurs, au cas où je suis vraiment bloqué et que je dois utiliser un autre de mes serveurs pour se frayer un chemin dans ce serveur en particulier. C&rsquo;est toujours mieux que se connecter sur une console KVM over IP.</p>



<p class="wp-block-paragraph">C&rsquo;est une sacré liste, mais pas aussi grande qu&rsquo;Internet tout entier. Ca coupe déjà l&rsquo;herbe sous le pied de pas mal de machines infectés et de hackers malintentionnés. C&rsquo;est mieux que rien.</p>



<p class="wp-block-paragraph">Maintenant qu&rsquo;on a la liste à autoriser, configurons le pare-feu. Pour ma part, j&rsquo;utilise IPSet avec IPTables qui me permet de lister un grand nombre de plage IP sans perdre trop de performances. Commençons par créer le set d&rsquo;IP autorisé à se connecter en SSH :</p>



<pre class="wp-block-code"><code>ipset -N admin hash:net</code></pre>



<p class="wp-block-paragraph">Ensuite, ajoutons-y des adresses IP :</p>



<pre class="wp-block-code"><code>ipset -A admin <strong>1.2.3.4</strong></code></pre>



<p class="wp-block-paragraph">Evidement, <strong>1.2.3.4</strong> a vocation à être remplacé par une adresse IP ou un CIDR. Enfin, autorisons ce set d&rsquo;IP sur le port 22 :</p>



<pre class="wp-block-code"><code>iptables -A INPUT -p tcp --dport 22 -m set --match-set admin src -j ACCEPT</code></pre>



<p class="wp-block-paragraph">Et enregistrons les modifications :</p>



<pre class="wp-block-code"><code>ipset save > /etc/ipset.conf
iptables-save > /etc/iptables/rules.v4</code></pre>



<p class="wp-block-paragraph">Si vous n&rsquo;avez pas iptables-save, alors il faut installer iptables-persistent :</p>



<pre class="wp-block-code"><code>apt-get install iptables-persistent</code></pre>



<p class="wp-block-paragraph">Et voilà, votre service SSH est désormais limité aux adresses IPs que vous avez fournis.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://manoa.ratefiarison.com/2022/04/21/securiser-ssh-debian-11/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Comment installer PHP 5.6 sur Debian ?</title>
		<link>https://manoa.ratefiarison.com/2022/04/16/installer-php-5-6-debian/</link>
					<comments>https://manoa.ratefiarison.com/2022/04/16/installer-php-5-6-debian/#respond</comments>
		
		<dc:creator><![CDATA[Manoa Ratefiarison]]></dc:creator>
		<pubDate>Sat, 16 Apr 2022 20:21:00 +0000</pubDate>
				<category><![CDATA[Administration système]]></category>
		<category><![CDATA[debian 11]]></category>
		<category><![CDATA[ispconfig]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php 5.6]]></category>
		<guid isPermaLink="false">https://manoa.ratefiarison.com/?p=123</guid>

					<description><![CDATA[Sur ce tutoriel, je vais vous montrer comment installer PHP 5.6 sur Debian en utilisant le dépôt fourni par sury.org. Installation du dépôt Sury.org L&#8217;ajout du dépôt Sury.org requiert quelques dépendances : Ensuite, il faut importer la clé GPG du dépôt : Enfin, nous pouvons ajouter le dépôt dans les configurations de apt : Installation ... <a title="Comment installer PHP 5.6 sur Debian ?" class="read-more" href="https://manoa.ratefiarison.com/2022/04/16/installer-php-5-6-debian/" aria-label="En savoir plus sur Comment installer PHP 5.6 sur Debian ?">Lire la suite</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Sur ce tutoriel, je vais vous montrer comment installer PHP 5.6 sur Debian en utilisant le dépôt fourni par <strong>sury.org</strong>.</p>



<span id="more-123"></span>



<h2 class="wp-block-heading">Installation du dépôt Sury.org</h2>



<p class="wp-block-paragraph">L&rsquo;ajout du dépôt Sury.org requiert quelques dépendances :</p>



<pre class="wp-block-code"><code>apt-get -y install apt-transport-https lsb-release ca-certificates</code></pre>



<p class="wp-block-paragraph">Ensuite, il faut importer la clé GPG du dépôt :</p>



<pre class="wp-block-code"><code>wget -q -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg</code></pre>



<p class="wp-block-paragraph">Enfin, nous pouvons ajouter le dépôt dans les configurations de apt :</p>



<pre class="wp-block-code"><code>echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list</code></pre>



<h2 class="wp-block-heading">Installation de PHP 5.6 depuis les dépôts Sury.org</h2>



<p class="wp-block-paragraph">Commençons par rafraîchir la liste des paquets dans apt, suite à l&rsquo;ajout du dépôt :</p>



<pre class="wp-block-code"><code>apt-get update</code></pre>



<p class="wp-block-paragraph">Ensuite, entamons le vif du sujet :</p>



<pre class="wp-block-preformatted">apt-get -y install php5.6 php5.6-common php5.6-gd php5.6-mysql php5.6-imap php5.6-cli php5.6-cgi php-pear php5.6-curl php5.6-intl php5.6-pspell php5.6-sqlite3 php5.6-tidy php5.6-xmlrpc php5.6-xsl php-memcache php-imagick php-gettext php5.6-zip php5.6-mbstring php5.6-soap php5.6-memcached php5.6-redis php5.6-fpm</pre>



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



<p class="wp-block-paragraph">Si vous souhaitez ensuite modifier la version PHP par défaut du CLI, utilisez la commande suivante :</p>



<pre class="wp-block-code"><code>update-alternatives --config php</code></pre>



<p class="wp-block-paragraph">Vous pouvez faire la même chose pour PHP-CGI :</p>



<pre class="wp-block-code"><code>update-alternatives --config php-cgi</code></pre>



<p class="wp-block-paragraph"><strong>Remarque : </strong>Changer la version PHP par défaut du CLI peut engendrer des comportements inattendu chez certains outils utilisant /usr/bin/php pour accéder à PHP, sans vérifier sa version. C&rsquo;est notamment le cas d&rsquo;ISPConfig dans ses crons, ainsi que de Roundcube lors de l&rsquo;exécution de certains scripts durant l&rsquo;installation/mise à jour.</p>



<p class="wp-block-paragraph">Je vous recommanderai plutôt de modifier la version PHP par défaut du CLI uniquement sur un seul utilisateur shell qui est celui du site qui en a besoin. J&rsquo;écrirai bientôt un tutoriel à ce sujet.</p>



<h2 class="wp-block-heading">Ajout dans ISPConfig</h2>



<p class="wp-block-paragraph">Si vous utilisez ISPConfig, vous pouvez ajouter cette nouvelle installation dans ISPConfig > Système > Version PHP additionnelles. Vous mettez les valeurs suivantes :</p>



<ul class="wp-block-list"><li>PHP Name : le nom dont vous souhaitez afficher sur la liste à dérouler. J&rsquo;ai mis « <strong>PHP 5.6</strong> » pour ma part.</li><li>FastCGI Settings > Path to the PHP FastCGI binary : <strong>php-cgi5.6</strong></li><li>FastCGI Settings > Path to the php.ini directory : <strong>/etc/php/5.6/cgi/php.ini</strong></li><li>PHP-FPM Settings > Path to the PHP-FPM init script : <strong>php5.6-fpm</strong></li><li>PHP-FPM Settings > Path to the php.ini directory : <strong>/etc/php/5.6/cgi/php.ini</strong></li><li>PHP-FPM Settings > Path to the PHP-FPM pool directory : <strong>/etc/php/5.6/fpm/pool.d</strong></li></ul>



<h2 class="wp-block-heading">Bonus : script d&rsquo;installation</h2>



<p class="wp-block-paragraph">Voici en bonus un script d&rsquo;installation/mise à jour complet que j&rsquo;ai créé pour vous. Elle permet d&rsquo;installer PHP 5.6 depuis les dépôts sury.org, garde la version de PHP par défaut inchangée, et ajoute PHP 5.6 dans ISPConfig. Elle empêche également le démarrage du service PHP-FPM associé si aucun site n&rsquo;est configuré sur cette version de PHP dans ISPConfig, empêchant ainsi de perdre inutilement des ressources (CPU, RAM, disque &#8230;).</p>



<p class="wp-block-paragraph">L&rsquo;utilisation se fait en une seule ligne et est totalement automatisée :</p>



<pre class="wp-block-code"><code>curl -s https://scripts.ratefiarison.com/raw/debian-install-php5.6-sury | bash</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://manoa.ratefiarison.com/2022/04/16/installer-php-5-6-debian/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Installer PHP 5.3 sous Debian 11</title>
		<link>https://manoa.ratefiarison.com/2022/04/12/installer-php-5-3-debian-11-bullseye/</link>
					<comments>https://manoa.ratefiarison.com/2022/04/12/installer-php-5-3-debian-11-bullseye/#comments</comments>
		
		<dc:creator><![CDATA[Manoa Ratefiarison]]></dc:creator>
		<pubDate>Tue, 12 Apr 2022 19:57:44 +0000</pubDate>
				<category><![CDATA[Administration système]]></category>
		<category><![CDATA[compilation]]></category>
		<category><![CDATA[debian 11]]></category>
		<category><![CDATA[ispconfig]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php 5.3]]></category>
		<category><![CDATA[retro]]></category>
		<guid isPermaLink="false">https://manoa.ratefiarison.com/?p=98</guid>

					<description><![CDATA[Ce tutoriel va vous montrer comment installer le vieux PHP 5.3 sur le système d&#8217;exploitation Debian 11, pour des fins de compatibilité logicielle. Après avoir sorti le tutoriel pour installer PHP 5.4 sous Debian 11, j&#8217;ai décidé de pousser le concept plus loin lorsque j&#8217;étais confronté à une situation où je dois migrer un très ... <a title="Installer PHP 5.3 sous Debian 11" class="read-more" href="https://manoa.ratefiarison.com/2022/04/12/installer-php-5-3-debian-11-bullseye/" aria-label="En savoir plus sur Installer PHP 5.3 sous Debian 11">Lire la suite</a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ce tutoriel va vous montrer comment installer le vieux PHP 5.3 sur le système d&rsquo;exploitation Debian 11, pour des fins de compatibilité logicielle.</p>



<span id="more-98"></span>



<p class="wp-block-paragraph">Après avoir sorti le tutoriel pour <a href="https://manoa.ratefiarison.com/2022/04/11/installer-php-5-4-sous-debian-11/" data-type="post" data-id="91">installer PHP 5.4 sous Debian 11</a>, j&rsquo;ai décidé de pousser le concept plus loin lorsque j&rsquo;étais confronté à une situation où je dois migrer un très vieux site OsCommerce sur un système d&rsquo;exploitation récent. Fort heureusement, j&rsquo;ai pu reprendre une grande partie des résolutions de problème faites sur ce précédent article.</p>



<h1 class="wp-block-heading">1. Installer OpenSSL 1.0.2u</h1>



<p class="wp-block-paragraph">Comme PHP 5.4, PHP 5.3 requiert une vieille version d&rsquo;OpenSSL que nous allons compiler et installer de côté :</p>



<pre class="wp-block-code"><code>mkdir -p /usr/local/openssl-1.0.2u
wget -O /usr/local/src/openssl-1.0.2u.tar.gz https://www.openssl.org/source/openssl-1.0.2u.tar.gz
cd /usr/local/src/
tar -xf openssl-1.0.2u.tar.gz
rm -f openssl-1.0.2u.tar.gz
cd openssl-1.0.2u
./config shared --prefix=/usr/local/openssl-1.0.2u
make -j $(nproc)
make install
ln -s /usr/local/openssl-1.0.2u/lib /usr/local/openssl-1.0.2u/lib/x86_64-linux-gnu
wget -O /usr/local/openssl-1.0.2u/ssl/cert.pem "http://curl.haxx.se/ca/cacert.pem"
ln -s /usr/local/openssl-1.0.2u/lib/libcrypto.so.1.0.0 /usr/lib/x86_64-linux-gnu/
ln -s /usr/local/openssl-1.0.2u/lib/libssl.so.1.0.0 /usr/lib/x86_64-linux-gnu/</code></pre>



<h2 class="wp-block-heading">2. Installer cURL 7.82.0</h2>



<p class="wp-block-paragraph">Même chose pour cURL avec qui on a besoin d&rsquo;une vieille version :</p>



<pre class="wp-block-code"><code>mkdir -p /usr/local/curl-7.82.0
wget -O /usr/local/src/curl-7.82.0.tar.gz https://curl.se/download/curl-7.82.0.tar.gz
cd /usr/local/src/
tar -xf curl-7.82.0.tar.gz
rm -f curl-7.82.0.tar.gz
cd curl-7.82.0
./configure --with-openssl=/usr/local/openssl-1.0.2u --prefix=/usr/local/curl-7.82.0
make -j $(nproc)
make install</code></pre>



<p class="wp-block-paragraph">Remarquez l&rsquo;utilisation d&rsquo;OpenSSL 1.0.2u lors de la compilation de cURL.</p>



<h2 class="wp-block-heading">3. Compiler PHP 5.3 sur Debian 11</h2>



<p class="wp-block-paragraph">Déjà, il faut disposer des bonnes dépendances pour compiler PHP 5.3 :</p>



<pre class="wp-block-code"><code>apt-get install -y libfcgi-dev libfcgi0ldbl libmcrypt-dev libssl-dev libc-client2007e libc-client2007e-dev libpq-dev libxslt-dev libltdl-dev libmariadb-dev-compat libmariadb-dev</code></pre>



<p class="wp-block-paragraph">J&rsquo;ignore si les paquetages <strong>libmariadb-dev-compat</strong> et <strong>libmariadb-dev</strong> peuvent être omis ou non, vu que, plus tard dans mes tests, j&rsquo;ai décidé d&rsquo;utiliser <strong><a href="https://dev.mysql.com/downloads/connector/php-mysqlnd/" target="_blank" rel="noreferrer noopener">mysqlnd</a></strong>, le client natif de PHP pour MySQL. Techniquement, en utilisant mysqlnd, ces librairies sont inutiles. <strong>A tester.</strong></p>



<p class="wp-block-paragraph">Maintenant, il s&rsquo;agit de télécharger et décompresser la dernière version de PHP 5.3 :</p>



<pre class="wp-block-code"><code>wget -O /usr/local/src/php-5.3.29.tar.gz https://www.php.net/distributions/php-5.3.29.tar.gz
cd /usr/local/src/
tar -xf php-5.3.29.tar.gz
rm -f php-5.3.29.tar.gz
cd php-5.3.29</code></pre>



<p class="wp-block-paragraph">A présent, il faut configurer la compilation :</p>



<pre class="wp-block-code"><code>./configure --prefix=/usr/local/php-5.3 --with-pdo-pgsql --with-zlib-dir --with-freetype-dir --enable-mbstring --with-libxml-dir=/usr --enable-soap --enable-calendar --with-curl=/usr/local/curl-7.82.0 --with-mcrypt --with-zlib --with-pgsql --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --enable-exif --enable-bcmath --with-mhash --enable-zip --with-pcre-regex --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql-sock=/var/run/mysqld/mysqld.sock --with-jpeg-dir=/usr --with-png-dir=/usr --enable-gd-native-ttf --with-openssl=/usr/local/openssl-1.0.2u --with-fpm-user=www-data --with-fpm-group=www-data --with-libdir=/lib/x86_64-linux-gnu --enable-ftp --with-kerberos --with-gettext --with-xmlrpc --with-xsl --enable-fpm</code></pre>



<p class="wp-block-paragraph"><strong>&#8211;prefix</strong> me permet de définir le dossier sur lequel je vais installer PHP 5.3, <strong>&#8211;with-curl</strong> pour indiquer le chemin du cURL que je souhaite utiliser (celui qu&rsquo;on a précédemment compilé), <strong>&#8211;with-openssl</strong> pour indiquer le chemin du OpenSSL que je souhaite utiliser (également celui précédemment compilé).</p>



<p class="wp-block-paragraph">J&rsquo;ai essayé de compiler avec les librairies MySQL fournis par MariaDB 10.5 sur le dépôt officiel de Debian mais je n&rsquo;ai pas réussi, à cause de l&rsquo;absence de certains fichiers headers, qui ont été présent auparavant sur les vieilles version de MySQL. Je ne me suis pas cassé la tête, j&rsquo;ai activé l&rsquo;utilisation du mysqlnd (MySQL Native Driver) de PHP en utilisant les options <strong>&#8211;with-mysql=mysqlnd &#8211;with-mysqli=mysqlnd &#8211;with-pdo-mysql=mysqlnd</strong>.</p>



<p class="wp-block-paragraph">Enfin, on compile et installe :</p>



<pre class="wp-block-code"><code>make -j $(nproc)
make install</code></pre>



<h2 class="wp-block-heading">4. Configurer PHP 5.3</h2>



<p class="wp-block-paragraph">Déjà, initialisons les fichiers de configuration par les fichiers de configuration par défaut proposés :</p>



<pre class="wp-block-code"><code>cp /usr/local/src/php-5.3.29/php.ini-production /usr/local/php-5.3/lib/php.ini
cp /usr/local/php-5.3/etc/php-fpm.conf.default /usr/local/php-5.3/etc/php-fpm.conf</code></pre>



<p class="wp-block-paragraph">Ensuite, préparer le dossier qui va accueillir les pool PHP-FPM :</p>



<pre class="wp-block-code"><code>mkdir -p /usr/local/php-5.3/etc/php-fpm.d</code></pre>



<p class="wp-block-paragraph">Configurer le fichier PID du PHP-FPM :</p>



<pre class="wp-block-code"><code>sed -i "s|;pid\s=\srun/php-fpm.pid|pid = run/php-fpm.pid|g" /usr/local/php-5.3/etc/php-fpm.conf</code></pre>



<p class="wp-block-paragraph">Configurer le socket d&rsquo;écoute et son utilisateur/groupe propriétaire :</p>



<pre class="wp-block-code"><code>sed -i "s|;listen\s=.|listen = /run/php/php5.4-fpm.sock|g" /usr/local/php-5.3/etc/php-fpm.conf
sed -i "s|;listen.owner\s=.|listen.owner = www-data|g" /usr/local/php-5.3/etc/php-fpm.conf
sed -i "s|;listen.group\s=.|listen.group = www-data|g" /usr/local/php-5.3/etc/php-fpm.conf</code></pre>



<p class="wp-block-paragraph">Enfin, il faut inclure les fichiers de configuration dans le dossier que nous avons créé prédécemment :</p>



<pre class="wp-block-code"><code>sed -i "s|;include\s=.|include=/usr/local/php-5.3/etc/php-fpm.d/.conf|g" /usr/local/php-5.3/etc/php-fpm.conf</code></pre>



<p class="wp-block-paragraph">Maintenant, il faut créer le service systemd correspondant à PHP-FPM :</p>



<pre class="wp-block-code"><code>cat &lt; /lib/systemd/system/php5.3-fpm.service
&#91;Unit]
Description=The PHP 5.3 FastCGI Process Manager
After=network.target

&#91;Service]
Type=simple
PIDFile=/usr/local/php-5.3/var/run/php-fpm.pid
ExecStartPre=/bin/mkdir -p /run/php
ExecStart=/usr/local/php-5.3/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php-5.3/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
PermissionsStartOnly=true

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



<p class="wp-block-paragraph">Maintenant, il faut l&rsquo;activer au démarrage et le lancer :</p>



<pre class="wp-block-code"><code>systemctl daemon-reload
systemctl enable --now php5.3-fpm.service
systemctl restart php5.3-fpm.service</code></pre>



<p class="wp-block-paragraph">Par pure caprice, je mets un lien symbolique dans /usr/bin afin de faciliter l&rsquo;utilisation de PHP 5.3 en ligne de commande :</p>



<pre class="wp-block-code"><code>ln -s /usr/local/php-5.3/bin/php /usr/bin/php5.3
ln -s /usr/local/php-5.3/bin/php-cgi /usr/bin/php-cgi5.3</code></pre>



<h2 class="wp-block-heading">5. Ajouter PHP 5.3 sur ISPConfig</h2>



<p class="wp-block-paragraph">Si vous utilisez ISPConfig comme panneau de contrôle, alors vous pouvez ajouter cette installation dans ISPConfig grâce à la requête SQL suivante :</p>



<pre class="wp-block-code"><code>mysql --defaults-file=/etc/mysql/debian.cnf dbispconfig -e "INSERT INTO server_php (sys_userid, sys_groupid, sys_perm_user, sys_perm_group, sys_perm_other, server_id, client_id, name, php_fastcgi_binary, php_fastcgi_ini_dir, php_fpm_init_script, php_fpm_ini_dir, php_fpm_pool_dir, active) VALUES (1, 1, 'ruid', 'ruid', '', 1, 0, 'PHP 5.3', 'php-cgi5.3', '/usr/local/php-5.3/lib/php.ini', 'php5.3-fpm', '/usr/local/php-5.3/lib/php.ini', '/usr/local/php-5.3/etc/php-fpm.d', 'y')"</code></pre>



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



<p class="wp-block-paragraph">Faire fonctionner PHP 5.3 sur un système d&rsquo;exploitation aussi récent que Debian 11 n&rsquo;est finalement pas si difficile qu&rsquo;on pourrait le croire. Il faut juste mettre à disposition les bonnes versions des dépendances au compilateur. Mais planifiez quand même votre migration vers un PHP plus récent, avant que quelqu&rsquo;un ne trouve une brèche sur votre site.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://manoa.ratefiarison.com/2022/04/12/installer-php-5-3-debian-11-bullseye/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>
