<?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>sécurité &#8211; Manoa Ratefiarison</title>
	<atom:link href="https://manoa.ratefiarison.com/tag/securite/feed/" rel="self" type="application/rss+xml" />
	<link>https://manoa.ratefiarison.com</link>
	<description>Music &#38; code</description>
	<lastBuildDate>Sat, 07 May 2022 08:36:51 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://manoa.ratefiarison.com/wp-content/uploads/2022/09/cropped-manoaratefiarison-favicon-32x32.png</url>
	<title>sécurité &#8211; Manoa Ratefiarison</title>
	<link>https://manoa.ratefiarison.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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>
	</channel>
</rss>
