<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Jesuisadmin]]></title><description><![CDATA[Jesuisadmin - SysAdmin & Self-hosting Blog]]></description><link>https://jesuisadmin.fr/</link><image><url>https://jesuisadmin.fr/favicon.png</url><title>Jesuisadmin</title><link>https://jesuisadmin.fr/</link></image><generator>Ghost 5.26</generator><lastBuildDate>Sun, 17 May 2026 04:24:43 GMT</lastBuildDate><atom:link href="https://jesuisadmin.fr/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[WordOps - Déployer WordPress avec Nginx simplement]]></title><description><![CDATA[Une présentation de mon outil de prédilection pour déployer WordPress avec Nginx, PHP & MariaDB : WordOps.]]></description><link>https://jesuisadmin.fr/wordops-deployer-wordpress-nginx-simplement/</link><guid isPermaLink="false">5c9f7f72b62c26e5087aa684</guid><category><![CDATA[Nginx]]></category><category><![CDATA[Self-hosting]]></category><category><![CDATA[Sysadmin]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Sat, 18 May 2019 12:03:24 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2019/05/Sans-titre--1-.png" medium="image"/><content:encoded><![CDATA[<img src="https://jesuisadmin.fr/content/images/2019/05/Sans-titre--1-.png" alt="WordOps - D&#xE9;ployer WordPress avec Nginx simplement"><p>Pour automatiser le d&#xE9;ploiement de mes serveurs avec Nginx, PHP, MariaDB et pour cr&#xE9;er les vhosts Nginx, j&apos;utilisais pr&#xE9;c&#xE9;demment <a href="https://easyengine.io/">EasyEngine v3 </a> - qui avait d&apos;ailleurs fait l&apos;objet <a href="https://jesuisadmin.fr/easyengine-nginx-wordpress/">d&apos;un article</a>. Le probl&#xE8;me, c&apos;est qu&apos;EasyEngine n&apos;&#xE9;tait plus vraiment &#xE0; jour. Et pour cause, ses d&#xE9;veloppeurs (rtCamp) travaillaient sur une nouvelle mouture qui a &#xE9;t&#xE9; publi&#xE9;e fin novembre 2018, EasyEngine v4. &#xA0;</p><p>Malheureusement, cette nouvelle version d&#xE9;velopp&#xE9;e en PHP qui utilise WP-CLI et Docker ne r&#xE9;ponds pas vraiment &#xE0; mes besoins, et ne laisse (&#xE0; l&apos;heure actuelle) que tr&#xE8;s peu de place &#xE0; la customisation, aussi bien au niveau des configurations Nginx, que des paquets/containers utilis&#xE9;s.</p><p>N&apos;y voyez pas un reproche &#xE0; l&apos;encontre de ses cr&#xE9;ateurs, puisque je comprends tout &#xE0; fait le choix fait par l&apos;&#xE9;quipe de rtCamp, et il me semble tout &#xE0; fait normal que l&apos;outil qu&apos;ils d&#xE9;veloppent soit avant tout adapt&#xE9; &#xE0; leurs besoins. Il me para&#xEE;t d&apos;ailleurs important de souligner qu&apos;ils mettent &#xE0; disposition, gratuitement, avec une simple licence MIT, une application tr&#xE8;s compl&#xE8;te et document&#xE9;e, et ceux depuis d&#xE9;j&#xE0; plusieurs ann&#xE9;es (la premi&#xE8;re version d&apos;EasyEngine a &#xE9;t&#xE9; publi&#xE9;e en 2014).</p><p>Finalement, c&apos;est en parcourant les articles du blog d&apos;EasyEngine fin D&#xE9;cembre, que j&apos;ai d&#xE9;couvert qu&apos;un fork de la version 3 d&apos;EasyEngine baptis&#xE9; <a href="https://wordops.net">WordOps </a>&#xE9;tait actuellement en d&#xE9;veloppement et qu&apos;une premi&#xE8;re pre-release &#xE9;tait disponible sur Github. </p><p>Ayant contribu&#xE9; de mon mieux au projet EasyEngine v3 en publiant un certain nombre de scripts ainsi que la majorit&#xE9; de mes configurations Nginx, j&apos;ai &#xE9;t&#xE9; contact&#xE9; par l&apos;&#xE9;quipe de WordOps que j&apos;ai finalement int&#xE9;gr&#xE9; d&#xE9;but F&#xE9;vrier. </p><p>Nous avons publi&#xE9; la premi&#xE8;re version &quot;stable&quot; de l&apos;application d&#xE9;but Mai et il &#xE9;tait donc temps de r&#xE9;diger un article pour vous pr&#xE9;senter WordOps.</p><h3 id="wordops-qu-est-ce-que-c-est">WordOps qu&apos;est ce que c&apos;est ?</h3><p>C&apos;est un outil en ligne de commande qui facilite l&apos;administration d&apos;un serveur et le d&#xE9;ploiement de sites avec Nginx (notamment WordPress) en utilisant des commandes simples - &#xA0;faciles &#xE0; m&#xE9;moriser.</p><h3 id="quels-sont-les-pr-requis-pour-installer-wordops">Quels sont les pr&#xE9;-requis pour installer WordOps ?</h3><p>Du c&#xF4;t&#xE9; hardware, il n&apos;y a pas vraiment de pr&#xE9;-requis, puisque l&apos;application est d&#xE9;velopp&#xE9;e en Python avec le framework Cement et ne n&#xE9;cessite que quelques m&#xE9;gaoctets d&apos;espace disque pour le stockage des librairies.</p><p><strong>Pour une utilisation en production</strong>, les services install&#xE9;s et configur&#xE9;s par WordOps tel que Nginx, PHP-FPM ou MariaDB, n&#xE9;cessitent un minimum de ressources pour fonctionner. Ce minimum peut varier en fonction du trafic des sites h&#xE9;berg&#xE9;s. C&apos;est pourquoi nous conseillons d&apos;installer WordOps sur un serveur disposant d&apos;au moins 2Go de RAM et si possible d&apos;un processeur multi-core (qu&apos;ils soient virtuels ou non) pour garantir le bon fonctionnement des diff&#xE9;rents services d&#xE9;ploy&#xE9;s avec WordOps et donc la disponibilit&#xE9; des sites h&#xE9;berg&#xE9;s. </p><p>Par contre, si vous comptez utiliser WordOps pour du d&#xE9;veloppement, il devrait normalement fonctionner sur n&apos;importe qu&apos;elle machine/VM disposant de 512mo de RAM ou plus. </p><p>Nous avons d&apos;ailleurs ajout&#xE9; depuis peu le support de la distribution Raspbian 9, qui permet donc l&apos;installation sur Raspberry Pi (nos tests ont &#xE9;t&#xE9; r&#xE9;alis&#xE9;s sur le mod&#xE8;le 3B+).</p><p>Du c&#xF4;t&#xE9; software, les distributions linux support&#xE9;es sont :</p><ul><li>Ubuntu 16.04 LTS (Xenial)</li><li>Ubuntu 18.04 LTS (Bionic)</li><li>Ubuntu 19.04 (Disco)</li><li>Debian 8 (Jessie)</li><li>Debian 9 (Stretch)</li><li>Raspbian 9 (Stretch)</li></ul><h3 id="quelles-sont-ses-fonctionnalit-s">Quelles sont ses fonctionnalit&#xE9;s ?</h3><p>WordOps r&#xE9;alise non seulement l&apos;installation et la configuration des paquets n&#xE9;cessaires au d&#xE9;ploiement d&apos;un site (Nginx, PHP, MariaDB) mais il s&apos;occupe &#xE9;galement de la cr&#xE9;ation des vhosts Nginx, de la base de donn&#xE9;es, d&apos;installer WordPress et m&#xEA;me d&apos;obtenir un certificat SSL Let&apos;s Encrypt, le tout r&#xE9;alisable en une seule ligne de commande.</p><p>Dans le cas d&apos;un site WordPress, vous disposez de plusieurs solutions de cache (optionelles) : Nginx fastcgi_cache, Redis (full page cache + object cache) ou WP-Super-Cache.</p><p>Enfin WordOps dispose d&apos;un tableau de bord (que j&apos;ai r&#xE9;alis&#xE9; depuis un template bootstrap de <a href="https://www.creative-tim.com/">Creative Tim</a> et avec la suite de monitoring Netdata) qui permet &#xE0; la fois de monitorer le serveur mais &#xE9;galement d&apos;acc&#xE9;der &#xE0; des outils tel que PhpMyAdmin, Adminer, eXtplorer, phpRedisAdmin etc.. Une d&#xE9;mo est disponible &#xE0; l&apos;adresse suivante : <a href="https://demo.wordops.eu/">demo.wordops.eu</a>.</p><figure class="kg-card kg-image-card"><img src="https://jesuisadmin.fr/content/images/2019/05/demo.wordops.eu.jpg" class="kg-image" alt="WordOps - D&#xE9;ployer WordPress avec Nginx simplement" loading="lazy"></figure><h3 id="qu-est-ce-qu-il-y-a-sous-le-capot">Qu&apos;est ce qu&apos;il y a sous le capot ?</h3><ul><li><strong>Nginx </strong>stable v1.16.1 &#xA0;(custom) avec le support du HTTP/2 HPACK de Cloudflare, de la compression avec Brotli, et des modules tiers tel que ngx_cache_purge ou ngx_vts </li><li>PHP 7.2 &amp; PHP 7.3 </li><li>MariaDB server 10.3</li><li>Redis 5.0</li><li>Netdata pour le monitoring</li><li>Acme.sh pour la gestion des certificats SSL Let&apos;s Encrypt</li><li>WP-CLI pour le d&#xE9;ploiement des sites WordPress</li></ul><p>Et bien s&#xFB;r, un ensemble de templates de configuration Nginx, qui ont pour objectif de d&#xE9;livrer les meilleures performances possibles ainsi qu&apos;un niveau de s&#xE9;curit&#xE9; optimale. Pour cela, WordOps utilise par exemple Nginx en tant que load-balancer pour r&#xE9;partir la charge sur les pools php-fpm en utilisant plusieurs unix sockets. On retrouve &#xE9;galement un certain nombre de directives limitant l&apos;acc&#xE8;s et/ou l&apos;ex&#xE9;cution et le t&#xE9;l&#xE9;chargement de certains fichiers afin de bloquer les tentatives d&apos;attaques r&#xE9;guli&#xE8;rement utilis&#xE9;es.</p><!--kg-card-begin: markdown--><h2 id="installerwordops">Installer WordOps</h2>
<p>Un script pour automatiser l&apos;installation de WordOps est bien s&#xFB;r disponible, il s&apos;ex&#xE9;cute avec la commande suivante :</p>
<pre><code class="language-bash">wget -qO wo wops.cc &amp;&amp; sudo bash wo
</code></pre>
<p>Si vous souhaitez installer manuellement WordOps, un guide est disponible dans la <a href="https://docs.wordops.net/getting-started/installation-guide/">documentation</a></p>
<p>Durant l&apos;installation, WordOps vous demandera un nom d&apos;utilisateur et une adresse email. Ces informations sont <strong>uniquement utilis&#xE9;es</strong> pour g&#xE9;n&#xE9;rer le fichier .gitconfig n&#xE9;cessaire au fonctionnement de git, qui est utilis&#xE9; pour enregistrer les diff&#xE9;rentes configurations du serveur.</p>
<!--kg-card-end: markdown--><h2 id="commencer-avec-wordops">Commencer avec WordOps</h2><!--kg-card-begin: markdown--><p>Apr&#xE8;s avoir install&#xE9; WordOps, la premi&#xE8;re &#xE9;tape est d&apos;activer la compl&#xE9;tion des commandes, il suffit pour cela d&apos;utiliser la commande :</p>
<pre><code class="language-bash">source /etc/bash_completion.d/wo_auto.rc
</code></pre>
<p>Nous pouvons donc commencer &#xE0; utiliser les commandes WordOps, dont la structure est la suivante :</p>
<pre><code class="language-bash">wo &lt;commande&gt; [options]
</code></pre>
<p>Vous souhaitez obtenir la liste des commandes disponibles ? Rien de plus simple, utilisez la commande :</p>
<pre><code class="language-bash">wo
</code></pre>
<p>Vous pouvez &#xE9;galement obtenir des informations sur chacune des sous-commandes en ajoutant les arguments <code>-h</code> ou <code>--help</code>.</p>
<p>Exemple :</p>
<pre><code class="language-bash">wo site create -h
</code></pre>
<h3 id="installerlesservicesoptionnel">Installer les services (optionnel)</h3>
<p>WordOps peut installer les services Nginx, PHP ou MySQL via la commande <code>wo stack</code> ou  n&apos;installer que les services n&#xE9;cessaires lors de la cr&#xE9;ation d&apos;un site avec la commande <code>wo site create</code>.</p>
<p>Si vous comptez utiliser WordOps pour h&#xE9;berger vos sites WordPress, il peut &#xEA;tre int&#xE9;ressant de commencer par d&#xE9;ployqer les services (Nginx, PHP 7.2, MariaDB) ainsi que les outils additionnels (phpMyAdmin, Adminer, OpcacheGui) qui seront disponibles dans le backend  accessible via le port 22222 (exemple : <a href="https://IP.DU.SERVEUR:22222">https://IP.DU.SERVEUR:22222</a> ou <a href="https://serveur.hostname:22222">https://serveur.hostname:22222</a>).</p>
<p>Pour d&#xE9;ployer les services, la commande &#xE0; utiliser est :</p>
<pre><code class="language-bash">wo stack install
</code></pre>
<h3 id="crervotrepremiersite">Cr&#xE9;er votre premier site</h3>
<p>Que vous ayez suivi ou non l&apos;&#xE9;tape pr&#xE9;c&#xE9;dente, vous pouvez cr&#xE9;er votre premier site.<br>
La cr&#xE9;ation de site se fait via la commande <code>wo site create</code> avec la structure suivante :</p>
<pre><code class="language-bash">wo site create  [&lt;nom_de_domaine&gt;] [type_de_site] [options] &lt;options&gt;
</code></pre>
<p>Pour vous donner un exemple relativement simple, nous allons cr&#xE9;er un site WordPress, configur&#xE9; avec PHP 7.3 et le syst&#xE8;me de cache nginx fastcgi_cache, s&#xE9;curis&#xE9; avec un certificat SSL Let&apos;s Encrypt :</p>
<pre><code class="language-bash">wo site create site.tld --wpfc --php73 --letsencrypt
</code></pre>
<h4 id="quelquespointsretenir">Quelques points &#xE0; retenir</h4>
<ul>
<li>par d&#xE9;faut et en l&apos;absence de l&apos;argument <code>--php73</code>, WordOps utilisera PHP 7.2</li>
<li>l&apos;argument <code>--wpfc</code> d&#xE9;finit le type de site, ici un site WordPress avec le syst&#xE8;me de cache Nginx fastcgi_cache. Vous pouvez d&#xE9;couvrir tous les autres types de sites dans <a href="https://docs.wordops.net/commands/site/#site-create">la documentation</a>.</li>
<li>l&apos;argument <code>--letsencrypt</code> est optionel et peut &#xEA;tre utilis&#xE9; avec n&apos;importe quel type de site. Si le site que vous souhaitez cr&#xE9;er est un sous-domaine, utilisez alors l&apos;argument <code>--letsencrypt=subdomain</code> pour que WordOps n&apos;essaye pas de g&#xE9;n&#xE9;rer un certificat SSL pour l&apos;alias <code>www.site.tld</code>.</li>
</ul>
<p>Voici un exemple qui pr&#xE9;sente le fonctionnement g&#xE9;n&#xE9;ral de WordOps :</p>
<p><video align="center" src="https://wordops.net/wp-content/uploads/2019/08/wordops-net-intro.mp4" width="840" autoplay loop></video></p>
<!--kg-card-end: markdown--><h2 id="contribuer">Contribuer</h2><p>Comme pour la majorit&#xE9; des projets open-source, toute contribution est la bienvenue. Et il n&apos;est pas n&#xE9;cessaire d&apos;&#xEA;tre un d&#xE9;veloppeur ou un administrateur syst&#xE8;me pour contribuer. </p><p>Le simple fait de faire un signalement d&#xE9;taill&#xE9; d&apos;un bug dans l&apos;application est une contribution au projet. Vous pouvez &#xE9;galement participer &#xE0; l&apos;am&#xE9;lioration de la documentation de WordOps, qui peut facilement &#xEA;tre &#xE9;dit&#xE9;e car elle est r&#xE9;dig&#xE9;e en markdown et h&#xE9;berg&#xE9;e dans un <a href="https://github.com/WordOps/docs.wordops.net">d&#xE9;p&#xF4;t Github</a>.</p><p>Si vous souhaitez contribuer directement au d&#xE9;veloppement de WordOps, sachez que la r&#xE9;daction d&apos;un guide est en cours, avec un pr&#xE9;sentation d&#xE9;taill&#xE9;e des librairies utilis&#xE9;es et les r&#xE8;gles &#xE0; suivre notamment pour le style &#xE0; appliquer au code (PEP8). Je mettrais &#xE0; jour cet article d&#xE8;s que le guide sera publi&#xE9; sur le d&#xE9;p&#xF4;t Github.</p><h2 id="les-liens-utiles">Les liens utiles</h2><ul><li>le site du projet : <a href="https://wordops.net">https://wordops.net</a></li><li>le d&#xE9;p&#xF4;t Github : <a href="https://github.com/WordOps/WordOps">https://github.com/WordOps/WordOps</a></li><li>le forum : &#xA0;<a href="https://community.wordops.net/">https://community.wordops.net/</a></li><li>la documentation : <a href="https://docs.wordops.net/">https://docs.wordops.net/</a></li><li>le compte twitter : <a href="https://twitter.com/WordOps_">https://twitter.com/WordOps_</a></li><li>le compte mastodon : <a href="https://mastodon.top/@WordOps">https://mastodon.top/@WordOps</a></li></ul>]]></content:encoded></item><item><title><![CDATA[Installer Rocket.chat sur Ubuntu 18.04 LTS]]></title><description><![CDATA[Dans ce tutoriel, nous allons voir comment installer Rocket.chat sur Ubuntu 18.04 LTS en utilisant les snaps et un reverse-proxy avec nginx]]></description><link>https://jesuisadmin.fr/installer-rocket-chat-ubuntu-16-04-lts/</link><guid isPermaLink="false">5c3f5221007fc1214a0a72df</guid><category><![CDATA[Nginx]]></category><category><![CDATA[Self-hosting]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Wed, 01 May 2019 16:21:00 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2019/05/rocket-chat.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://jesuisadmin.fr/content/images/2019/05/rocket-chat.jpg" alt="Installer Rocket.chat sur Ubuntu 18.04 LTS"><p>Rocket.Chat est une plateforme de chat open-source et particuli&#xE8;rement compl&#xE8;te. Vous pouvez aussi bien l&#x2019;utiliser pour cr&#xE9;er une chat-room, avec une gestion des utilisateurs et des permissions, que pour proposer un live chat via un widget sur votre site web.<br>Cette plateforme est d&#x2019;autant plus int&#xE9;ressante que vous pouvez la d&#xE9;ployer en utilisant les &#x201C;snaps&#x201D; sur Ubuntu. Ainsi vous n&#x2019;aurez pas besoin d&#x2019;installer/configurer NodeJS ou MongoDB.</p><h2 id="installer-rocket-chat-avec-un-snap">Installer Rocket.chat avec un snap</h2><p>L&#x2019;installation se fait via une seule ligne de commande :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">sudo snap install rocketchat-server
</code></pre>
<p>Votre instance Rocket.Chat sera alors accessible &#xE0; l&#x2019;adresse : <code>http://IP-de-VOTRE-SERVEUR:3000</code>.</p>
<!--kg-card-end: markdown--><h2 id="mettre-en-place-un-reverse-proxy-avec-nginx">Mettre en place un reverse-proxy avec Nginx</h2><p>Il est pr&#xE9;f&#xE9;rable de mettre en place un reverse-proxy pour acc&#xE9;der &#xE0; l&apos;interface de Rocket.Chat via un port standard et d&apos;utiliser un certificat SSL pour s&#xE9;curiser les &#xE9;changes. Nous allons pour cela installer Nginx et g&#xE9;n&#xE9;rer un certificat SSL via Let&#x2019;s Encrypt.</p><p>Commen&#xE7;ons par installer Nginx :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">apt update &amp;&amp; apt install nginx
</code></pre>
<!--kg-card-end: markdown--><p>On cr&#xE9;er ensuite notre vhost dans /etc/nginx/sites-available/ : </p><!--kg-card-begin: markdown--><pre><code class="language-bash">nano /etc/nginx/sites-available/chat.votredomaine.tld
</code></pre>
<p>Dont voici le contenu :</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><pre><code class="language-nginx"># redirection http vers https
server {
    listen 80;
    listen [::]:80;
    server_name chat.votredomaine.tld;
    return 301 https://chat.votredomaine.tld;
}

# Upstream
upstream backend {
    server 127.0.0.1:3000;
}

# HTTPS Server
server {
    server_name chat.votredomaine.tld;

    error_log /var/log/nginx/rocketchat.access.log;

    location / {
        proxy_pass http://backend/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;upgrade&quot;;
        proxy_set_header Host $http_host;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forward-Proto http;
        proxy_set_header X-Nginx-Proxy true;

        proxy_redirect off;
    }
    # permet de stocker la configuration ssl dans le r&#xE9;pertoire du site
    include /var/www/votredomaine.tld/conf/nginx/*conf;
}
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Pour activer ce vhost, on cr&#xE9;er un lien symbolique vers le r&#xE9;pertoire <code>/etc/nginx/sites-enabled</code> avec la commande :</p>
<pre><code class="language-bash">ln -s /etc/nginx/sites-available/chat.votredomaine.tld /etc/nginx/sites-enabled/
</code></pre>
<p>Puis on relance Nginx :</p>
<pre><code class="language-bash">service nginx reload
</code></pre>
<!--kg-card-end: markdown--><h3 id="obtenir-un-certificat-ssl-let-s-encrypt-avec-acme-sh">Obtenir un certificat SSL Let&apos;s Encrypt avec acme.sh</h3><p>Il ne nous reste plus qu&#x2019;&#xE0; g&#xE9;n&#xE9;rer le certificat via Let&#x2019;s Encrypt, on installe donc acme.sh :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">wget -O -  https://get.acme.sh | sh
sudo source ~/.bashrc
</code></pre>
<!--kg-card-end: markdown--><p>Puis on g&#xE9;n&#xE8;re le certificat pour notre sous-domaine.</p><!--kg-card-begin: markdown--><pre><code class="language-bash">acme.sh  --issue  -d chat.votredomaine.tld --pre-hook &quot;systemctl stop nginx&quot; --standalone --post-hook &quot;systemctl start nginx&quot; --ecc -k ec-384
</code></pre>
<!--kg-card-end: markdown--><p>On cr&#xE9;er un r&#xE9;pertoire pour stocker notre certificat :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">mkdir -p /etc/letsencrypt/live/chat.votredomaine.tld
</code></pre>
<!--kg-card-end: markdown--><p>Puis on installe le certificat dans ce r&#xE9;pertoire :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">acme.sh --install-cert -d chat.votredomaine.tld --ecc \
--cert-file /etc/letsencrypt/live/chat.votredomaine.tld/cert.pem \
--key-file /etc/letsencrypt/live/chat.votredomaine.tld/key.pem \
--fullchain-file /etc/letsencrypt/live/chat.votredomaine.tld/fullchain.pem \
--ca-file /etc/letsencrypt/live/chat.votredomaine.tld/ca.pem \
--reloadcmd &quot;systemctl restart nginx.service&quot;
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>On termine en ajoutant le certificat SSL &#xE0; notre configuration Nginx, pour cela nous allons cr&#xE9;er le fichier <code>/var/www/chat.votredomaine.tld/conf/nginx/ssl.conf</code> qui sera automatiquement ajout&#xE9; dans notre vhost gr&#xE2;ce &#xE0; la directive <code>include /var/www/chat.votredomaine.tld/conf/nginx/*conf;</code>. Voici son contenu:</p>
<pre><code class="language-nginx">    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/chat.votredomaine.tld/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/chat.votredomaine.tld/key.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/chat.votredomaine.tld/ca.pem;
</code></pre>
<!--kg-card-end: markdown--><p>La derni&#xE8;re &#xE9;tape pour pouvoir acc&#xE9;der &#xE0; l&apos;instance Rocket.Chat est d&apos;appliquer la configuration avec la commande : </p><!--kg-card-begin: markdown--><pre><code class="language-bash">service nginx reload
</code></pre>
<!--kg-card-end: markdown--><p>Vous pourrez alors acc&#xE9;der &#xE0; votre instance via l&apos;adresse https://chat.votredomaine.tld. Pour acc&#xE9;der au panel d&apos;administration de Rocket.chat, il vous faudra cr&#xE9;er un premier compte utilisateur qui sera automatiquement d&#xE9;finit en tant qu&apos;administrateur.</p>]]></content:encoded></item><item><title><![CDATA[Mettre en place un VPN Mesh avec tinc sur Debian/Ubuntu]]></title><description><![CDATA[Dans ce tutoriel nous allons voir comment installer la dernière version stable de Tinc et comment créer un réseau privé pour connecter 3 serveurs.]]></description><link>https://jesuisadmin.fr/mettre-en-place-un-vpn-mesh-avec-tinc/</link><guid isPermaLink="false">5c3f5221007fc1214a0a72fe</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[Sysadmin]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Sat, 02 Mar 2019 15:07:54 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2018/12/Mettre-en-place-un-VPN-mesh-avec-tinc-sur-Debian_Ubuntu---Raspbian.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://jesuisadmin.fr/content/images/2018/12/Mettre-en-place-un-VPN-mesh-avec-tinc-sur-Debian_Ubuntu---Raspbian.jpg" alt="Mettre en place un VPN Mesh avec tinc sur Debian/Ubuntu"><p>	Il peut-&#xEA;tre int&#xE9;ressant (ou n&#xE9;cessaire) de mettre en place un VPN &#xA0;pour inter-connecter plusieurs serveurs, principalement pour garantir le chiffrement des &#xE9;changes entre ces derniers. Si des solutions comme OpenVPN sont tr&#xE8;s populaires car elles proposent des clients sur toutes les plateformes, elles ne sont pas n&#xE9;cessairement les plus pertinentes lorsqu&apos;il s&apos;agit de cr&#xE9;er un r&#xE9;seau priv&#xE9; entre plusieurs serveurs linux. Pour r&#xE9;pondre &#xE0; ce besoin, il existe heureusement d&apos;autres solutions, notamment Tinc, le sujet que nous allons aborder aujourd&apos;hui. </p><!--kg-card-begin: markdown--><p>Dans ce tutoriel nous allons voir comment installer la derni&#xE8;re version stable de Tinc et comment cr&#xE9;er un r&#xE9;seau priv&#xE9; pour connecter 3 serveurs. Cet exemple est bas&#xE9; sur mon utilisation <s>actuelle</s> pr&#xE9;c&#xE9;dente de Tinc, &#xE0; savoir connecter mon raspberry pi (derri&#xE8;re un NAT) et mon cluster de stockage GlusterFS, r&#xE9;parti sur deux serveurs d&#xE9;di&#xE9;s. Tinc &#xE9;tait alors la solution &#xE0; deux probl&#xE9;matiques :</p>
<ul>
<li>&#xE9;tablir une connexion securis&#xE9;e entre les noeuds GlusterFS (j&apos;ai pr&#xE9;f&#xE9;r&#xE9; mettre en place un VPN &#xE0; cause des nombreux probl&#xE8;mes rencontr&#xE9;s avec les connexions SSL/TLS et GlusterFS 4.X)</li>
<li>acc&#xE9;der aux donn&#xE9;es d&apos;un cluster GlusterFS depuis un client derri&#xE8;re un NAT</li>
</ul>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://jesuisadmin.fr/content/images/2019/01/Copie-de-Mettre-en-place-un-VPN-mesh-avec-tinc-sur-Debian_Ubuntu---Raspbian-1.jpg" class="kg-image" alt="Mettre en place un VPN Mesh avec tinc sur Debian/Ubuntu" loading="lazy"></figure><!--kg-card-begin: markdown--><p><strong>Les termes utilis&#xE9;s dans ce tutoriel :</strong></p>
<ul>
<li>une instance Tinc = un r&#xE9;seau priv&#xE9; Tinc</li>
<li>un noeud = un serveur du r&#xE9;seau</li>
</ul>
<h2 id="installertinc">Installer Tinc</h2>
<!--kg-card-end: markdown--><p>La m&#xE9;thode la plus simple pour installer Tinc est d&apos;utiliser les d&#xE9;p&#xF4;ts APT d&apos;Ubuntu ou de Debian. Cependant les paquets disponibles ne sont pas vraiment &#xE0; jour. La version actuelle de Tinc est 1.0.35, mais les d&#xE9;p&#xF4;ts Ubuntu ne propose que la version 1.0.33 et ceux de Debian la version 1.0.31. </p><!--kg-card-begin: markdown--><hr>
<p>Edit du 10/07/2019 : Les mises &#xE0; jour de s&#xE9;curit&#xE9; des paquets Debian sont r&#xE9;tro-actives sur les versions pr&#xE9;c&#xE9;dentes. Il n&apos;y a donc pas de danger particulier &#xE0; utiliser des versions ant&#xE9;rieures &#xE0; 1.0.35 sur Debian.</p>
<hr>
<p>Il est donc pr&#xE9;f&#xE9;rable/recommand&#xE9; de compiler Tinc depuis les sources, notamment lorsqu&apos;on sait que la version 1.0.35 est une release de s&#xE9;curit&#xE9; suite &#xE0; la d&#xE9;couverte de deux failles qui touchent toutes les versions ant&#xE9;rieures (CVE-2018-16737, CVE-2018-16738).</p>
<p>Ajout du 10/07/2019 : Pour simplifer l&apos;installation sur Ubuntu 18.04 LTS, j&apos;ai r&#xE9;alis&#xE9; un backport du paquet tinc 1.0.35 depuis les d&#xE9;p&#xF4;ts d&apos;Ubuntu 19.04. Le backport est disponible via le service PPA launchpad : <a href="https://launchpad.net/~virtubox/+archive/ubuntu/tinc">https://launchpad.net/~virtubox/+archive/ubuntu/tinc</a></p>
<p>Cette version n&apos;est pas vuln&#xE9;rable aux CVE-2018-16737 et CVE-2018-16738.<br>
Pour l&apos;installer rien de plus simple :</p>
<pre><code class="language-bash">sudo add-apt-repository ppa:virtubox/tinc -u -y
apt install tinc -t bionic-backports
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="compilation">Compilation</h3>
<!--kg-card-end: markdown--><p>On commence par installer les d&#xE9;pendances permettant de compiler tinc :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">sudo apt-get install git libssl-dev zlib1g-dev liblzo2-dev \
build-essential automake autoconf gettext texinfo -y
</code></pre>
<!--kg-card-end: markdown--><p>Puis on clone le d&#xE9;p&#xF4;t Git :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">cd /usr/local/src
git clone git://tinc-vpn.org/tinc
cd tinc
</code></pre>
<!--kg-card-end: markdown--><p>On r&#xE9;alise la configuration avant de compiler :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">autoreconf -fsi
./configure --prefix=
</code></pre>
<!--kg-card-end: markdown--><p>Puis on lance la compilation :</p><!--kg-card-begin: markdown--><pre><code class="language-bash"># -j d&#xE9;finit le nombre de threads utilis&#xE9;s pour la compilation 
# $(nproc) permet d&apos;obtenir le nombre de threads disponibles sur le CPU 
make -j&quot;$(nproc)&quot;
</code></pre>
<p>Si la compilation se d&#xE9;roule sans erreur, on peut alors installer tinc avec la commande :</p>
<pre><code class="language-bash">sudo make install
</code></pre>
<h3 id="ajoutdesservicessystemd">Ajout des services systemd</h3>
<p>La derni&#xE8;re &#xE9;tape pour terminer l&apos;installation est la cr&#xE9;ation des services systemd permettant d&apos;ex&#xE9;cuter Tinc et ses instances (r&#xE9;seaux priv&#xE9;s) d&#xE8;s le d&#xE9;marrage de la machine.<br>
Il faut en effet cr&#xE9;er deux services distincts, le premier permettant de g&#xE9;rer l&apos;ex&#xE9;cution de Tinc, et le second l&apos;ex&#xE9;cution des instances Tinc (sous le format tinc@nom_du_reseau).</p>
<h4 id="leservicetinc">Le service tinc</h4>
<p>Le fichier &#xE0; cr&#xE9;er est <code>/lib/systemd/system/tinc.service</code> dont le contenu est le suivant :</p>
<pre><code class="language-service"># This is a mostly empty service, but allows commands like stop, start, reload
# to propagate to all tinc@ service instances.
[Unit]
Description=Tinc VPN
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
ExecReload=/bin/true
WorkingDirectory=/etc/tinc

[Install]
WantedBy=multi-user.target
</code></pre>
<p>On peut ensuite activer le service via la commande :</p>
<pre><code class="language-bash">sudo systemctl enable tinc.service
</code></pre>
<h4 id="leservicepourlesinstancestinc">Le service pour les instances tinc@</h4>
<p>Le second service qui permet la gestion des instances Tinc est &#xE0; cr&#xE9;er dans <code>/lib/systemd/system/tinc@.service</code>, voici son contenu :</p>
<pre><code class="language-service">[Unit]
Description=Tinc net %i
PartOf=tinc.service
ReloadPropagatedFrom=tinc.service

[Service]
Type=simple
WorkingDirectory=/etc/tinc/%i
ExecStart=/usr/sbin/tincd -n %i -D
ExecReload=/usr/sbin/tincd -n %i -kHUP
KillMode=mixed
TimeoutStopSec=5
Restart=always
RestartSec=60

[Install]
WantedBy=tinc.service
</code></pre>
<p>Il permettra par la suite d&apos;activer s&#xE9;par&#xE9;ment les r&#xE9;seaux priv&#xE9;s (instances) Tinc via la commande :</p>
<pre><code class="language-bash">sudo systemctl enable tinc@nom_du_reseau
</code></pre>
<p>Il n&apos;est donc pas n&#xE9;cessaire d&apos;utiliser cette commande imm&#xE9;diatement, puisqu&apos;il faut tout d&apos;abord r&#xE9;aliser la configuration de notre r&#xE9;seau priv&#xE9;.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="configurertinc">Configurer Tinc</h2>
<h3 id="laconfigurationduneinstancetinc">La configuration d&apos;une instance Tinc</h3>
<p>L&apos;ensemble des fichiers de configuration de Tinc sont &#xE0; placer dans le r&#xE9;pertoire <code>/etc/tinc</code>, dans lequel la configuration de chaque instance se fera dans un r&#xE9;pertoire portant le nom de l&apos;instance.</p>
<p>Quelques informations sur la configuration utilis&#xE9;e pour notre exemple :</p>
<ul>
<li>notre instance/r&#xE9;seau priv&#xE9; se nomme <code>jesuisadmin_reseau</code>, sa configuration se trouve donc dans le r&#xE9;pertoire <code>/etc/tinc/jesuisadmin_reseau</code></li>
<li>nos 3 serveurs se nomment respectivement gfs1, gfs2 et rbpy.</li>
<li>Nous avons choisi d&apos;utiliser la plage d&apos;adresses 10.0.0.0/24 pour notre r&#xE9;seau priv&#xE9; Tinc</li>
</ul>
<p>Afin vous donner tout de suite une vue d&apos;ensemble de la configuration d&apos;un r&#xE9;seau priv&#xE9; avec Tinc, voici le r&#xE9;pertoire de configuration du r&#xE9;seau jesuisadmin_reseau, une fois toutes les &#xE9;tapes du tutoriel termin&#xE9;es :</p>
<pre><code class="language-bash">&#x251C;&#x2500;&#x2500; jesuisadmin_reseau
&#x2502;&#xA0;&#xA0; &#x251C;&#x2500;&#x2500; hosts
&#x2502;&#xA0;&#xA0; &#x2502;&#xA0;&#xA0; &#x251C;&#x2500;&#x2500; gfs1
&#x2502;&#xA0;&#xA0; &#x2502;&#xA0;&#xA0; &#x251C;&#x2500;&#x2500; gfs2
&#x2502;&#xA0;&#xA0; &#x2502;&#xA0;&#xA0; &#x2514;&#x2500;&#x2500; rbpy
&#x2502;&#xA0;&#xA0; &#x251C;&#x2500;&#x2500; rsa_key.priv
&#x2502;&#xA0;&#xA0; &#x251C;&#x2500;&#x2500; tinc-down
&#x2502;&#xA0;&#xA0; &#x251C;&#x2500;&#x2500; tinc-up
&#x2502;&#xA0;&#xA0; &#x2514;&#x2500;&#x2500; tinc.conf
</code></pre>
<p>On y retrouve :</p>
<ul>
<li><strong>tinc.conf</strong> : fichier de configuration principal qui contient notamment le nom de la machine, l&apos;interface r&#xE9;seau &#xE0; utiliser et le protocole de l&apos;instance (ipv4/ipv6).</li>
<li><strong>tinc-up</strong> et <strong>tinc-down</strong> : les scripts permettant de d&#xE9;marrer et d&apos;arr&#xEA;ter l&apos;instance Tinc</li>
<li><strong>rsa_key.priv</strong> : la cl&#xE9; priv&#xE9;e du serveur</li>
<li><strong>r&#xE9;pertoire hosts</strong> : le r&#xE9;pertoire qui contient les configurations partag&#xE9;es de chacun des noeuds connect&#xE9;s au r&#xE9;seau priv&#xE9;.</li>
</ul>
<p>Les &#xE9;tapes pour configurer nos 3 machines vont donc &#xEA;tre :</p>
<ol>
<li>R&#xE9;aliser la configuration initiale de chaque machine</li>
<li>G&#xE9;n&#xE9;rer les cl&#xE9;s publiques/priv&#xE9;es de chaque machine</li>
<li>Synchroniser le r&#xE9;pertoire hosts entre les machines</li>
</ol>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="configurationinitiale">Configuration initiale</h3>
<!--kg-card-end: markdown--><p>-- <strong>&#xC0; r&#xE9;aliser sur les 3 serveurs </strong>--</p><p>On commence donc par cr&#xE9;er le r&#xE9;pertoire `/etc/tinc/jesuisadmin_reseau` :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">mkdir -p /etc/tinc/jesuisadmin_reseau
</code></pre>
<!--kg-card-end: markdown--><p>Puis on cr&#xE9;er le fichier de configuration principal tinc.conf dans ce nouveau r&#xE9;pertoire : </p><!--kg-card-begin: markdown--><pre><code class="language-bash">nano /etc/tinc/jesuisadmin_reseau/tinc.conf
</code></pre>
<!--kg-card-end: markdown--><p>Dans lequel nous allons d&#xE9;finir la configuration de notre r&#xE9;seau priv&#xE9;, en commen&#xE7;ant par <strong>gfs1 </strong>: </p><!--kg-card-begin: markdown--><pre><code class="language-bash"># Interface r&#xE9;seau &#xE0; utiliser
Interface = tun0
# Identifiant de la machine sur le VPN
Name=gfs1
AddressFamily = ipv4
</code></pre>
<!--kg-card-end: markdown--><p>On r&#xE9;alise la m&#xEA;me op&#xE9;ration sur <strong>gfs2</strong>, avec une petite diff&#xE9;rence dans le fichier tinc.conf puisqu&apos;on y ajoute la directive `ConnectTo` : </p><!--kg-card-begin: markdown--><pre><code class="language-bash"># Interface r&#xE9;seau &#xE0; utiliser
Interface = tun0
# Identifiant de la machine sur le VPN
Name=gfs2
AddressFamily = ipv4
# sur le client
ConnectTo = gfs1
</code></pre>
<!--kg-card-end: markdown--><p>On termine par le troisi&#xE8;me serveur <strong>rbpy </strong>dont la configuration sera similaire &#xE0; gfs2 :</p><!--kg-card-begin: markdown--><pre><code class="language-bash"># Interface r&#xE9;seau &#xE0; utiliser
Interface = tun0
# Identifiant de la machine sur le VPN
Name=rbpy
AddressFamily = ipv4
# sur le client
ConnectTo = gfs2
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="gnrerlesclspubliquesprives">G&#xE9;n&#xE9;rer les cl&#xE9;s publiques/priv&#xE9;es</h3>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Pour pouvoir initier la connexion entre les diff&#xE9;rents serveurs, Tinc se base sur un &#xE9;change de cl&#xE9;s cryptographiques, sur le m&#xEA;me principe que les cl&#xE9;s SSH. Il faut donc cr&#xE9;er un r&#xE9;pertoire <code>hosts</code>  dans lequel nous allons d&#xE9;finir les adresses IP publiques et priv&#xE9;es de chacun des serveurs, ainsi que leurs cl&#xE9;s publiques.</p>
<!--kg-card-end: markdown--><p>On commence donc par cr&#xE9;er le r&#xE9;pertoire hosts :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">mkdir -p /etc/tinc/jesuisadmin_reseau/hosts
</code></pre>
<p>Avant de g&#xE9;n&#xE9;rer la cl&#xE9; publique et priv&#xE9;e d&apos;un serveur, en utilisant la commande :</p>
<pre><code class="language-bash">sudo tincd -n jesuisadmin_reseau -K4096
</code></pre>
<p>L&apos;argument <code>-K4096</code> d&#xE9;finit la taille de la cl&#xE9; RSA &#xE0; g&#xE9;n&#xE9;rer. Lors de l&apos;ex&#xE9;cution de cette commande, vous devriez obtenir deux nouveaux fichiers :</p>
<ul>
<li>la cl&#xE9; priv&#xE9;e du serveur <code>/etc/tinc/jesuisadmin_reseau/rsa_key.priv</code></li>
<li>la cl&#xE9; publique du serveur dans le fichier de configuration portant le nom de l&apos;h&#xF4;te :  <code>/etc/tinc/jesuisadmin_reseau/hosts/nom_du_serveur</code></li>
</ul>
<!--kg-card-end: markdown--><p>Dans ce dernier fichier, nous allons devoir ajouter avant la cl&#xE9; publique, l&apos;adresse publique et priv&#xE9;e de l&apos;h&#xF4;te. Il est &#xE9;galement possible d&apos;y ajouter d&apos;autres param&#xE8;tres, comme par exemple les ciphers &#xE0; utiliser pour la connexion. </p><!--kg-card-begin: markdown--><p>Voici un exemple de fichier de configuration pour le serveur gfs1 :</p>
<pre><code class="language-conf">Address = 5.9.XXX.XXX
Subnet = 10.0.0.1/32
Cipher=aes-256-cbc
Digest=sha256

-----BEGIN RSA PUBLIC KEY-----
MIICCgKCAgEApd4Gf48I1Cnvgb8Hw67yIWmlhoe9yiz80Fr1IF0gjjbDpzsZwkg+
6r7KaDIWmVdoSYiOlrutohH0105daS+YyJbTVP6heGYAlStVqMFL/rT2CbZvYEfe
F1l/PYtEGrbTRJDQgpwByXbmgvha2DcKBJFcfduH85FnYv7KzZ94vmYBwhZe8ArA
f/0XeEpR7fYfIdxN7Z5jS0olkd5mUyrpXVwkmbJ/9q3j5vuVMon9BLDAf1XP4oXn
ehRPLdh39XswFfF35rrxtLy03a+iPTZuhDBbVl2V/UVcVtyQHUNwTzrOvqBgYfaa
Q2L8hW6U/bvvOpj2NCN3YIm8cDR2NNScORXVSqm0xpTk+vCjETrOpBGR1z2JEWdT
3nPw+a7oAwfgCzSOvRx1MW+w1GqF+iil/ADQXcQa78i0xRIl/xCG0taI5EdUnRAq
7R5Y2kDtMt6LUdvOLPGpYFdIP859jTxSXSkkvWeEO7syuvVMdMLfBIGG1zczqQ6+
RLKCV+l0JwZpw4YEiJLHlzZQax3J7eBxlsv3gJoEWeuPZaPP/dUcREisqhrXLLT3
Jiq+aqMolbSzcXvRIGrcNVko4d82SStzpSJwehREhyDrgzOSMhEhTy7m/G3YvcGQ
v0F0bnuk1tqf6VUT9+MTBstaRTLEaRsc5RqI26lkCWwfO7c0WHkDLg0CAwEAAQ==
-----END RSA PUBLIC KEY-----
</code></pre>
<!--kg-card-end: markdown--><p>Dans lequel on retrouve les options : </p><ul><li><strong>Address </strong>est l&apos;IP publique du serveur</li><li><strong>Subnet </strong>est l&apos;IP priv&#xE9;e du serveur</li><li><strong>Cipher </strong>&amp; <strong>Digest </strong>les param&#xE8;tres TLS (facultatif)</li></ul><!--kg-card-begin: markdown--><h3 id="synchroniserlerpertoirehosts">Synchroniser le r&#xE9;pertoire hosts</h3>
<!--kg-card-end: markdown--><p>Une fois cette &#xE9;tape r&#xE9;alis&#xE9;e sur chacun des serveur, il faut &#xE9;galement proc&#xE9;der &#xE0; l&apos;&#xE9;change des cl&#xE9;s publiques entre les serveurs. Autrement dit, le contenu du r&#xE9;pertoire hosts doit &#xEA;tre le m&#xEA;me sur chaque serveur. Dans notre cas, on doit y retrouver trois fichiers configurations : &#xA0;gfs1, gfs2 et rpby. </p><p>Vous &#xEA;tes libre d&apos;utiliser la m&#xE9;thode de votre choix pour synchroniser le contenu du r&#xE9;pertoire hosts entre vos serveurs, voici quelques propositions pour &#xE9;changer les fichiers de configuration entre les serveur : </p><ul><li>Synchroniser le r&#xE9;pertoire avec rsync</li><li>Transf&#xE9;rer les fichiers avec scp</li><li>Utiliser un d&#xE9;p&#xF4;t git pour ajouter chaque serveur</li></ul><p>Une fois de r&#xE9;pertoire hosts synchronis&#xE9; entre les serveurs, il ne reste plus qu&apos;&#xE0; configurer les scripts d&apos;initialisation et d&apos;arr&#xEA;t de Tinc.</p><!--kg-card-begin: markdown--><h3 id="configurationdesexcutablestinc">Configuration des ex&#xE9;cutables Tinc</h3>
<!--kg-card-end: markdown--><p>La derni&#xE8;re &#xE9;tape avant de pouvoir connecter nos serveurs est la cr&#xE9;ation des scripts ex&#xE9;cutables de cr&#xE9;er et d&#xE9;marrer/arr&#xEA;ter l&apos;interface r&#xE9;seau virtuelle utilis&#xE9;e pour se connecter au r&#xE9;seau priv&#xE9;. Pour cela il faut cr&#xE9;er les fichiers tinc-up et tinc-down dans /etc/tinc/jesuisadmin_reseau dont voici le contenu pour gfs1 : </p><!--kg-card-begin: markdown--><p><strong>tinc-up</strong></p>
<pre><code class="language-bash">#!/bin/sh
# /etc/tinc/jesuisadmin_reseau/tinc-up 
ip addr add 10.0.0.1/24 dev $INTERFACE
ifconfig $INTERFACE up
</code></pre>
<p><strong>tinc-down</strong></p>
<pre><code class="language-bash">#!/bin/sh
# /etc/tinc/jesuisadmin_reseau/tinc-down
ifconfig $INTERFACE down
</code></pre>
<p>Sur les deux autres serveurs, le contenu des deux scripts sera quasiment le m&#xEA;me, puisque l&apos;unique diff&#xE9;rence sera l&apos;adresse IP de l&apos;interface r&#xE9;seau.</p>
<p>Une fois les deux fichiers cr&#xE9;&#xE9;s sur chacun des serveurs, il ne reste plus qu&apos;&#xE0; les rendre ex&#xE9;cutables :</p>
<pre><code class="language-bash">sudo chmod 755 /etc/tinc/jesuisadmin_reseau/tinc-*
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="dmarreretadministrertinc">D&#xE9;marrer et administrer Tinc</h2>
<h3 id="vrifierlaconfigurationduparefeu">V&#xE9;rifier la configuration du pare-feu</h3>
<p>Avant d&apos;initialiser la connexion entre les serveurs, il est important de faire une v&#xE9;rification : le port utilis&#xE9; par Tinc est-il ouvert ?<br>
Par d&#xE9;faut, Tinc utilise le port 655, qu&apos;il est donc n&#xE9;cessaire d&apos;ouvrir pr&#xE9;alablement. Si vous utilisez ufw, il vous suffit d&apos;utiliser la commande</p>
<pre><code class="language-bash">ufw allow 655
</code></pre>
<p>Mais vous pouvez &#xE9;galement le faire directement via iptables :</p>
<pre><code class="language-bash">iptables INPUT -p tcp --dport 655 -j ACCEPT
iptables INPUT -p udp --dport 655 -j ACCEPT
</code></pre>
<h3 id="dmarreretarrtertinc">D&#xE9;marrer et arr&#xEA;ter Tinc</h3>
<p>Si vous avez r&#xE9;ussi &#xE0; suivre toutes les &#xE9;tapes du tutoriel, vous &#xEA;tes enfin arriv&#xE9;s**** au bout du tunnel (meilleur jeu de mot de l&apos;ann&#xE9;e) puisque vous allez pouvoir initialiser votre r&#xE9;seau priv&#xE9; depuis votre premier noeud. Cela peut se faire directement via la commande <code>tincd</code> ou en utilisant un service systemd.</p>
<h4 id="avectincd">Avec tincd</h4>
<p><strong>d&#xE9;marrer le r&#xE9;seau jesuisadmin_reseau</strong></p>
<pre><code class="language-bash">sudo tincd -n jesuisadmin_reseau
</code></pre>
<p>Vous pouvez ensuite v&#xE9;rifier avec <code>ifconfig</code> ou <code>ip addr show</code> que la cr&#xE9;ation de l&apos;interface r&#xE9;seau <code>tun0</code> s&apos;est bien d&#xE9;roul&#xE9;e et que l&apos;adresse IP de cette derni&#xE8;re correspond bien &#xE0; votre configuration. Il ne reste plus qu&apos;&#xE0; tester le ping entre vos machines.</p>
<p>Un probl&#xE8;me de connexion ? Vous pouvez &#xE0; tout moment arr&#xEA;ter la connexion au r&#xE9;seau tinc avec la commande suivante :</p>
<p><strong>arr&#xEA;ter le r&#xE9;seau jesuisadmin_reseau</strong></p>
<pre><code class="language-bash">sudo tincd -n jesuisadmin_reseau -k
</code></pre>
<h4 id="avecunservicesystemd">Avec un service systemd</h4>
<p>Pour utiliser un service systemd, il faut tout d&apos;abord activer le service associ&#xE9; &#xE0; notre instance Tinc, ce qui se fait via la commande :</p>
<pre><code class="language-bash">sudo systemctl enable tinc@jesuisadmin_reseau
</code></pre>
<p>On peut ensuite d&#xE9;marrer le service via la commande :</p>
<pre><code class="language-bash">sudo service tinc@jesuisadmin_reseau start
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="etaprs">Et apr&#xE8;s ?</h2>
<!--kg-card-end: markdown--><p>Une fois la connexion entre les noeuds &#xE9;tablie, vous pouvez librement utiliser votre r&#xE9;seau priv&#xE9; pour faire transiter vos donn&#xE9;es entre les serveurs. </p><p>Il sera peut-&#xEA;tre n&#xE9;cessaire d&apos;autoriser le trafic depuis le sous-r&#xE9;seau utilis&#xE9; par Tinc via votre pare-feu. Dans le cas d&apos;UFW, cela se fait via la commande : </p><!--kg-card-begin: markdown--><pre><code class="language-bash">sudo ufw allow from 10.0.0.0/24
</code></pre>
<!--kg-card-end: markdown--><p>Enfin pour un usage derri&#xE8;re un NAT, il vous suffit d&apos;ajouter une redirection de port sur votre routeur/box pour pouvoir connecter votre serveur au r&#xE9;seau priv&#xE9;. </p>]]></content:encoded></item><item><title><![CDATA[Déployez vos machines virtuelles KVM sur Proxmox VE avec Cloud-Init]]></title><description><![CDATA[Dans ce tutoriel, nous allons voir comment déployer et configurer une machine virtuelle KVM avec Cloud-Init sur Proxmox VE 5.2]]></description><link>https://jesuisadmin.fr/deployer-des-machines-virtuelles-kvm/</link><guid isPermaLink="false">5c3f5221007fc1214a0a72f4</guid><category><![CDATA[Proxmox]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Tue, 04 Dec 2018 12:48:48 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2018/11/D-ployez-vos-machines-virtuelles-KVM-sur-Proxmox-avec-Cloud-Init--1-.png" medium="image"/><content:encoded><![CDATA[<img src="https://jesuisadmin.fr/content/images/2018/11/D-ployez-vos-machines-virtuelles-KVM-sur-Proxmox-avec-Cloud-Init--1-.png" alt="D&#xE9;ployez vos machines virtuelles KVM sur Proxmox VE avec Cloud-Init"><p>Apr&#xE8;s un <a href="https://jesuisadmin.fr/configuration-reseau-machine-virtuelle-kvm-proxmox/">premier article</a> expliquant comment configurer l&apos;interface r&#xE9;seau d&apos;une machine virtuelle KVM sur Proxmox VE en utilisant qemu-nbd, il &#xE9;tait n&#xE9;cessaire d&apos;y ajouter une seconde partie pour d&#xE9;tailler l&apos;une des nouvelles fonctionnalit&#xE9;s de Proxmox : le support de Cloud-Init (depuis la release 5.1). Dans ce tutoriel nous allons voir comment d&#xE9;ployer et configurer une machine virtuelle KVM avec Cloud-init.</p><!--kg-card-begin: markdown--><h2 id="questcequecloudinit">Qu&apos;est ce que Cloud-init ?</h2>
<!--kg-card-end: markdown--><p>Commen&#xE7;ons par une pr&#xE9;sentation de Cloud-Init. Il s&apos;agit d&apos;une application (ou package en anglais) multi-plateforme dont la fonction est de r&#xE9;aliser la configuration initiale des machines virtuelles (ou instances public cloud) d&#xE9;ploy&#xE9;es depuis des templates. </p><p>Les t&#xE2;ches g&#xE9;n&#xE9;ralement r&#xE9;alis&#xE9;es par Cloud-Init sont : </p><ul><li>D&#xE9;finir le hostname </li><li>G&#xE9;n&#xE9;rer les cl&#xE9;s priv&#xE9;es SSH </li><li>Configurer les interfaces r&#xE9;seaux</li><li>D&#xE9;finir le mot de passe de l&apos;utilisateur</li><li>Ajouter une cl&#xE9; SSH </li><li>Redimensionner le(s) disque(s) (si n&#xE9;cessaire)</li><li>Mettre &#xE0; jour les paquets via APT</li></ul><p>Dans le cas de Proxmox, Cloud-Init permet de configurer les machines virtuelles KVM aussi facilement que le containers LXC. Il n&apos;est plus n&#xE9;cessaire de se connecter via la console NoVNC pour configurer une machine virtuelle. </p><p>Cloud-Init est d&apos;autant plus pratique lorsqu&apos;il s&apos;agit de d&#xE9;ployer une machine virtuelle n&#xE9;cessitant une configuration r&#xE9;seau particuli&#xE8;re (comme une passerelle par d&#xE9;faut qui n&apos;est pas dans le m&#xEA;me sous-r&#xE9;seau que la machine virtuelle chez OVH).</p><!--kg-card-begin: markdown--><h2 id="dployerunemachinevirtuellekvmaveccloudinit">D&#xE9;ployer une machine virtuelle KVM avec Cloud-Init</h2>
<h3 id="creruntemplatedemachinevirtuelle">Cr&#xE9;er un template de machine virtuelle</h3>
<!--kg-card-end: markdown--><p>La premi&#xE8;re &#xE9;tape avant de pouvoir d&#xE9;ployer notre premi&#xE8;re machine virtuelle avec Cloud-Init est la cr&#xE9;ation d&apos;un template de VM, qui pourra &#xEA;tre clon&#xE9; pour d&#xE9;ployer une nouvelle VM. </p><p>&#xC0; l&apos;heure actuelle, il est d&#xE9;j&#xE0; possible d&apos;ajouter un disque Cloud-Init &#xE0; une machine virtuelle depuis l&apos;interface web de Proxmox, cependant l&apos;import d&apos;une image disque n&#xE9;cessite toujours l&apos;utilisation de la CLI de Proxmox.</p><p>Pour nous faire gagner du temps, Canonical met &#xE0; disposition des images minimales de machines virtuelles sur le site c<a href="http://cloud-images.ubuntu.com/">loud-images.ubuntu.com</a>. Cloud-Init est pr&#xE9;install&#xE9; sur l&apos;ensemble de ces images permettant un d&#xE9;ploiement automatis&#xE9;.</p><p>Ubuntu n&apos;est pas la seule distribution linux &#xE0; proposer des images cloud, vous pouvez &#xE9;galement t&#xE9;l&#xE9;charger des images <a href="http://cdimage.debian.org/cdimage/openstack/9.6.0/">Debian</a> ou <a href="https://cloud.centos.org/centos/7/images/">Centos</a>.</p><p>Dans notre exemple, nous allons utiliser l&apos;image Ubuntu Server 18.04 LTS Bionic.</p><p>Il est tout &#xE0; fait possible d&apos;installer une distribution linux depuis un ISO avant d&apos;installer Cloud-Init pour en faire un template. Il est cependant important de noter que le redimensionnement automatique de la partition root n&apos;est possible qu&apos;en l&apos;absence de partition swap (pratique courante sur les instances public cloud)</p><p>On se connecte donc en SSH &#xE0; notre h&#xF4;te Proxmox VE, et on commence par t&#xE9;l&#xE9;charger l&apos;image Ubuntu Server 18.04 LTS :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">wget -O bionic.img \
http://cloud-images.ubuntu.com/daily/server/bionic/current/bionic-server-cloudimg-amd64.img
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Pour simplifier l&apos;&#xE9;tape suivante, nous allons d&#xE9;finir l&apos;ID de notre VM Proxmox via une variable. <strong>Notre espace de stockage se nomme ici <code>local</code>, mais il g&#xE9;n&#xE9;ralement nomm&#xE9; <code>local-lvm</code> lorsque Proxmox est install&#xE9; depuis un ISO.</strong></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><pre><code class="language-bash"># on d&#xE9;finit l&apos;ID de la VM
ID_VM=1804

# Cr&#xE9;er une VM avec 2GB de RAM + une interface r&#xE9;seau connect&#xE9;e au bridge vmbr0   
qm create ${ID_VM} --memory 2048 --net0 virtio,bridge=vmbr0

# on importe l&apos;image de VM pr&#xE9;c&#xE9;demment t&#xE9;l&#xE9;charg&#xE9;e
qm importdisk ${ID_VM} bionic.img local

# on associe le nouveau disque virtuel &#xE0; la machine 
qm set ${ID_VM} --scsihw virtio-scsi-pci --scsi0 local:${ID_VM}/vm-${ID_VM}-disk-0.raw
</code></pre>
<!--kg-card-end: markdown--><p>Nous avons ainsi cr&#xE9;&#xE9; notre VM puis import&#xE9; l&apos;image disque t&#xE9;l&#xE9;charg&#xE9;e depuis cloud-images.ubuntu.com. Il ne nous reste plus qu&apos;&#xE0; configurer Cloud-Init. Pour cela nous allons ajouter un lecteur Cloud-Init qui permettra la configuration de la VM depuis Proxmox.</p><!--kg-card-begin: markdown--><pre><code class="language-bash"># ajouter un disque cloudinit
qm set ${ID_VM} --ide2 local:cloudinit

# d&#xE9;finir sur quel disque la VM doit booter
qm set ${ID_VM} --boot c --bootdisk scsi0

# ajout d&apos;une interface vga connect&#xE9;e au serial
qm set ${ID_VM} --serial0 socket --vga serial0
</code></pre>
<!--kg-card-end: markdown--><p>Voil&#xE0;, notre VM est pr&#xEA;te, on peut enfin la transformer en template avec la commande :</p><!--kg-card-begin: markdown--><pre><code class="language-bash"> # transformer la VM en template
 qm template ${ID_VM}
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="configurerunevmaveccloudinit">Configurer une VM avec Cloud-Init</h2>
<!--kg-card-end: markdown--><p>La configuration d&apos;une VM avec &#xA0;Cloud-Init peut se faire via la CLI de Proxmox ou via l&apos;interface web. Dans notre exemple, l&apos;ID de notre VM est 158 et son IP est 192.168.0.201.</p><!--kg-card-begin: markdown--><h3 id="configurationvialinterfaceweb">Configuration via l&apos;interface web</h3>
<!--kg-card-end: markdown--><p>On commence par cloner notre template afin de cr&#xE9;er une nouvelle machine virtuelle. On peut alors se diriger vers l&apos;onget &quot;Hardware&quot; de notre VM pour la redimensionner selon nos besoins (notamment le disque dont la taille est de 2.5Go par d&#xE9;faut) : </p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://jesuisadmin.fr/content/images/2018/12/prox.png" class="kg-image" alt="D&#xE9;ployez vos machines virtuelles KVM sur Proxmox VE avec Cloud-Init" loading="lazy"></figure><p>Efin, pour configurer notre VM via l&apos;interface web, il suffit d&apos;aller dans l&apos;onglet &quot;Cloud-Init&quot; pour acc&#xE9;der &#xE0; la liste des param&#xE8;tres disponibles : </p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://jesuisadmin.fr/content/images/2018/11/Screenshot_70.png" class="kg-image" alt="D&#xE9;ployez vos machines virtuelles KVM sur Proxmox VE avec Cloud-Init" loading="lazy"></figure><p>Parmi les param&#xE8;tres disponibles, on retrouve</p><ul><li>l&apos;utilisateur, qui est g&#xE9;n&#xE9;ralement le nom de la distribution linux choisie, autrement dit &quot;ubuntu&quot; dans notre cas.</li><li>le mot de passe de l&apos;utilisateur</li><li>les param&#xE8;tres DNS des fichier /etc/hosts et /etc/resolv.conf</li><li>une ou plusieurs cl&#xE9; SSH publiques </li><li>la configuration du l&apos;interface r&#xE9;seau</li></ul><p>On peut lorsqu&apos;on a termin&#xE9;, d&#xE9;marrer notre VM.</p><!--kg-card-begin: markdown--><h3 id="configurationvialacli">Configuration via la CLI</h3>
<p>Via la CLI, la d&#xE9;marche est relativement similaire puisqu&apos;on commence par cloner notre template de machine virtuelle :</p>
<pre><code class="language-bash">qm clone 1000 158 --name xenial
</code></pre>
<p>Pour redimensionner le disque, il suffit d&apos;utiliser :</p>
<pre><code class="language-bash">qm resize 158 scsi0 10G
</code></pre>
<p>On peut alors ajouter une cl&#xE9; SSH pour pouvoir se connecter &#xE0; la machine virtuelle, par exemple la cl&#xE9; publique de notre h&#xF4;te Proxmox :</p>
<pre><code class="language-bash">qm set 158 --sshkey ~/.ssh/id_rsa.pub
</code></pre>
<p>Et la derni&#xE8;re &#xE9;tape est la configuration de l&apos;interface r&#xE9;seau qui se fait via l&apos;argument <code>--ipconfig[x]</code> o&#xF9; <code>[x]</code> est le num&#xE9;ro de l&apos;interface r&#xE9;seau :</p>
<pre><code class="language-bash">qm set 158 --ipconfig0 ip=192.168.0.201/24,gw=192.168.0.1
</code></pre>
<p>Une fois la configuration termin&#xE9;e, on peut d&#xE9;marrer notre vm avec la commande :</p>
<pre><code class="language-bash">qm start 158
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="quelquesinformationscomplmentaires">Quelques informations compl&#xE9;mentaires</h2>
<!--kg-card-end: markdown--><p>Apr&#xE8;s quelques mois d&apos;utilisation, j&apos;ai eu l&apos;occasion d&apos;utiliser Cloud-Init dans un certain nombre de cas et j&apos;ai parfois remarqu&#xE9; des points qu&apos;il semble important de souligner. </p><p><strong>La configuration d&apos;IP fail-over chez OVH</strong></p><p>J&apos;ai longtemps cherch&#xE9; la solution pour configurer une IP fail-over OVH sur une VM Ubuntu 18.04 LTS qui utilise netplan pour la configuration de l&apos;interface r&#xE9;seau. &#xA0;Je l&apos;ai d&#xE9;couvert un peu par hasard, et je ne comprends toujours pas pourquoi cette configuration fonctionne.</p><p>Dans mon cas, je d&#xE9;finis l&apos;IP de la VM dans Cloud-Init, du type 178.XX.XX.XX/32 mais au lieu de d&#xE9;finir 54.XX.XX.254 en tant que passerelle (IP de l&apos;h&#xF4;te .254), je d&#xE9;finis simplement l&apos;IP de la VM en tant que passerelle. </p><p><strong>La configuration post-d&#xE9;ploiement </strong></p><p>Par d&#xE9;faut Cloud-Init mettra &#xE0; jour le fichier /etc/hosts, bloquera l&apos;acc&#xE8;s SSH en tant que root et mettra &#xE0; jour le hostname de la machine &#xE0; chaque d&#xE9;marrage de cette derni&#xE8;re. </p><p>Vous pouvez d&#xE9;sactiver ces actions en &#xE9;ditant le fichier /etc/cloud/cloud.cfg.</p>]]></content:encoded></item><item><title><![CDATA[Release Bell : ne ratez plus aucune publication de release sur Github]]></title><description><![CDATA[Dans ce tutoriel, nous allons voir comment installer l'application Release-Bell pour suivre les nouvelles releases sur Github sur un serveur Debian(8/9) ou Ubuntu (16.04 LTS/18.04 LTS). ]]></description><link>https://jesuisadmin.fr/ne-ratez-release-github-avec-release-bell/</link><guid isPermaLink="false">5c3f5221007fc1214a0a72fb</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[Self-hosting]]></category><category><![CDATA[Nginx]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Wed, 24 Oct 2018 04:42:09 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2018/09/release-bell-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jesuisadmin.fr/content/images/2018/09/release-bell-1.png" alt="Release Bell : ne ratez plus aucune publication de release sur Github"><p>Lorsqu&apos;on h&#xE9;berge un certain nombre d&apos;applications &quot;open-source&quot;, il <s>est</s> &#xE9;tait parfois difficile de suivre le flux de mises &#xE0; jour des applications. Il s&apos;agit heureusement d&apos;une &#xE9;poque r&#xE9;volue, gr&#xE2;ce &#xE0; l&apos;application Release Bell developp&#xE9;e par l&apos;&#xE9;quipe de <a href="https://cloudron.io">cloudron.io</a></p>
<!--kg-card-end: markdown--><p>Release-Bell est une application qui permet de recevoir une notification lorsqu&apos;une nouvelle release est publi&#xE9;e sur Github parmi la liste des d&#xE9;p&#xF4;ts que vous avez &quot;&#xE9;toil&#xE9;&quot;. Elle est &#xA0;disponible via la plateforme de self-hosting cloudron que j&apos;ai pr&#xE9;c&#xE9;dement pr&#xE9;sent&#xE9; dans un <a href="https://jesuisadmin.fr/cloudron-solution-self-hosting-facile/">article</a>, mais elle peut &#xE9;galement &#xEA;tre install&#xE9;e manuellement sur n&apos;importe quel serveur linux disposant de Nodejs et d&apos;un serveur MySQL.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://jesuisadmin.fr/content/images/2018/09/Screenshot_2018-09-16-Release-Bell.png" class="kg-image" alt="Release Bell : ne ratez plus aucune publication de release sur Github" loading="lazy"></figure><p>Les notifications sont envoy&#xE9;es par email, mais il n&apos;est absolument pas obligatoire d&apos;activer cette fonctionnalit&#xE9;. Dans mon cas, visualiser la liste des d&#xE9;p&#xF4;ts Github qui m&apos;int&#xE9;resse, sous la forme d&apos;un flux chronologique suivant la date de publication des releases est largement suffisant. </p><p>Dans ce tutoriel, nous allons voir comment installer l&apos;application Release-Bell sur un serveur Debian(8/9) ou Ubuntu (16.04 LTS/18.04 LTS). </p><!--kg-card-begin: markdown--><h2 id="lesprrequis">Les pr&#xE9;requis</h2>
<!--kg-card-end: markdown--><p>Comme je l&apos;ai dis pr&#xE9;c&#xE9;demment, pour installer Release-Bell, vous aurez besoin d&apos;un reverse-proxy (Nginx dans ce tutoriel), de NodeJS (dont la version LTS actuelle est 8.x) et d&apos;un serveur MySQL (ou MariaDB).</p><!--kg-card-begin: markdown--><h4 id="nginx">Nginx</h4>
<!--kg-card-end: markdown--><p>Pour l&apos;installation d&apos;Nginx, rien de plus simple, sur Ubuntu ou Debian suffit d&apos;utiliser :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">sudo apt-get update &amp;&amp; sudo apt-get install nginx -y
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h4 id="nodejs">NodeJS</h4>
<!--kg-card-end: markdown--><p>Pour NodeJS, c&apos;est &#xE9;galement relativement simple, puisqu&apos;il suffit d&apos;utiliser les commandes : </p><!--kg-card-begin: markdown--><pre><code class="language-bash">curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash 
sudo apt-get install -y nodejs
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h4 id="mariadb">MariaDB</h4>
<!--kg-card-end: markdown--><p>Enfin pour le serveur MySQL (MariaDB server 10.3 dans ce tutoriel) : </p><!--kg-card-begin: markdown--><pre><code class="language-bash"># ajout du d&#xE9;p&#xF4;t APT de MariaDB
sudo bash &lt;(wget -qO - https://downloads.mariadb.com/MariaDB/mariadb_repo_setup) --mariadb-server-version=10.3 --skip-maxscale -y

# installation de MariaDB
sudo apt-get update &amp;&amp; sudo apt-get install mariadb-server -y
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Je vous recommande de placer les identifiants root du serveur MariaDB dans un fichier .my.cnf plac&#xE9; dans votre home pour pouvoir vous connecter via la commande <code>mysql</code>, sans avoir &#xE0; copier/coller le mot de passe &#xE0; chaque op&#xE9;ration. Vous trouverez plus d&apos;informations sur le sujet dans cet <a href="https://kb.virtubox.net/fr/knowledgebase/connecter-mysql-fichier-my-cnf/">article de la KnowledgeBase de VirtuBox</a>.</p>
<!--kg-card-end: markdown--><p>Il vous faudra cr&#xE9;er une base de donn&#xE9;es avant de commencer l&apos;installation de Release-Bell. Pour cela connecter vous en tant que root &#xE0; votre serveur MariaDB :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">mysql
</code></pre>
<p>puis cr&#xE9;ez une nouvelle base de donn&#xE9;es :</p>
<pre><code class="language-mysql">CREATE DATABASE releasebell;
</code></pre>
<p>Ajouter ensuite un utilisateur avec les permissions n&#xE9;cessaires pour utiliser cette base de donn&#xE9;es :</p>
<pre><code class="language-mysql">GRANT ALL ON releasebell.* TO &apos;utilisateur_releasebell&apos;@&apos;localhost&apos; IDENTIFIED BY &apos;motdepasse&apos;;
</code></pre>
<p>Terminez en flushant les privil&#xE8;ges pour appliquer les modifications</p>
<pre><code class="language-mysql">FLUSH PRIVILEGES;
</code></pre>
<p>Puis quittez l&apos;interface en ligne de commande de MySQL :</p>
<pre><code class="language-mysql">EXIT;
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="installerreleasebell">Installer Release-Bell</h2>
<!--kg-card-end: markdown--><p>Certaines &#xE9;tapes de l&apos;installation de Release-Bell sont peut-&#xEA;tre incompl&#xE8;tes ou &#xA0;diff&#xE9;rentes de la m&#xE9;thode utilis&#xE9;e par Cloudron. La documentation disponible sur le d&#xE9;p&#xF4;t de l&apos;application &#xE9;tant minimaliste, j&apos;ai utilis&#xE9; les m&#xEA;mes &#xE9;tapes d&apos;installation que d&apos;autres applications NodeJS.</p><p>Pour installer Release-Bell, cr&#xE9;er un nouvel utilisateur, de pr&#xE9;f&#xE9;rence sans mot de passe ou login afin d&apos;&#xE9;viter un &#xE9;ventuel acc&#xE8;s non d&#xE9;sir&#xE9; via cet utilisateur : </p><!--kg-card-begin: markdown--><h4 id="miseenplacedelapplicationnodejs">Mise en place de l&apos;application NodeJS</h4>
<pre><code class="language-bash">adduser --disabled-password --disabled-login releasebell
</code></pre>
<p>Puis connecter vous en tant que cet utilisateur :</p>
<pre><code class="language-bash">sudo su - releasebell
</code></pre>
<p>Cr&#xE9;ez un r&#xE9;pertoire pour h&#xE9;berger l&apos;application :</p>
<pre><code class="language-bash">mkdir releasebell
</code></pre>
<p>Puis t&#xE9;l&#xE9;chargez l&apos;application avant de extraire de son archive :</p>
<pre><code class="language-bash">curl -L https://git.cloudron.io/cloudron/releasebell/-/archive/v1.1.0/releasebell-v1.1.0.tar.gz \
| tar zxf - --strip-components 1 -C ./releasebell
</code></pre>
<p>Allez dans le r&#xE9;pertoire de l&apos;application :</p>
<pre><code class="language-bash">cd releasebell
</code></pre>
<p>Et installer des d&#xE9;pendances NodeJS :</p>
<pre><code class="language-bash">npm install
</code></pre>
<h4 id="importationdelastructuredelabasededonnes">Importation de la structure de la base de donn&#xE9;es</h4>
<p>Le structure de la base de donn&#xE9;ees de releasebell est stock&#xE9;e dans le dossier <code>migrations</code> de l&apos;application. Pour l&apos;importer il suffit donc d&apos;utiliser :</p>
<pre><code class="language-bash">mysql -u utilisateur_releasebell -p releasebell &lt; migrations/initial-schema.sql 
</code></pre>
<h3 id="configurerreleasebell">Configurer Release-Bell</h3>
<p>La configuration de l&apos;application repose sur deux fichiers, il s&apos;agit de database.json utilis&#xE9; pour la configuration de la base de donn&#xE9;es MySQL, et users.json pour les identifiants des utilisateurs de l&apos;application.</p>
<p>Il faut tout d&apos;abord d&#xE9;finir les param&#xE8;tres d&apos;acc&#xE8;s &#xE0; la base de donn&#xE9;es dans le fichier database.json, qui doit ressembler &#xE0; l&apos;exemple suivant :</p>
<pre><code class="language-json">{
    &quot;defaultEnv&quot;: &quot;local&quot;,
    &quot;local&quot;: {
      &quot;host&quot;: &quot;localhost&quot;,
      &quot;user&quot;: &quot;utilisateur_releasebell&quot;,
      &quot;password&quot;: &quot;motdepasse&quot;,
      &quot;database&quot;: &quot;releasebell&quot;,
      &quot;driver&quot;: &quot;mysql&quot;,
      &quot;multipleStatements&quot;: true
    }
  }
</code></pre>
<p>S&apos;il n&apos;existe pas encore, cr&#xE9;ez le fichier users.json dont le contenu doit ressembler &#xE0; l&apos;exemple suivant :</p>
<pre><code class="language-json">[
    {
        &quot;username&quot;: &quot;votre_nom_dutilisateur&quot;,
        &quot;password&quot;: &quot;motdepasse&quot;,
        &quot;email&quot;: &quot;test@example.com&quot;
    }
]
</code></pre>
<p>La configuration de l&apos;application est d&#xE9;sormais termin&#xE9;e, l&apos;application peut-&#xEA;tre lanc&#xE9;e avec la commande :</p>
<pre><code class="language-bash">node index.js
</code></pre>
<h3 id="ajouterunservicesystemdpourreleasebell">Ajouter un service systemd pour Release-Bell</h3>
<p>Vous souhaitez peut-&#xEA;tre pouvoir utiliser l&apos;application sans avoir &#xE0; laisser un terminal ouvert ind&#xE9;finiment. Pour cela le plus simple sur Debian/Ubuntu est d&apos;ajouter un service systemd pour notre application. On y d&#xE9;finira notamment certaines variables n&#xE9;cessaires &#xE0; la configuration de l&apos;application.</p>
<p>Pour ajouter un service, nous allons cr&#xE9;er un ficher .service dans la r&#xE9;pertoire <code>/lib/systemd/system/</code></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><pre><code class="language-bash">sudo nano /lib/systemd/system/release_bell.service
</code></pre>
<p>Le contenu de ce ficher de configuration doit ressembler &#xE0; ceci (il vous faudra l&apos;adapter avec vos informations) :</p>
<pre><code class="language-bash">[Unit]
Description=ReleaseBell

[Service]
Type=simple
WorkingDirectory=/home/utilisateur_releasebell/releasebell
User=utilisateur_releasebell
Environment=&quot;NODE_ENV=production&quot;
Environment=&quot;MAIL_SMTP_SERVER=smtp.example.com&quot;
Environment=&quot;MAIL_SMTP_PORT=25&quot;
Environment=&quot;MAIL_SMTP_USERNAME=releasebell@example.com&quot;
Environment=&quot;MAIL_SMTP_PASSWORD=MotdepasseSMTP&quot;
Environment=&quot;MAIL_FROM=releasebell@example.com&quot;
Environment=&quot;MAIL_DOMAIN=example.com&quot;
Environment=&quot;APP_ORIGIN=example.com&quot;
ExecStart=/usr/bin/node index.js
Restart=always

[Install]
WantedBy=multi-user.target
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Activez le service release_bell avec la commande :</p>
<pre><code class="language-bash">sudo systemctl enable release_bell.service
</code></pre>
<p>Vous pouvez enfin d&#xE9;marrer le service avec la commande :</p>
<pre><code class="language-bash">sudo service release_bell start
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="configurernginx">Configurer Nginx</h2>
<p>Pour terminer ce tutoriel, voici un exemple de configuration pour utiliser Nginx en tant que reverse-proxy pour notre application :</p>
<pre><code class="language-nginx">server {


    server_name release.yourdomain.tld


    access_log /var/log/nginx/release.yourdomain.tld.access.log rt_cache;
    error_log /var/log/nginx/release.yourdomain.tld.error.log;


       location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_redirect      off;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}
</code></pre>
<p>Je ne vais pas m&apos;&#xE9;tendre sur cette partie de la configuration, mais je vous invite &#xE0; jeter un oeil &#xE0; mon article <a href="https://kb.virtubox.net/fr/knowledgebase/installer-un-certificat-ssl-lets-encrypt-avec-acme-sh/">Installer un certificat SSL Let&apos;s Encrypt avec acme.sh</a> si vous souhaitez g&#xE9;n&#xE9;rer un certificat SSL pour s&#xE9;curiser l&apos;acc&#xE8;s &#xE0; l&apos;application Release-Bell.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Comment convertir vos images en WebP et les afficher avec Nginx]]></title><description><![CDATA[Dans ce tutoriel, nous allons voir comment convertir vos images en WebP et comment configurer Nginx pour servir automatiquement la version WebP]]></description><link>https://jesuisadmin.fr/convertir-vos-images-en-webp-nginx/</link><guid isPermaLink="false">5c3f5221007fc1214a0a72f8</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[Self-hosting]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Fri, 10 Aug 2018 07:06:32 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2018/07/WebP-min.png" medium="image"/><content:encoded><![CDATA[<img src="https://jesuisadmin.fr/content/images/2018/07/WebP-min.png" alt="Comment convertir vos images en WebP et les afficher avec Nginx"><p>Dans ce tutoriel, nous allons voir comment convertir vos images en WebP, sans avoir recours &#xE0; des plugins dans vos CMS, et comment configurer Nginx pour servir automatiquement la version WebP d&apos;une image &#xE0; condition qu&apos;elle existe et que le format soit support&#xE9; par le navigateur du visiteur.</p><p>WebP est un format d&apos;image open-source d&#xE9;velopp&#xE9; par Google en 2010, bas&#xE9; sur un autre format de fichiers &#xE9;galement d&#xE9;velopp&#xE9; par Google, le VP8. </p><h2 id="le-format-webp-par-rapport-aux-autres-formats">Le format WebP par rapport aux autres formats </h2><p>Selon Google, le niveau de compression du format WebP permet d&apos;obtenir des images 26% plus l&#xE9;g&#xE8;res que le PNG et jusqu&apos;&#xE0; 34% plus l&#xE9;g&#xE8;res que le JPG. &#xA0;Il faut savoir que le WebP supporte la transparence (canal alpha), mais &#xE9;galement les animations (GIF). </p><p>Cependant, les chiffres annonc&#xE9;s par Google n&apos;ont pas convaincu tout le monde. C&apos;est notamment le cas de la fondation Mozilla, qui estime que les gains du WebP en compression ne sont pas aussi &#xE9;lev&#xE9;s et qui remet surtout en cause les protocoles de test utilis&#xE9;s par Google pour obtenir ces r&#xE9;sultats. </p><p><strong>Mise &#xE0; jour du 29/01/2019</strong> : Mozilla FireFox supporte officiellement les images au format WebP avec la mise &#xE0; jour publi&#xE9;e aujourd&apos;hui (version 65.0). &#xA0;Les seuls navigateurs modernes qui ne supportent pas le format WebP sont Edge et Safari. </p><p>Ce qui nous am&#xE8;ne &#xE0; un point qu&apos;il est important &#xA0;de souligner : tous les navigateurs web ne supportent pas le WebP. Ce qui induit qu&apos;il est actuellement impossible d&apos;utiliser uniquement des images au format WebP sur un site (du moins, pas sans impacter certains visiteurs) et qu&apos;il est n&#xE9;cessaire de configurer son serveur web pour servir la version WebP d&apos;une image, seulement si le navigateur du visiteur le supporte.</p><!--kg-card-begin: markdown--><h3 id="compatibilitetgains">Compatibilit&#xE9; et gains</h3>
<!--kg-card-end: markdown--><p>On peut alors se poser la question, cela vaut-il le co&#xFB;t de supporter le format WebP pour un site web ? Pour y r&#xE9;pondre, il faudrait savoir si la majorit&#xE9; des internautes utilise un navigateur qui supporte le WebP. Il est heureusement assez facile d&apos;obtenir la r&#xE9;ponse, gr&#xE2;ce au site <a href="https://caniuse.com/#search=webp*">caniuse.com</a>, dont voici les r&#xE9;sultats : </p><!--kg-card-begin: markdown--><script src="https://cdn.jsdelivr.net/gh/ireade/caniuse-embed/caniuse-embed.min.js"></script>
<p class="ciu_embed" data-feature="webp" data-periods="future_1,current,past_1,past_2" data-accessible-colours="false">
  <a href="http://caniuse.com/#feat=webp">Can I Use webp?</a> </p><!--kg-card-end: markdown--><p>En se basant sur les parts de march&#xE9; de chaque navigateur, le site estime que 73% des internautes utilisent un navigateur qui supporte le WebP. Ce qui semble tout &#xE0; fait plausible &#xE9;tant donn&#xE9; la popularit&#xE9; du navigateur Google Chrome.</p><p><strong>Et le niveau compression dans tout &#xE7;a ? Est ce que le format WebP permet vraiment d&apos;obtenir des images plus l&#xE9;g&#xE8;res ? </strong></p><p>D&apos;apr&#xE8;s les tests que j&apos;ai r&#xE9;alis&#xE9; sur mes sites, la r&#xE9;ponse est <strong>OUI</strong>. Qu&apos;il s&apos;agisse de convertir une image au format JPEG ou au format PNG, la version WebP est plus l&#xE9;g&#xE8;re m&#xEA;me s&apos;il ne s&apos;agit parfois que de quelques kilo-octets. Quelques exemples sur les images du blog : </p><!--kg-card-begin: markdown--><p>| Image | Original | WebP |<br>
| -------- | -------- | -------- | -------- |<br>
| MariaDB-10.3-1.jpg     | 52Ko     | 32Ko     |<br>
| background-869581.png    | 52Ko   | 36Ko     |<br>
| cloudflare-origin.png    | 492Ko   | 344Ko     |<br>
| library-898333_1920-1.jpg    | 348Ko   | 228Ko     |</p>
<p>La conversion a &#xE9;t&#xE9; effectu&#xE9;e en mode lossless pour les images PNG , avec l&apos;argument (-z 9) et avec un indice de qualit&#xE9; de 82 pour les images JPEG, avec l&apos;argument (-q 82).</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="installercwebppourconvertirlesimages">Installer cwebp pour convertir les images</h2>
<!--kg-card-end: markdown--><p>Cwebp est l&apos;utilitaire en ligne de commande qui permet de convertir les images au format WebP. Cwebp est inclus dans le paquet webp disponible depuis les d&#xE9;p&#xF4;ts APT ou YUM, mais &#xE9;galement dans le paquet libwebp qu&apos;il est possible de compiler depuis les sources.</p><!--kg-card-begin: markdown--><h3 id="depuislesdptsaptouyum">Depuis les d&#xE9;p&#xF4;ts APT ou YUM</h3>
<!--kg-card-end: markdown--><p>Sous Debian/Ubuntu, vous pouvez installer cwebp avec : </p><!--kg-card-begin: markdown--><pre><code class="language-bash">sudo apt install webp -y
</code></pre>
<!--kg-card-end: markdown--><p>Sous Centos 7, vous pouvez installer cwebp avec :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">sudo yum install libwebp-tools -y
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="depuislessourcesdelibwebp">Depuis les sources de libwebp</h3>
<!--kg-card-end: markdown--><p>Si vous souhaitez installer la derni&#xE8;re version du paquet cwebp (actuellement en v1.0.2) plut&#xF4;t qu&apos;utiliser la version disponible sur les d&#xE9;p&#xF4;ts APT et YUM (version 0.6.0 sur Ubuntu 18.04 LTS), vous pouvez t&#xE9;l&#xE9;charger les sources de libwebp depuis <a href="https://storage.googleapis.com/downloads.webmproject.org/releases/webp/index.html">le d&#xE9;p&#xF4;t Google</a></p><p>Mise &#xE0; jour du 17/08/2019 : Je propose d&#xE9;sormais un script pour automatiquement compiler la derni&#xE8;re version de libwebp : </p><pre><code class="language-bash">curl -sL git.io/fjdd6 | sudo -E bash</code></pre><p>Le script est disponible sur Github : <a href="https://github.com/VirtuBox/img-optimize/blob/master/scripts/install-webp.sh">https://github.com/VirtuBox/img-optimize/blob/master/scripts/install-webp.sh</a></p><p>Pour cela, il faut tout d&apos;abord installer les pr&#xE9;-requis &#xE0; la compilation : </p><!--kg-card-begin: markdown--><pre><code class="language-bash">sudo apt-get install build-essential libjpeg-dev libpng-dev libtiff-dev libgif-dev libwebp-dev -y
</code></pre>
<!--kg-card-end: markdown--><p>Vous pouvez ensuite t&#xE9;l&#xE9;charger les sources de libwebp et les extraire</p><!--kg-card-begin: markdown--><pre><code class="language-bash">curl -sL https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.0.2.tar.gz | tar zxf - -C /usr/local/src
cd /usr/local/src/libwebp-*
</code></pre>
<!--kg-card-end: markdown--><p>Il ne reste plus qu&apos;&#xE0; configurer libwebp avant la compilation et l&apos;installation</p><!--kg-card-begin: markdown--><pre><code class="language-bash">./configure --prefix=/usr
make -j &quot;$(nproc)&quot;
sudo make install
</code></pre>
<!--kg-card-end: markdown--><h2 id="vous-pouvez-ensuite-v-rifier-si-vous-utilisez-la-version-compil-de-cwebp-avec-la-commande">Vous pouvez ensuite v&#xE9;rifier si vous utilisez la version compil&#xE9; de cwebp avec la commande </h2><!--kg-card-begin: markdown--><pre><code class="language-bash">which cwebp
</code></pre>
<p>Qui vous retournera normalement <code>/usr/local/bin/cwebp</code></p>
<!--kg-card-end: markdown--><h2 id="la-conversion-des-images-en-webp">La conversion des images en WebP</h2><!--kg-card-begin: markdown--><h3 id="convertiruneimageenwebpaveccwebp">Convertir une image en WebP avec cwebp</h3>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>La conversion d&apos;une image avec cwebp est on ne peut plus simple puisqu&apos;il suffit de d&#xE9;finir l&apos;image &#xE0; convertir, suivie de l&apos;argument <code>-o</code> permettant de d&#xE9;finir le nom du fichier en sortie.</p>
<p>Exemple :</p>
<pre><code class="language-bash">cwebp monimage.png -o monimage.webp
</code></pre>
<p>Il est ensuite  possible de d&apos;ajouter des param&#xE8;tres de conversion en passant par des arguments apr&#xE8;s la commande <code>cwebp</code></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Voici les param&#xE8;tres principaux &#xE0; utiliser en arguments avec cwebp  :</p>
<ul>
<li><code>-lossless</code> : pour encoder les images sans pertes (PNG)</li>
<li><code>-q</code> : Est un indice de qualit&#xE9;, similaire au niveau de qualit&#xE9; des images JPEG.</li>
<li><code>-z</code> : Est un indice de compression en mode lossless, allant de 0 &#xE0; 9, o&#xF9; 9 est le niveau le plus haut, cela n&#xE9;cessite un temps de conversion plus long mais permet d&apos;obtenir un fichier plus l&#xE9;ger en sortie</li>
<li><code>-mt</code> : utiliser le multi-threading si possible</li>
</ul>
<p>Ces param&#xE8;tres sont tr&#xE8;s important pour la conversion en WebP, car l&apos;utilisation d&apos;un argument inadapt&#xE9; au type d&apos;image peut rendre le fichier WebP plus lourd que le fichier original.</p>
<p>Pour les images JPEG, il faut privil&#xE9;gier l&apos;usage de l&apos;indice de qualit&#xE9; <code>-q</code>.<br>
Pour les images PNG, le plus simple est d&apos;utiliser <code>-z</code> pour d&#xE9;finir le niveau de compression en mode lossless.</p>
<!--kg-card-end: markdown--><p>La liste compl&#xE8;te des options est disponible sur le site <a href="https://developers.google.com/speed/webp/docs/cwebp#options">developers.google.com</a>.</p><!--kg-card-begin: markdown--><h3 id="convertirtouteslesimagesdevotresiteenwebp">Convertir toutes les images de votre site en WebP</h3>
<!--kg-card-end: markdown--><p>Apr&#xE8;s avoir vu comment convertir une image au format WebP en utilisant cwebp, nous allons aller un peu plus loin en appliquant cette m&#xE9;thode pour convertir toutes les images d&apos;un site web. </p><p>Pour cela, il nous faut tout d&apos;abord lister les images au format JPEG et PNG pr&#xE9;sentes dans le r&#xE9;pertoire images de notre site, avant de les convertir au format WebP. L&apos;objectif du tutoriel &#xE9;tant de pouvoir servir les images WebP avec Nginx, il est important de d&#xE9;finir la structure que nous allons utiliser pour nommer les images WebP par rapport &#xE0; la version originale de l&apos;image.</p><p>Voici la structure que nous allons utiliser pour nommer les fichiers WebP :</p><!--kg-card-begin: markdown--><pre><code class="language-bash"># une image png
monimage.png -&gt; monimage.png.webp

# une image jpg
monimage.jpg -&gt; monimage.jpg.webp
</code></pre>
<!--kg-card-end: markdown--><p><strong>Pourquoi nommer les images converties ainsi ?</strong></p><p>Car cette structure va nous permettre d&apos;utiliser la directive Nginx `try_files`. Ainsi Nginx pourra v&#xE9;rifier l&apos;existence du fichier WebP par rapport &#xE0; l&apos;image originale.</p><!--kg-card-begin: markdown--><h4 id="listerlesimagespngjpgdansunrpertoire">Lister les images PNG &amp; JPG dans un r&#xE9;pertoire</h4>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Pour obtenir r&#xE9;cursivement, la liste des images PNG et JPG pr&#xE9;sentes dans un r&#xE9;pertoire, nous allons utiliser la commande <code>find</code>. Petite particularit&#xE9; pour les images au format JPEG, l&apos;extension du fichier peut-&#xEA;tre <code>.jpg</code> ou <code>.jpeg</code>.</p>
<p>On se rend dans le r&#xE9;pertoire qui contient les images</p>
<pre><code class="language-bash">cd /votre/r&#xE9;pertoire/images
</code></pre>
<p>lister les images JPEG</p>
<pre><code class="language-bash">find . -type f \( -iname &quot;*.jpg&quot; -o -iname &quot;*.jpeg&quot; \)
</code></pre>
<p>lister les images PNG</p>
<pre><code class="language-bash">find . -type f -iname &apos;*.png&apos;
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h4 id="convertirlesimagesenwebpconditionnellement">Convertir les images en WebP conditionnellement</h4>
<!--kg-card-end: markdown--><p>Maintenant que nous sommes capables de lister les images PNG et JPG dans un r&#xE9;pertoire, nous souhaitons pouvoir les convertir en WebP. Cependant nous ne voulons pas convertir une seconde fois des images d&#xE9;j&#xE0; converties en WebP.</p><p>Nous allons donc proc&#xE9;der en deux &#xE9;tapes : </p><ol><li> lister les images PNG &amp; JPG</li><li>si la version WebP des images n&apos;existe pas, les convertir en WebP</li></ol><p>Ce qui nous donne &#xA0;: </p><!--kg-card-begin: markdown--><p>Convertir les images PNG</p>
<pre><code class="language-bash">find . -type f -iname &quot;*.png&quot; -print0 | xargs -0 -I {} \
bash -c &apos;[ ! -f &quot;{}.webp&quot; ] &amp;&amp; { cwebp -z 9 -mt {} -o {}.webp; }&apos;
</code></pre>
<p>convertir les images JPG</p>
<pre><code class="language-bash">find . -type f \( -iname &quot;*.jpg&quot; -o -iname &quot;*.jpeg&quot; \) -print0 | xargs -0 -I {} \
bash -c &apos;[ ! -f &quot;{}.webp&quot; ] &amp;&amp; { cwebp -q 82 -mt {} -o {}.webp; }&apos;
</code></pre>
<!--kg-card-end: markdown--><p>D&#xE9;taillons un peu notre exemple : </p><!--kg-card-begin: markdown--><p>On utilise tout d&apos;abord <code>find</code> pour obtenir la liste des images PNG ou JPG dans un r&#xE9;pertoire, suivi de l&apos;argument <code>-print0</code> qui permet de transmettre le nom des fichiers &#xE0; <code>xargs</code> m&#xEA;me s&apos;ils contiennent des caract&#xE8;res sp&#xE9;ciaux</p>
<p>On utilise ensuite un pipe <code>|</code> pour connecter cette premi&#xE8;re commande et r&#xE9;cup&#xE9;rer sa sortie standard avec <code>xargs</code>.</p>
<p>Gr&#xE2;ce &#xE0; <code>xargs -0</code> nous sommes capables de r&#xE9;cup&#xE9;rer les r&#xE9;sultats obtenu avec <code>find</code> et de les passer en tant qu&apos;argument &#xE0; la seconde partie de la commande.</p>
<p>Enfin on utilise <code>bash -c</code> pour invoquer un shell et traiter notre conversion conditionnelle en WebP. Si vous souhaitez en savoir plus, je vous conseille de lire <a href="https://en.wikipedia.org/wiki/Xargs">l&apos;article de Wikip&#xE9;dia sur xargs</a>.</p>
<p>Dans le shell invoqu&#xE9;, on cr&#xE9;er la condition &quot;si le fichier monimage.jpg.webp n&apos;existe pas, alors utiliser cwebp&quot; :</p>
<pre><code class="language-bash">[ ! -f &quot;{}.webp&quot; ] &amp;&amp; { cwebp -q 82 -mt {} -o {}.webp; }
</code></pre>
<!--kg-card-end: markdown--><h2 id="img-optimize-un-script-pour-optimiser-et-convertir-vos-images-en-webp">Img-optimize - Un Script pour optimiser et convertir vos images en Webp</h2><!--kg-card-begin: markdown--><p>Malgr&#xE9; que la conversion des images en WebP ne soit pas r&#xE9;ellement difficile avec <code>cwebp</code>, j&apos;ai publi&#xE9; <a href="https://virtubox.github.io/img-optimize/">img-optimize</a> sur Github, un script bash qui permet de r&#xE9;aliser la conversion de vos images en WebP mais &#xE9;galement l&apos;optimisation des images au format JPG et PNG, en ajoutant simplement le r&#xE9;pertoire qui contient les images en argument.</p>
<p>Pour utiliser le script il vous suffit de clone le d&#xE9;pot :</p>
<pre><code class="language-bash">git clone https://github.com/VirtuBox/img-optimize.git $HOME/.img-optimize
</code></pre>
<p>Puis d&apos;ajouter un alias via le fichier .bashrc</p>
<pre><code class="language-bash">echo &quot;alias img-optimize=$HOME/.img-optimize/optimize.sh&quot; &gt;&gt; $HOME/.bashrc
source $HOME/.bashrc
</code></pre>
<p>Vous pouvez ensuite optimiser et convertir les images pr&#xE9;sentes dans un r&#xE9;pertoire avec :</p>
<pre><code class="language-bash">img-optimize /dossier/des/images
</code></pre>
<p>Le script supporte &#xE9;galement les arguments suivants :</p>
<pre><code class="language-bash">Bash script to optimize your images and convert them in WebP
Usage: img-optimize [options] &lt;images path&gt;
If images path isn&apos;t defined, img-optimize will use the current directory
  Options:
       --jpg &lt;images path&gt; ..... optimize all jpg images
       --png &lt;images path&gt; ..... optimize all png images
       --webp &lt;images path&gt; ..... convert all images in webp
       --nowebp &lt;images path&gt; ..... optimize all png &amp; jpg images
       --all &lt;images path&gt; ..... optimize all images (png + jpg + webp)
       -i, --interactive ..... run img-optimize in interactive mode
       -q, --quiet ..... run image optimization quietly
 Other options :
       -h, --help, help ... displays this help information
Examples:
  optimize all jpg images in /var/www/images
    img-optimize --jpg /var/www/images
</code></pre>
<!--kg-card-end: markdown--><h2 id="afficher-les-images-webp-avec-nginx">Afficher les images WebP avec Nginx</h2><p>Il nous faut ensuite configurer Nginx pour afficher les images en WebP, mais avec plusieurs conditions :</p><ol><li>Il faut que la navigateur du visiteur supporte le format WebP</li><li>Il faut que la version WebP de l&apos;image existe</li></ol><!--kg-card-begin: markdown--><h3 id="dtectersiunnavigateursupporteleformatwebp">D&#xE9;tecter si un navigateur supporte le format WebP</h3>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Pour la premi&#xE8;re condition, il est assez facile de d&#xE9;tecter si un navigateur supporte le WebP avec Nginx, puisque cette informations est transmise par la navigateur via les &quot;Requests Headers&quot;.<br>
Sur un navigateur compatible comme Google Chrome, on y retrouve la ligne :</p>
<pre><code>Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
</code></pre>
<p>O&#xF9; l&apos;on retrouve bien <code>image/webp</code>. Contrairement &#xE0; un navigateur comme Firefox qui ne supporte pas le format WebP :</p>
<pre><code>Accept : text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
</code></pre>
<h3 id="dfinirlextensionutiliseravecladirectivemap">D&#xE9;finir l&apos;extension &#xE0; utiliser avec la directive map</h3>
<p>La directive <code>map</code> de Nginx est particuli&#xE8;rement int&#xE9;ressante, puisqu&apos;elle permet d&apos;associer des valeurs &#xE0; plusieurs variables, sans avoir recours au <code>if</code>.</p>
<p>Dans notre cas, nous allons associer la variable <code>$http_accept</code> qui fait partie des &quot;Requests Headers&quot; avec l&apos;extension de nos images, variable que j&apos;ai nomm&#xE9; <code>$webp_suffix</code>.<br>
Nous allons cr&#xE9;er un fichier webp.conf dans <code>/etc/nginx/conf.d</code> dans lequel nous allons placer notre directive map  :</p>
<pre><code class="language-nginx">map $http_accept $webp_suffix {
    default &quot;&quot;;
    &quot;~*webp&quot; &quot;.webp&quot;;
}
</code></pre>
<p>On d&#xE9;finit ici la valeur de la variable <code>$webp_suffix</code> en fonction du contenu de la variable <code>$http_accept</code>. Par d&#xE9;fault, <code>$webp_suffix</code> est nulle, mais lorsque <code>$http_accept</code> contient le mot &quot;webp&quot;, alors $webp_suffix est &#xE9;gale &#xE0; &quot;.webp&quot;.</p>
<h3 id="servirsousconditionslesversionswebpdesimages">Servir sous conditions les versions WebP des images</h3>
<p>Pour servir une image au format WebP, les deux conditions sont :</p>
<ul>
<li>que le navigateur accepte les format WebP</li>
<li>que la version WebP de l&apos;image existe</li>
</ul>
<p>Pour cela nous allons utiliser notre variable <code>$webp_suffix</code> associ&#xE9;e &#xE0; la directive <code>try_files</code> qui permet &#xE0; Nginx de v&#xE9;rifier si un fichier existe.</p>
<p>On commence donc par cr&#xE9;er un bloc location pour s&#xE9;lectionner les images PNG &amp; JPG :</p>
<pre><code class="language-nginx">location ~ \.(png|jpe?g)$ {}
</code></pre>
<p>Dans ce bloc, nous allons ajouter plusieurs directives :</p>
<ul>
<li><code>add_header Vary &quot;Accept-Encoding&quot;;</code> : permet d&apos;annoncer qu&apos;il peut exister plusieurs versions du m&#xEA;me fichier selon les Requests Headers transmis.</li>
<li><code>add_header &quot;Access-Control-Allow-Origin&quot; &quot;*&quot;;</code> : active les Cross-Origin Resource Sharing (CORS)</li>
<li><code> try_files $uri$webp_suffix $uri =404;</code> : demande &#xE0; Nginx d&apos;essayer l&apos;url de l&apos;image suivi de notre variable $webp_suffix, et de v&#xE9;rifier que le fichier existe bien.</li>
</ul>
<p>On obtient alors :</p>
<pre><code class="language-nginx">location ~ \.(png|jpe?g)$ {
    add_header Vary &quot;Accept-Encoding&quot;;
    add_header &quot;Access-Control-Allow-Origin&quot; &quot;*&quot;;
    try_files $uri$webp_suffix $uri =404;
}
</code></pre>
<p>Auquel, on peut ajouter quelques options suppl&#xE9;mentaires :</p>
<ul>
<li><code>add_header Cache-Control &quot;public, no-transform&quot;;</code> : pour d&#xE9;finir le cache comme public et demander aux &#xE9;ventuels proxy de ne pas le modifier</li>
<li><code>access_log off;</code> : pour d&#xE9;sactiver les logs d&apos;acc&#xE8;s</li>
<li><code>log_not_found off;</code> : d&#xE9;sactive les logs d&apos;erreurs en cas de fichier introuvable</li>
<li><code>expires max;</code> : d&#xE9;finit la dur&#xE9;e autoris&#xE9;e de cache par les navigateurs, le plus longtemps possible puisqu&apos;il s&apos;agit d&apos;images.</li>
</ul>
<p>Le dernier point important, est de bien d&#xE9;finir le r&#xE9;pertoire dans lequel nous allons  demander &#xE0; Nginx de servir des images WebP, plut&#xF4;t que d&apos;appliquer cela &#xE0; l&apos;ensemble d&apos;un site.</p>
<p>Voici un exemple complet &#xE0; inclure dans un vhost pour WordPress :</p>
<pre><code class="language-nginx">location /wp-content/uploads/ {
   location ~ \.(png|jpe?g)$ {
       add_header Vary &quot;Accept-Encoding&quot;;
       add_header &quot;Access-Control-Allow-Origin&quot; &quot;*&quot;;
       add_header Cache-Control &quot;public, no-transform&quot;;
       access_log off;
       log_not_found off;
       expires max;
       try_files $uri$webp_suffix $uri =404;
   }
}
</code></pre>
<p>Et un autre exemple pour Ghost :</p>
<pre><code class="language-nginx">location /content/images {
    alias /var/www/votredomaine.tld/content/images;
    location ~ \.(png|jpe?g)$ {
        add_header Vary &quot;Accept-Encoding&quot;;
        add_header &quot;Access-Control-Allow-Origin&quot; &quot;*&quot;;
        add_header Cache-Control &quot;public, no-transform&quot;;
        access_log off;
        log_not_found off;
        expires max;
        try_files $uri$webp_suffix $uri =404;
    }
}
</code></pre>
<!--kg-card-end: markdown--><hr><!--kg-card-begin: markdown--><p>Le script conversion des images en WebP est inspir&#xE9; de l&apos;article <a href="https://www.digitalocean.com/community/tutorials/how-to-create-and-serve-webp-images-to-speed-up-your-website" target="_blank" rel="nofollow"> How To Create and Serve WebP Images to Speed Up Your Website</a> publi&#xE9; sur DigitalOcean Community</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Installer MariaDB 10.3 sur Ubuntu 18.04 LTS]]></title><description><![CDATA[Dans ce tutoriel, nous allons voir comment installer MariaDB 10.3 sur Ubuntu 18.04 LTS et comment mettre à jour MariaDB 10.2 vers la version 10.3]]></description><link>https://jesuisadmin.fr/installer-mariadb-10-3-ubuntu-18-04-lts/</link><guid isPermaLink="false">5c3f5221007fc1214a0a72f5</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[Sysadmin]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Sun, 03 Jun 2018 17:08:32 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2018/07/MariaDB-10.3-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://jesuisadmin.fr/content/images/2018/07/MariaDB-10.3-1.jpg" alt="Installer MariaDB 10.3 sur Ubuntu 18.04 LTS"><p>La nouvelle version stable de MariaDB a &#xE9;t&#xE9; publi&#xE9;e le 25 Mai 2018, avec la release 10.3.7. Dans ce tutoriel, nous allons voir comment installer MariaDB 10.3 sur Ubuntu 18.04 LTS et comment mettre &#xE0; jour MariaDB 10.2 vers la version 10.3</p><p>Ce tutoriel est &#xE9;galement applicable &#xE0; Ubuntu 16.04 LTS</p><p>Il est tout d&apos;abord important de pr&#xE9;ciser que les versions pr&#xE9;c&#xE9;dentes du serveur de base de donn&#xE9;es restent support&#xE9;es jusqu&apos;en 2020 pour la version 10.1 et 2022 pour la version 10.2. Il n&apos;y a donc aucune raison de se pr&#xE9;cipiter pour effectuer la mise &#xE0; jour sur votre serveur. </p><p>Cependant, comme le pr&#xE9;cise les notes de publications de MariaDB, la version 10.3 est une &#xE9;volution de la version 10.2, avec de nombreuses nouvelles fonctionnalit&#xE9;s, mais toujours les fonctionalit&#xE9;s backport&#xE9;es et r&#xE9;impl&#xE9;ment&#xE9;es de MySQL.</p><p>On peut m&#xEA;me trouver le message suivant dans l&apos;article concernant la mise &#xE0; jour de MariaDB 10.2 vers la version 10.3 : </p><blockquote> On most servers upgrading from 10.2 should be painless</blockquote><p>La majorit&#xE9; de mes serveurs utilisant d&#xE9;j&#xE0; MariaDB 10.2, j&apos;ai souhait&#xE9; v&#xE9;rifier si la mise &#xE0; jour se faisait effectivement sans probl&#xE8;me. </p><h2 id="installer-mariadb-10-3">Installer MariaDB 10.3 </h2><p>La premi&#xE8;re &#xE9;tape, que ce soit sur pour installer MariaDB sur un nouveau serveur, ou pour mettre &#xE0; jour MariaDB 10.2 est l&apos;ajout des d&#xE9;p&#xF4;ts APT. Et pour cela MariaDB propose un script qui r&#xE9;alise l&apos;ajout des d&#xE9;pots et l&apos;importation des cl&#xE9;s GPG automatiquement. Il est compatible avec les distributions linux les plus populaires : Ubuntu 14/16/18.04 LTS - Debian 7/8/9 &#xA0;- Centos 6/7</p><!--kg-card-begin: markdown--><pre><code class="language-bash">curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup \
| sudo bash -s -- --mariadb-server-version=10.3 --skip-maxscale
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Ce script r&#xE9;alise l&apos;ajout des d&#xE9;p&#xF4;ts APT pour MariaDB Server/Cluster et Percona XtraBackup. L&apos;argument <code>--mariadb-server-version=</code> permet de choisir la version de MariaDB que l&apos;on souhaite installer (10.1 ou 10.2 ou 10.3). Et l&apos;argument <code>--skip-maxscale</code> d&#xE9;sactive l&apos;ajout des d&#xE9;p&#xF4;ts de MariaDB MaxScale.</p>
<!--kg-card-end: markdown--><h4 id="sur-un-nouveau-serveur">Sur un nouveau serveur </h4><p>S&apos;il s&apos;agit d&apos;une installation initiale, sur un nouveau serveur, apr&#xE8;s avoir ajout&#xE9; les d&#xE9;p&#xF4;ts APT, il vous suffit d&apos;installer le paquet mariadb-server</p><!--kg-card-begin: markdown--><pre><code class="language-bash">sudo apt-get update &amp;&amp; sudo apt-get install mariadb-server -y
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Durant l&apos;installation, vous pouvez d&#xE9;finir le mot de passe root, ou le laisser vide afin d&apos;utiliser ensuite la commande <code>mysql_secure_installation</code> qui permet de s&#xE9;curiser un serveur MySQL en r&#xE9;pondant &#xE0; quelques questions.</p>
<!--kg-card-end: markdown--><h4 id="mise-jour-depuis-mariadb-10-2">Mise &#xE0; jour depuis MariaDB 10.2 </h4><p>Pour mettre &#xE0; jour MariaDB depuis la version 10.2 vers la version 10.3, il est n&#xE9;cessaire de prendre quelques pr&#xE9;cautions avant de mettre &#xE0; jour les paquets pour &#xEA;tre s&#xFB;r de ne pas perdre de donn&#xE9;es. </p><p>Pour cela, le plus simple est de r&#xE9;aliser une copie du dossier /var/lib/mysql qui contient vos bases de donn&#xE9;es avant de d&#xE9;sinstaller mariadb</p><!--kg-card-begin: markdown--><pre><code class="language-bash"># on arr&#xEA;te le serveur MySQL
sudo service mysql stop

# on copie le dossier /var/lib/mysql
sudo cp -rf /varlib/mysql /var/lib/mysqlold

# on d&#xE9;sinstalle mariadb 10.2
sudo apt-get autoremove mariadb-server
</code></pre>
<!--kg-card-end: markdown--><p>On peut ensuite remplacer les d&#xE9;p&#xF4;ts APT de la version 10.2 par ceux de la version 10.3 en utilisant le script mariadb_repo_setup </p><!--kg-card-begin: markdown--><pre><code class="language-bash">curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup \
| sudo bash -s -- --mariadb-server-version=10.3 --skip-maxscale
</code></pre>
<!--kg-card-end: markdown--><p>Puis mettre &#xE0; jour la liste des d&#xE9;p&#xF4;ts : </p><!--kg-card-begin: markdown--><pre><code class="language-bash">sudo apt-get update
</code></pre>
<!--kg-card-end: markdown--><p>La derni&#xE8;re &#xE9;tape est de lancer l&apos;installation de la nouvelle version de mariadb</p><!--kg-card-begin: markdown--><pre><code class="language-bash">sudo apt-get install mariadb-server
</code></pre>
<!--kg-card-end: markdown--><p>Durant la mise &#xE0; jour, vous pouvez laisser le mot de passe root vide pour conserver celui que vous avez d&#xE9;finit pr&#xE9;c&#xE9;demment.</p><p>Une fois la mise &#xE0; jour termin&#xE9;e, vous pouvez v&#xE9;rifi&#xE9; le status de MariaDB avec la commande : </p><!--kg-card-begin: markdown--><pre><code class="language-bash">service mysql status
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Si la mise s&apos;est bien d&#xE9;roul&#xE9;e, n&apos;oubliez pas d&apos;utiliser la commande <code>mysql_upgrade</code> pour mettre &#xE0; jour vos base de donn&#xE9;es.<br>
Si vous n&apos;avez plac&#xE9; les identfiants du serveur MySQL dans un fichier .my.cnf, <code>mysql_upgrade</code> s&apos;utilise de la m&#xEA;me fa&#xE7;on que <code>mysql</code> :</p>
<pre><code>mysql_upgrade -u root -p
</code></pre>
<!--kg-card-end: markdown--><h3 id="revenir-mariadb-10-2">Revenir &#xE0; MariaDB 10.2</h3><p>J&apos;ai d&#xE9;j&#xE0; r&#xE9;alis&#xE9; cette mise &#xE0; jour sur 6 serveurs sans rencontrer le moindre probl&#xE8;me. Mais dans le cas d&apos;un probl&#xE8;me suite &#xE0; la mise &#xE0; jour, vous pouvez &#xE0; tout moment revenir sur la version 10.2 en utilisant la copie du dossier /var/lib/mysql r&#xE9;alis&#xE9;e plus t&#xF4;t. &#xA0;</p><p>Commencez par remettre en place les d&#xE9;p&#xF4;ts APT de MariaDB 10.2, qui sont normalement r&#xE9;cup&#xE9;rable dans un fichier nomm&#xE9; mariadb.list.old_1</p><!--kg-card-begin: markdown--><pre><code class="language-bash"># cp -f /etc/apt/sources.list.d/mariadb.list.old_1 /etc/apt/sources.list.d/mariadb.list
</code></pre>
<!--kg-card-end: markdown--><p>Mais que vous pouvez &#xE9;galement ajouter en utilisant le script mariadb_repo_setup :</p><!--kg-card-begin: markdown--><pre><code class="language-bash">curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup \
| sudo bash -s -- --mariadb-server-version=10.2 --skip-maxscale
</code></pre>
<!--kg-card-end: markdown--><p>Ensuite, d&#xE9;sinstaller mariadb-server</p><!--kg-card-begin: markdown--><pre><code class="language-bash">sudo apt-get autoremove mariadb-server
</code></pre>
<!--kg-card-end: markdown--><p>Et Remplacez le dossier /var/lib/mysql avec le contenu du dossier /var/lib/mysqlold</p><!--kg-card-begin: markdown--><pre><code class="language-bash"># on d&#xE9;place le dossier /var/lib/mysql
sudo mv /var/lib/mysql /var/lib/mysqlnew

# on remet en place le dossier /var/lib/mysqlold
sudo mv /var/lib/mysqlold /var/lib/mysql

# on d&#xE9;finit &#xE0; nouveau le propri&#xE9;taire du dossier
sudo chown -R mysql:mysql /var/lib/mysql
</code></pre>
<!--kg-card-end: markdown--><p>La derni&#xE8;re &#xE9;tape est de r&#xE9;installer MariaDB 10.2</p><!--kg-card-begin: markdown--><pre><code class="language-bash">sudo apt-get update
sudo apt-get install mariadb-server
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Configuration réseau d'une machine virtuelle KVM sur Proxmox]]></title><description><![CDATA[Nous allons voir dans ce tutoriel, comment configurer le réseau d'une machine virtuelle KVM en utilisant qemu-nbd sur Proxmox]]></description><link>https://jesuisadmin.fr/configuration-reseau-machine-virtuelle-kvm-proxmox/</link><guid isPermaLink="false">5c3f5221007fc1214a0a72ef</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[Proxmox]]></category><category><![CDATA[Sysadmin]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Wed, 09 May 2018 21:14:42 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2018/05/R-seau-Proxmox.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jesuisadmin.fr/content/images/2018/05/R-seau-Proxmox.png" alt="Configuration r&#xE9;seau d&apos;une machine virtuelle KVM sur Proxmox"><p>Si la configuration r&#xE9;seau d&apos;un container LXC peut s&apos;effectuer directement depuis l&apos;interface web de Proxmox VE, il <s>est</s> &#xE9;tait n&#xE9;cessaire (et p&#xE9;nible) de la r&#xE9;aliser via la console NoVNC pour les machines virtuelles KVM tournant sous Debian/Ubuntu.</p>
<p>Nous allons voir dans ce tutoriel, comment configurer le r&#xE9;seau d&apos;une machine virtuelle KVM en utilisant qemu-nbd, qui permet de monter le disque d&apos;une VM et donc d&apos;acc&#xE9;der directement aux fichiers de configuration des interfaces r&#xE9;seau.<br>
Si la proc&#xE9;dure peut sembler longue pour configurer une seule VM, il sera tout &#xE0; fait possible de l&apos;automatiser avec un script bash par la suite.</p>
<p>PS : Alors que j&apos;&#xE9;cris ces lignes, le module cloud-init a d&#xE9;j&#xE0; fait son apparition sur Proxmox VE 5.1, et repr&#xE9;sentera tr&#xE8;s probablement une excellente alternative &#xE0; la solution pr&#xE9;sent&#xE9;e dans cette article. Mais cela fera s&#xFB;rement l&apos;objet d&apos;un autre article.</p>
<h2 id="installerleclientnbd">Installer le client nbd</h2>
<p>Pour commencer, il faut installer le client nbd sur votre serveur Proxmox.</p>
<pre><code class="language-bash">apt-get update &amp;&amp; apt-get install nbd-client -y
</code></pre>
<p>Puis charger le module :</p>
<pre><code class="language-bash">modprobe nbd max_part=16
</code></pre>
<p>Et enfin, pour rendre la configuration persistente, on utilise :</p>
<pre><code class="language-bash">echo &quot;nbd&quot; &gt;&gt; /etc/modules
cat &gt; /etc/modprobe.d/nbd.conf &lt;&lt;\EOT

options nbd max_part=16

EOT
</code></pre>
<h2 id="monterledisquedunvmavecqemunbd">Monter le disque d&apos;un VM avec qemu-nbd</h2>
<h3 id="casdunemachinevirtuellesanslvm">Cas d&apos;une machine virtuelle sans LVM</h3>
<p>Pour monter le disque d&apos;une VM, on utilise <code>qemu-nbd</code> :</p>
<pre><code class="language-bash">qemu-nbd -c  /dev/nbd0 vm-101* -f raw
</code></pre>
<p>vm-101 correspond &#xE0; l&apos;ID de la machine virtuelle dans Proxmox.</p>
<p>On cr&#xE9;er ensuite un dossier dans lequel nous allons pouvoir monter le disque de la machine virtuelle :</p>
<pre><code class="language-basg">mkdir /mnt/ma-vm 
mount /dev/nbd0p1 /mnt/ma-vm
</code></pre>
<h3 id="casdunemachinevirtuelleaveclvm">Cas d&apos;une machine virtuelle avec LVM</h3>
<p>Dans le cas d&apos;un LVM, il n&apos;est pas possible de monter directement la partition car il faut pour cela conna&#xEE;tre le nom du volume group qui contient les fichiers de configuration.</p>
<p>La proc&#xE9;dure pour monter le disque est quasiment la m&#xEA;me que pr&#xE9;c&#xE9;demment :</p>
<pre><code class="language-bash">qemu-nbd -c  /dev/nbd0 vm-101*
</code></pre>
<p>Mais cette fois-ci on utilise <code>vgscan</code> pour d&#xE9;tecter les volume groups disponibles</p>
<pre><code class="language-bash">vgscan
</code></pre>
<p>On obtient alors la liste des volume group et on active le volume auquel on souhaite acc&#xE9;der :</p>
<pre><code class="language-bash">vgchange -a y vp-vg
</code></pre>
<p>Nous pouvons alors monter le VG  :</p>
<pre><code class="language-bash">mkdir /mnt/ma-vm
mount /dev/vp-vg/root /mnt/ma-vm
</code></pre>
<h2 id="configurerlinterfacerseau">Configurer l&apos;interface r&#xE9;seau</h2>
<p>Maintenant que le disque de notre machine virtuelle est mont&#xE9; dans le r&#xE9;pertoire <code>/mnt/ma-vm</code>, nous pouvons modifier la configuation de ses interfaces r&#xE9;seau.<br>
On se d&#xE9;place &#xE0; la racine du disque :</p>
<pre><code class="language-bash">cd /mnt/ma-vm/
</code></pre>
<p>Et nous pouvons modifier directement le fichier <code>/etc/network/interfaces</code> dans le cas d&apos;une machine virtuelle tournant sous Debian ou Ubuntu (exemple avec Ubuntu 16.04 LTS sur un serveur d&#xE9;di&#xE9; OVH) :</p>
<pre><code class="language-bash">cat &gt; etc/network/interfaces &lt;&lt; EOF

auto ens18
iface ens18 inet static
        address IP.FAIL.OVER
        netmask 255.255.255.255
        broadcast IP.FAIL.OVER
        post-up route add IP.SERVEUR.DEDIE.254 dev ens18
        post-up route add default gw IP.SERVEUR.DEDIE.254
        pre-down route del IP.SERVEUR.DEDIE.254 dev ens18
        pre-down route del default gw IP.SERVEUR.DEDIE.254
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 213.186.33.99

iface ens18 inet6 static
       address IP:V6:FAIL:OVER
       netmask 64
       post-up /sbin/ip -f inet6 route add XXXX:XXXX:XXX:XXff:ff:ff:ff:ff dev ens18
       post-up /sbin/ip -f inet6 route add default via XXXX:XXXX:XXX:XXff:ff:ff:ff:ff
       pre-down /sbin/ip -f inet6 route del XXXX:XXXX:XXX:XXff:ff:ff:ff:ff dev ens18
       pre-down /sbin/ip -f inet6 route del default via XXXX:XXXX:XXX:XXff:ff:ff:ff:ff

EOF
</code></pre>
<h2 id="terminerlaconfiguration">Terminer la configuration</h2>
<p>Une fois la modification termin&#xE9;e, nous pouvons d&#xE9;monter le disque de la VM.</p>
<h3 id="sanslvm">Sans LVM</h3>
<p>Sans LVM, la m&#xE9;thode est la m&#xEA;me que pour monter le disque</p>
<pre><code class="language-bash">cd ..
umount /dev/nbd0p1
qemu-nbd -d /dev/nbd0
rm -r /mnt/ma-vm
</code></pre>
<h3 id="aveclvm">Avec LVM</h3>
<p>Avec LVM, il faut utiliser &#xE0; nouveau vgchange de d&#xE9;sactiver le volume group :</p>
<pre><code class="language-bash">cd ..
umount /dev/vp-vg/root
vgchange -a n vp-vg
qemu-nbd -d /dev/nbd0
rm -r /mnt/ma-vm
</code></pre>
<p>Derni&#xE8;re &#xE9;tapes, red&#xE9;marrer la machine virtuelle pour appliquer les modificiations. J&apos;esp&#xE8;re que cet article vous aidera &#xE0; automatiser un peu plus vos cr&#xE9;ation de machines virtuelles.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Migrer ses emails facilement avec imapsync]]></title><description><![CDATA[Dans ce tutoriel, nous allons voir comment installer Imapsync, puis comment synchroniser deux boîtes mails ainsi que les options proposées par cet outil]]></description><link>https://jesuisadmin.fr/migrer-emails-facilement-imapsync/</link><guid isPermaLink="false">5c3f5221007fc1214a0a72e4</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[Sysadmin]]></category><category><![CDATA[Self-hosting]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Sat, 21 Apr 2018 18:53:00 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2018/07/imapsync-min.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jesuisadmin.fr/content/images/2018/07/imapsync-min.jpg" alt="Migrer ses emails facilement avec imapsync"><p>Si la migration de sites web ne pose g&#xE9;n&#xE9;ralement pas de probl&#xE8;me, il est parfois plus d&#xE9;licat de migrer des emails, notamment lorsque deux serveurs n&apos;utilisent pas le m&#xEA;me software ou lorsqu&apos;il s&apos;agit d&apos;une migration depuis/vers un h&#xE9;bergeur tiers. Heureusement pour simplifier cette &#xE9;tape, il existe de nombreux outils, dont imapsync qui est celui dont nous allons parler aujourd&apos;hui.</p>
<p>imapsync est comme son nom l&apos;indique un outil (d&#xE9;velopp&#xE9; en perl) qui permet de synchroniser des bo&#xEE;tes mail en utilisant le protocol imap. Cela ne fonctionnera bien s&#xFB;r que si vous utilisez &#xE9;galement l&apos;IMAP pour r&#xE9;cup&#xE9;rer vos emails, ou si vous n&apos;effacez pas vos emails du serveur avec le protocol POP.</p>
<p>Nous allons voir dans ce tutoriel comment installer Imapsync (sur Ubuntu 16.04 LTS), puis comment synchroniser deux bo&#xEE;tes mails ainsi que les options propos&#xE9;es par cet outil.</p>
<h2 id="installerimapsync">Installer imapsync</h2>
<p>Tout d&apos;abord, il faut installer les pr&#xE9;-requis n&#xE9;cessaires &#xE0; l&apos;&#xE9;xecution d&apos;imapsync :</p>
<pre><code class="language-bash">  sudo apt-get install \
libauthen-ntlm-perl    \
libclass-load-perl     \
libcrypt-ssleay-perl   \
libdata-uniqid-perl    \
libdigest-hmac-perl    \
libdist-checkconflicts-perl \
libfile-copy-recursive-perl \
libio-compress-perl     \
libio-socket-inet6-perl \
libio-socket-ssl-perl   \
libio-tee-perl          \
libmail-imapclient-perl \
libmodule-scandeps-perl \
libnet-ssleay-perl      \
libpar-packer-perl      \
libreadonly-perl        \
libregexp-common-perl   \
libsys-meminfo-perl     \
libterm-readkey-perl    \
libtest-fatal-perl      \
libtest-mock-guard-perl \
libtest-pod-perl        \
libtest-requires-perl   \
libtest-simple-perl     \
libunicode-string-perl  \
liburi-perl             \
libtest-nowarnings-perl \
libtest-deep-perl       \
libtest-warn-perl       \
make                    \
cpanminus
</code></pre>
<p>Il peut &#xEA;tre n&#xE9;cessaire de mettre &#xE0; jour le client IMAP et JSON avec cpanm :</p>
<pre><code class="language-bash">sudo cpanm Mail::IMAPClient
sudo cpanm JSON::WebToken
</code></pre>
<p>On peut ensuite t&#xE9;l&#xE9;charger imapsync :</p>
<pre><code class="language-bash">sudo wget https://imapsync.lamiral.info/dist/imapsync -O /usr/bin/imapsync
</code></pre>
<p>Et il ne reste plus qu&apos;&#xE0; le rendre &#xE9;xecutable :</p>
<pre><code class="language-bash">sudo chmod +x /usr/bin/imapsync
</code></pre>
<p>Vous pouvez ensuite obtenir la liste des variables disponibles en utilisant la commande <code>imapsync</code></p>
<h2 id="synchroniserunebotemail">Synchroniser une bo&#xEE;te mail</h2>
<p>Pour lancer la synchronisation d&apos;une boite mail avec imapsync avec uniquement les options requises ressemble &#xE0; :</p>
<pre><code class="language-bash">  imapsync \
     --host1 serveur1.imap.tld \
	 --user1 boite@email.tld \
	 --password1 motdepasse1 \
	 --host2 serveur2.imap.tld \
	 --user2 boite@email.tld \
	 --password2 motdepasse2 
</code></pre>
<h2 id="lesoptions">Les options</h2>
<h3 id="lesmotsdepasses">Les mots de passes</h3>
<p>Pour &#xE9;viter d&apos;avoir &#xE0; entrer les mots de passe des bo&#xEE;te email en clair, vous pouvez les stockers dans des fichiers et utiliser l&apos;argument <code>--passfile1</code> et <code>--passfile2</code> pour les charger automatiquement depuis les fichiers contenant les mots de passe.</p>
<p>Ce qui donne :</p>
<pre><code class="language-bash">  imapsync \
     --host1 serveur1.imap.tld \
	 --user1 boite@email.tld \
	 --passfile2 /home/user/pass1 \
	 --host2 serveur2.imap.tld \
	 --user2 boite@email.tld \
	 --passfile2 /home/user/pass2 
</code></pre>
<h3 id="laconnexionauserveurimap">La connexion au serveur imap</h3>
<p>Plusieurs options sont disponibles pour connecter imapsync &#xE0; votre serveur mail, notamment le type de connexion utilis&#xE9;e. Par d&#xE9;faut imapsync essaira d&apos;utiliser SSL ou TLS sur le port 993 pour se connecter. Voici des exemples pour la connexion sur le serveur &#xE0; migrer (remplacer 1 par 2 pour le deuxi&#xE8;me serveur) :</p>
<ul>
<li><code>--nossl1</code> pour une connexion non chiffr&#xE9;e via le port 143 (non recommand&#xE9;)</li>
<li><code>--ssl1</code> pour une connexion avec SSL via le port 993</li>
<li><code>--tls1</code> pour une connexion avec TLS via le port 143</li>
</ul>
<p>Il y a &#xE9;galement des options pour d&#xE9;finir le type d&apos;authentification que l&apos;on peut d&#xE9;finir via les arguments <code>--authmech1</code> et <code>--authmech2</code> dont les valeurs possibles sont (en majusule) :</p>
<ul>
<li>PLAIN</li>
<li>LOGIN</li>
<li>CRAM-MD5</li>
</ul>
<h3 id="lesdossiers">Les dossiers</h3>
<p>La synchronisation des dossiers peut &#xEA;tre une source de probl&#xE8;mes, notamment si les dossiers par d&#xE9;faut (Inbox, Spam, Archive, Envoy&#xE9;s) ne sont pas nomm&#xE9;s de la m&#xEA;me fa&#xE7;on sur les deux serveurs mails.<br>
Pour cela imapsync offre plusieurs options :</p>
<ul>
<li><code>--automap</code> pour utiliser la reconnaissance automatique des dossiers par d&#xE9;faut</li>
<li><code>--nomixfolders</code> pour &#xE9;viter de fusionner des dossier ayant un nom similaire selon la sensibilit&#xE9; &#xE0; la casse</li>
<li><code>--prefix1</code> pour retirer un prefix des dossiers &#xE0; migrer</li>
<li><code>--prefix2</code> pour ajouter un  prefix aux dossiers migr&#xE9;s</li>
<li><code>--skipemptyfolders</code> pour ne pas recr&#xE9;er les dossiers vides sur le serveur de destination</li>
</ul>
<h3 id="lesoptionsdemigration">Les options de migration</h3>
<p>Pour acc&#xE9;lerer la migration des emails, vous pouvez utiliser l&apos;argument <code>--usecache</code> afin de stocker temporairement les UIDs des messages et acc&#xE9;l&#xE9;rer les synchronisations suivantes (n&apos;acc&#xE9;l&#xE8;re pas la premi&#xE8;re migration).<br>
Vous pouvez &#xE9;galement supprimer les messages du premier serveur avec l&apos;argument <code>--delete1</code>.<br>
Enfin, avant de lancer votre migration, n&apos;h&#xE9;sitez pas &#xE0; utiliser l&apos;argument <code>--dry</code> pour voir ce que ferai imapsync, sans l&apos;appliquer.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Miner du Monero (XMR) avec xmr-stak - CPU & GPU]]></title><description><![CDATA[Dans ce tutoriel, je vous explique comment miner du Monero (XMR) avec l'outil xmr-stak sur Windows et Linux]]></description><link>https://jesuisadmin.fr/miner-du-monero-xmr-stack-linux-windows-cpu-gpu/</link><guid isPermaLink="false">5c3f5221007fc1214a0a72f0</guid><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Sun, 31 Dec 2017 13:43:51 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2017/12/miner-du-monero.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jesuisadmin.fr/content/images/2017/12/miner-du-monero.png" alt="Miner du Monero (XMR) avec xmr-stak - CPU &amp; GPU"><p>Si le bitcoin fait beaucoup parler de lui, d&apos;autres cryptomonnaies commencent &#xE9;galement &#xE0; s&apos;imposer, ces derni&#xE8;res semblent ne pas vouloir reproduire les m&#xEA;mes erreurs que le bitcoin. Avec l&apos;usage d&apos;algorithmes de hashage diff&#xE9;rents, il est ainsi possible d&apos;utiliser son CPU ou son GPU pour le minage. C&apos;est le cas du Monero, bas&#xE9; sur la technologie Cryptonote, dont le code mon&#xE9;taire est XMR.</p>
<p>Dans ce tutoriel, nous allons voir comment miner du Monero avec l&apos;outil open-source <a href="https://github.com/fireice-uk/xmr-stak">xmr-stack</a> disponible sur Github. Ce dernier est disponible sur Windows, Linux et Mac OS et permet de miner avec votre CPU et/ou votre GPU AMD/NVIDIA.</p>
<h2 id="monerocommelebitcoin">Monero - Comme le bitcoin ?</h2>
<p>Si j&apos;ai d&#xE9;cid&#xE9; de parler du minage du Monero dans cet article, c&apos;est tout d&apos;abord car cette cryptomonnaie est tr&#xE8;s diff&#xE9;rente du c&#xE9;l&#xE8;bre bitcoin. Voici les principales diff&#xE9;rences entre les deux cryptomonnaies :</p>
<p><strong>1) Un portefeuille et des transactions anonymes</strong><br>
Alors que toutes les transactions effectu&#xE9;es avec des bitcoins sont affich&#xE9;es publiquement, elles restent confidentielles avec le Monero.<br>
Il est ainsi impossible de lister les transactions r&#xE9;alis&#xE9;es depuis un portefeuille ainsi que le montant de ces transactions.</p>
<p><strong>2) Des frais de transactions faibles</strong><br>
Si de nombreuses personnes ont commenc&#xE9; &#xE0; s&apos;int&#xE9;resser au bitcoin et &#xE0; y investir de l&apos;argent, la majorit&#xE9; d&apos;entre elles ne l&apos;utilisent pas comme moyen de paiement en ligne. Cependant au moment o&#xF9; j&apos;&#xE9;cris cet article, pour envoyer l&apos;&#xE9;quivalent de 1&#x20AC; &#xE0; un autre portefeuille bitcoin, les frais de r&#xE9;seaux sont de 20.88&#x20AC;.</p>
<p>Gr&#xE2;ce &#xE0; des blocks aux dimensions dynamiques, permettant de s&apos;adapter aux nombre de transactions par rapport &#xE0; la puissance de calcul disponible, les transactions avec le Monero sont rapides et les frais de transactions faibles.</p>
<p><strong>3) Tout le monde peut miner</strong><br>
&#xC0; l&apos;inverse du bitcoin, il n&apos;est pas n&#xE9;cessaire d&apos;investir 1500&#x20AC; dans un ASIC (Application Specific Integrated Circuit) pour pouvoir miner du Monero. L&apos;objectif du Monero &#xE9;tant que chacun puisse participer au r&#xE9;seau et donc garantir que ce dernier soit totalement d&#xE9;centralis&#xE9;.</p>
<h2 id="toutsavoirsurlemonero">Tout savoir sur le Monero</h2>
<p>Voici quelques liens utiles si vous souhaitez en savoir plus sur le Monero :</p>
<p><strong>Les sites principaux</strong></p>
<ul>
<li><a href="https://getmonero.org">getmonero.org</a> : le site officiel du Monero</li>
<li><a href="https://mymonero.com/#/">mymonero.com</a> : portefeuille en ligne conseill&#xE9; par getmonero.org</li>
<li><a href="https://www.monero.how/">www.monero.how</a> : Tutoriaux, statisques, informations</li>
</ul>
<p><strong>Les sites pour en discuter</strong></p>
<ul>
<li><a href="https://bitcointalk.org/index.php?topic=583449.0">bitcointalk.org</a></li>
<li><a href="https://monero.stackexchange.com/">stackexchange</a></li>
<li><a href="https://www.reddit.com/r/Monero/">reddit</a></li>
</ul>
<p><strong>Les sites pour miner</strong></p>
<ul>
<li><a href="http://monerobenchmarks.info/">monerobenchmarks.info</a> : benchmark CPU &amp; GPU</li>
<li><a href="http://moneropools.com/">moneropools.com</a> : comparateur des pools de minage</li>
<li><a href="https://www.reddit.com/r/MoneroMining/">reddit monero mining</a></li>
</ul>
<h2 id="minerdumonero">Miner du Monero</h2>
<p>Comme expliqu&#xE9; pr&#xE9;c&#xE9;demment, avec le Monero, il peut ainsi &#xEA;tre int&#xE9;ressant de miner avec votre PC ou votre serveur d&#xE9;di&#xE9;, sans pour autant utiliser tous les cores de votre CPU. Par exemple, avec 2 Cores d&apos;un Intel Core i7-4790K, j&apos;obtiens un hashrate moyen de 240 H/s.</p>
<p>Il reste possible de monter des machines d&#xE9;di&#xE9;es pour le minage et pour cela les GPU AMD restent plus int&#xE9;ressants que ceux propos&#xE9;s par Nvidia. Les RX 570 &amp; 580 proposent un tarif abordable pour commencer, et la nouvelle gamme VEGA est  visiblement beaucoup plus int&#xE9;ressante pour le minage que pour les jeux-vid&#xE9;os.</p>
<p>Le minage du monero est similaire au bitcoin sur le fonctionnement puisque vous pouvez miner seul ou via un pool. Pour d&#xE9;buter il est souvent plus int&#xE9;ressant d&apos;utiliser un pool.</p>
<p><strong>Suite &#xE0; de nombreuses plaintes sur reddit, je vous d&#xE9;conseille l&apos;usage du site minergate.com</strong></p>
<h2 id="lesalternativesmonero">Les alternatives &#xE0; Monero</h2>
<p><strong>mise &#xE0; jour du 24/10/2018</strong></p>
<p>Je ne mine plus de Monero depuis F&#xE9;vrier suite &#xE0; la forte augmentation du hashrate et de la difficult&#xE9; sur le r&#xE9;seau Monero, qui a r&#xE9;duit de moiti&#xE9; la r&#xE9;compense obtenu &#xE0; puissance &#xE9;gale.<br>
Monero n&apos;est pas le seule cryptomonnaie bas&#xE9;e sur cryptonote, et de nombreux autres projets ont vu le jour dont le Stellite (XTL) ou le Graft (GRFT) pour ne citer que les plus prometteurs. Si vous souhaitez d&#xE9;couvrir et/ou miner d&apos;autres cryptomonnaies similaires au Monero, je vous invite &#xE0; visiter le site de r&#xE9;f&#xE9;rence <a href="https://www.cryptunit.com/">Cryptunit.com</a>.</p>
<p>Le Monero reste un projet stable, et ses d&#xE9;veloppeur nous l&apos;ont prouv&#xE9;s en ce d&#xE9;but Avril, en r&#xE9;alisant un nouveau hardfork, ou du moins une mise &#xE0; jour de l&apos;algorithme du PoW(Proof of Work) en Fran&#xE7;ais afin de lutter contre les ASICs (application-specific integrated circuit), ces machines d&#xE9;di&#xE9;es au minage d&apos;une cryptomonnaie et qui propose un ratio hashrate/consommation exceptionnel.</p>
<p>Si vous vous demandez pourquoi le Monero fait la guerre aux ASICs, c&apos;est tout simplement parce que ses d&#xE9;veloppeurs ont bien retenu la le&#xE7;on du bitcoin (12 soci&#xE9;t&#xE9;s repr&#xE9;sente 87% de la puissance de calcul du r&#xE9;seau Bitcoin).</p>
<p>Quasiment toutes les cryptomonnaies partagent une m&#xEA;me logique de d&#xE9;centralisation, mais &#xE0; l&apos;heure actuelle, le projet Monero est clairement celui qui fait le plus d&apos;efforts pour que le r&#xE9;seau reste d&#xE9;centralis&#xE9;.</p>
<p>Le r&#xE9;sultat de ce hardfork, une baisse de 50% du hashrate sur le r&#xE9;seau Monero. Un autre hardfork est d&#xE9;j&#xE0; programm&#xE9; dans 6 mois, et il y en aura d&#xE9;sormais un tous les 6 mois, rendant la conception et la vente d&apos;ASICs totalement impossible.</p>
<h2 id="xmrstackunmineurtoutenun">XMR-STACK : Un mineur tout-en-un</h2>
<p>Depuis sa release v2.0, xmr-stack est un mineur tout-en-un, puisqu&apos;il permet de miner avec votre CPU et/ou GPU AMD ou Nvidia et il dispose d&apos;un interface web pour suivre votre hashrate en temps r&#xE9;el.</p>
<p><img src="https://jesuisadmin.fr/content/images/2017/12/Screenshot_223-min.png" alt="Miner du Monero (XMR) avec xmr-stak - CPU &amp; GPU" loading="lazy"></p>
<h3 id="installerxmrstack">Installer xmr-stack</h3>
<h4 id="surwindows">Sur Windows</h4>
<p>Sur Windows, il vous suffit de t&#xE9;l&#xE9;charger la version pr&#xE9;-compil&#xE9;e disponible sur la <a href="https://github.com/fireice-uk/xmr-stak/releases">page release</a> du projet xmr-stack.</p>
<h4 id="surlinux">Sur Linux</h4>
<p>Sur Linux, il est par contre n&#xE9;cessaire de compiler xmr-stack. Il est alors possible d&apos;ajouter la librarie OpenCL pour un GPU AMD ou CUDA pour un GPU Nvidia.</p>
<p>Le CUDA Toolkit est disponible via le lien suivant : <a href="https://developer.nvidia.com/cuda-downloads?target_os=Linux&amp;target_arch=x86_64">CUDA</a></p>
<p>Et l&apos;APP SDK pour ADM est disponible via le lien suivant : <a href="https://developer.amd.com/amd-accelerated-parallel-processing-app-sdk/">AMD</a></p>
<p>Pour la compilation, xmr-stack n&#xE9;cessite gcc 5.1+. Si votre syst&#xE8;me d&apos;exploitation vous propose uniquement une version ant&#xE9;rieur de gcc, vous pouvez dans ce cas utiliser le script bash docker disponible sur le d&#xE9;p&#xF4;t d&apos;xmr-stack, pour r&#xE9;aliser la compilation.</p>
<p><strong>Compiler xmr-stack avec le script bash docker</strong></p>
<ol>
<li>Installer Docker</li>
</ol>
<pre><code>curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh
</code></pre>
<ol start="2">
<li>Lancer le script</li>
</ol>
<pre><code>wget https://raw.githubusercontent.com/fireice-uk/xmr-stak/master/scripts/build_xmr-stak_docker/build_xmr-stak_docker.sh
bash build_xmr-stak_docker.sh
</code></pre>
<p>Le script r&#xE9;alise la compilation d&apos;xmr-stack pour Ubuntu 14.04, 16.04, Centos 6, 7 et Fedora 27. Une fois la compilation termin&#xE9;e, chaque version sera disponible dans un dossier distinct.</p>
<p><strong>Compiler xmr-stack sur Ubuntu</strong></p>
<pre><code>&gt; apt install libmicrohttpd-dev libssl-dev cmake build-essential libhwloc-dev -y
git clone https://github.com/fireice-uk/xmr-stak.git
mkdir xmr-stak/build
cd xmr-stak/build
</code></pre>
<p>Vous pouvez alors ajouter des arguments &#xE0; la commande cmake pour d&#xE9;sactiver les librairies OpenCL (-DOpenCL_ENABLE=OFF) et CUDA (-DCUDA_ENABLE=OFF) si vous souhaitez miner uniquement avec votre CPU. Et si vous ne souhaitez pas utiliser la dashboard web, vous pouvez &#xE9;galement d&#xE9;finir l&apos;option (-DMICROHTTPD_ENABLE=OFF).</p>
<p>Ce qui donne</p>
<pre><code class="language-bash"># CPU only + Interface web
cmake .. -DCUDA_ENABLE=OFF -DOpenCL_ENABLE=OFF
make install

# AMD + CPU + Interface web 
cmake .. -DCUDA_ENABLE=OFF 
make install

# Nvidia + CPU + Interface web
cmake .. -DOpenCL_ENABLE=OFF
make install

# CPU only sans Interface web
cmake .. -DCUDA_ENABLE=OFF -DOpenCL_ENABLE=OFF -DMICROHTTPD_ENABLE=OFF
make install
</code></pre>
<p>L&apos;ex&#xE9;cutable xmr-stack sera disponible dans le dossier bin apr&#xE8;s la compilation.<br>
Vous pouvez le lancer en vous rendant dans le dossier :</p>
<pre><code>cd xmr-stack/build/bin/
./xmr-stack
</code></pre>
<h3 id="configurationdxmrstack">Configuration d&apos;xmr-stack</h3>
<p>Lors du premier lancement de l&apos;application, xmr-stack va d&#xE9;tecter la configuration de votre ordinateur (CPU &amp; GPU), puis vous afficher un menu interactif pour g&#xE9;n&#xE9;rer les diff&#xE9;rents fichiers de configuration :</p>
<ul>
<li>config.txt : fichier de configuration principal o&#xF9; vous pouvez d&#xE9;finir les options relative &#xE0; l&apos;affichage console, aux logs ou &#xE0; l&apos;interface web</li>
<li>pools.txt : ficher de configuration du/des pool(s)</li>
<li>cpu.txt : fichier de configuration pour le CPU, qui d&#xE9;finit le nombre de threads a utiliser et l&apos;intensit&#xE9;</li>
<li>gpu.txt : fichier de configuration pour le GPU (si un GPU est pr&#xE9;sent)</li>
</ul>
<p>Globalement, les options par d&#xE9;faut sont optimis&#xE9;es gr&#xE2;ce &#xE0; la d&#xE9;tection des p&#xE9;riph&#xE9;riques disponibles. Cependant il est possible de les ajuster, en r&#xE9;duisant par exemple le nombre de coeurs utilis&#xE9;s pour le minage.</p>
<h3 id="optimisation">Optimisation</h3>
<h4 id="windows">Windows</h4>
<p>Afin d&apos;obtenir un meilleur hashrate sous Windows, il est n&#xE9;cessaire d&apos;autoriser le verrouillage des pages en m&#xE9;moire.<br>
Pour cela, il faut se rendre dans l&apos;&#xE9;diteur de strat&#xE9;gie de groupe locale, accessible via le commande gpedit.msc dans le menu d&#xE9;marrer. Puis dans Param&#xE8;tres Windows &gt; Param&#xE8;tres de s&#xE9;curit&#xE9; &gt; Attribution des droits utilisateur comme sur l&apos;image ci-dessous :</p>
<p><img src="https://jesuisadmin.fr/content/images/2017/12/Screenshot_222-min-1.png" alt="Miner du Monero (XMR) avec xmr-stak - CPU &amp; GPU" loading="lazy"></p>
<p>Vous pouvez ensuite ajouter des utilisateurs (votre utilisateur et/ou l&apos;Administrateur) dans le menu contextuel de l&apos;option &quot;Verrouiller les pages en m&#xE9;moire&quot;. Un red&#xE9;marrage est n&#xE9;cessaire pour appliquer la modification.</p>
<h4 id="linux">Linux</h4>
<p>Tout comme avec Windows, il vous faudra ajuster certaines options concernant la gestion de la m&#xE9;moire de votre syst&#xE8;me pour obtenir un meilleur hashrate.</p>
<p>Via le fichier sysctl.conf</p>
<pre><code>echo &apos;vm.nr_hugepages=128&apos; &gt;&gt; /etc/sysctl.conf
sysctl -p
</code></pre>
<p>Via le fichier limits.conf</p>
<pre><code>echo &apos;* soft memlock 262144&apos; &gt;&gt; /etc/security/limits.conf
echo &apos;* hard memlock 262144&apos;  &gt;&gt; /etc/security/limits.conf
</code></pre>
<p>Pour appliquer la nouvelle configuration, il n&apos;est pas n&#xE9;cessaire de red&#xE9;marrer, mais simplement de fermer votre session, puis de l&apos;ouvrir &#xE0; nouveau.</p>
<h3 id="mettrejourxmrstack">Mettre &#xE0; jour xmr-stack</h3>
<h4 id="windows">Windows</h4>
<p>Sous Windows, il vous suffit de t&#xE9;l&#xE9;charger la nouvelle version disponible sur la page release, tout en conservant vos fichier de configurations.</p>
<h4 id="linux">Linux</h4>
<p>Sous Linux, on r&#xE9;cup&#xE8;re les modifications depuis le d&#xE9;p&#xF4;t Github, avant de s&#xE9;lectionner la derni&#xE8;re release, et on relance la compilation :</p>
<pre><code>cd xmr-stack
git fetch
git checkout v2.2.0
cd build
cmake .. -DCUDA_ENABLE=OFF -DOpenCL_ENABLE=OFF
make install
</code></pre>
<h2 id="mesastucesetchiffres">Mes astuces et chiffres</h2>
<ul>
<li>Sur des processeurs avec suffisament de cache, il peut-&#xEA;tre int&#xE9;ressant d&apos;activer le l&apos;option <code>low_power_mode</code> via le fichier cpu.txt si vous ne souhaitez pas utiliser tous les cores disponibles pour miner. Sur un XEON E3-1270v6, j&apos;obtiens ainsi un hashrate de 220 H/s avec 2 Cores.</li>
<li>Sous Windows, avec un GPU Nvidia, activer l&apos;option &quot;optimiser pour les performances de calcul&quot; via le panneau de configuration Nvidia, dans la section G&#xE9;rer les param&#xE8;tres 3D, comme sur l&apos;image ci-dessous :</li>
</ul>
<p><img src="https://jesuisadmin.fr/content/images/2017/12/Screenshot_224-min.png" alt="Miner du Monero (XMR) avec xmr-stak - CPU &amp; GPU" loading="lazy"></p>
<p>Je suis pass&#xE9; d&apos;un hashrate de 300 H/s &#xE0; 430 H/s avec une GTX 970 apr&#xE8;s avoir activ&#xE9; cette option.</p>
<h3 id="quelqueschiffres">Quelques chiffres</h3>
<p>GPU :</p>
<ul>
<li>Nvidia GTX 970 : 430 H/s</li>
</ul>
<p>CPU :</p>
<ul>
<li>
<p>Intel(R) Core(TM) i5-2400 @ 3.10GHz  : 150 H/s</p>
</li>
<li>
<p>Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz : 250 H/s</p>
</li>
<li>
<p>Intel(R) Core(TM) i7-2600 @ 3.40GHz : 260 H/s</p>
</li>
<li>
<p>Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz : 260 H/s</p>
</li>
<li>
<p>Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz : 260 H/s</p>
</li>
<li>
<p>Intel(R) Xeon(R) CPU E3-1231 v3 @ 3.40GHz : 250 H/s</p>
</li>
<li>
<p>Intel(R) Xeon(R) CPU E3-1270 v6 @ 3.80GHz : 250 H/s</p>
</li>
<li>
<p>Intel(R) Xeon(R) CPU E5-1630 v3 @ 3.70GHz : 280 H/s</p>
</li>
<li>
<p>Intel(R) Xeon(R) CPU E3-1245 V2 @ 3.40GHz : 260 H/s</p>
</li>
<li>
<p>Intel(R) Xeon(R) CPU E5-1650 v4 @ 3.60GHz : 390 H/s</p>
</li>
<li>
<p>2 x Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz : 930 H/s</p>
</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Déployer un système de backup centralisé avec UrBackup]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>La gestion des backups peut rapidement devenir un probl&#xE8;me lorsque l&apos;on g&#xE8;re un grand nombre de serveurs, aussi bien pour g&#xE9;rer l&apos;espace de stockage que pour le suivi des backups. Je vais donc vous pr&#xE9;senter la solution UrBackup.</p>]]></description><link>https://jesuisadmin.fr/deployer-systeme-backup-centralise-urbackup/</link><guid isPermaLink="false">5c3f5221007fc1214a0a72eb</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[Sysadmin]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Mon, 13 Nov 2017 19:03:46 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2018/07/Centraliser-Backup--2-.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jesuisadmin.fr/content/images/2018/07/Centraliser-Backup--2-.jpg" alt="D&#xE9;ployer un syst&#xE8;me de backup centralis&#xE9; avec UrBackup"><p>La gestion des backups peut rapidement devenir un probl&#xE8;me lorsque l&apos;on g&#xE8;re un grand nombre de serveurs, aussi bien pour g&#xE9;rer l&apos;espace de stockage que pour le suivi des backups. Je vais donc vous pr&#xE9;senter la solution UrBackup.</p>
<p>UrBackup est une solution de sauvegarde client/serveur qui propose plusieurs syst&#xE8;me de backup, sous forme d&apos;image disque ou par r&#xE9;pertoire de fichiers.<br>
Les principaux avantages de cette solution sont sa facilit&#xE9; de d&#xE9;ploiement, sa gestion de l&apos;espace de stockage avec des backups complets ou incr&#xE9;mentaux. Mais &#xE9;galement sa compabilit&#xE9; avec Windows, MacOS et Linux.</p>
<p>Dans mon cas, UrBackup me sert &#xE0; r&#xE9;aliser des sauvegardes de serveurs web. Il est install&#xE9; sur un serveur Kimsufi KS-2A avec 2To de stockage command&#xE9; dans le cadre d&apos;une offre &#xE0; 8.99&#x20AC;/mois.</p>
<p>Mais il est tout &#xE0; fait possible d&apos;utiliser directement le backup storage propos&#xE9; avec les serveurs OVH ou Online.net. Il suffit pour cela de monter le backup storage en NFS et de d&#xE9;finir l&apos;emplacement des sauvegardes UrBackup durant l&apos;installation.</p>
<h2 id="installationduserveururbackup">Installation du serveur UrBackup</h2>
<p>L&apos;installation du serveur UrBackup peut se faire sur Windows, Linux mais &#xE9;galement sur les distributions comme FreeNas, OpenMediaVault ainsi que sur des NAS QNAP.</p>
<p>Vous pouvez trouver les instructions d&apos;installation sur la page <a href="http://www.urbackup.org/download.html">Downloads</a> du site Urbackup. Dans mon cas j&apos;ai choisi d&apos;utiliser Ubuntu 16.04 LTS qui permet l&apos;installation via les d&#xE9;p&#xF4;ts PPA.</p>
<p>On commence donc par ajouter le d&#xE9;p&#xF4;t puis on installe le paquet urbackup-server :</p>
<pre><code class="language-bash">sudo add-apt-repository ppa:uroni/urbackup  
sudo apt-get update  
sudo apt-get install urbackup-server
</code></pre>
<p>Durant le processus, vous serez inviter &#xE0; choisir le r&#xE9;pertoire dans lequel UrBackup va r&#xE9;aliser les sauvegardes. On peut ensuite acc&#xE9;der &#xE0; l&apos;interface d&apos;administration via l&apos;adresse <a href="http://IP-DU-SERVEUR:55414">http://IP-DU-SERVEUR:55414</a>.</p>
<p>Les r&#xE9;glages principaux &#xE0; d&#xE9;finir apr&#xE8;s l&apos;installation sont :</p>
<ul>
<li>la cr&#xE9;ation d&apos;un utilisateur pour prot&#xE9;ger l&apos;acc&#xE8;s &#xE0; l&apos;interface</li>
<li>le type de sauvegarde que vous souhaitez utiliser (image, fichiers, les deux)</li>
<li>le dossier par d&#xE9;faut &#xE0; sauvegarder</li>
<li>la fr&#xE9;quence et le nombre de sauvegardes</li>
<li>le type de r&#xE9;seau (local ou sur internet)</li>
<li>les informations smtp pour l&apos;envoi des notifications</li>
</ul>
<p>Pour mes serveurs web, je n&apos;utilise pour le moment que les sauvegardes de fichiers et le dossier par d&#xE9;faut &#xE0; sauvegarder est /var/www.</p>
<!--kg-card-end: markdown--><hr><!--kg-card-begin: markdown--><h2 id="installationduclienturbackup">Installation du client UrBackup</h2>
<p>Pour linux, l&apos;installation du client UrBackup se fait via une seule ligne de commande :</p>
<pre><code class="language-bash">TF=`mktemp` &amp;&amp; wget &quot;https://hndl.urbackup.org/Client/2.3.4/UrBackup%20Client%20Linux%202.3.4.sh&quot; -O $TF &amp;&amp; sudo sh $TF; rm $TF
</code></pre>
<p>Durant l&apos;installation, il vous sera demand&#xE9; quel type de sauvegarde vous souhaitez utiliser pour la r&#xE9;alisation d&apos;image disque (dans le cas o&#xF9; le syst&#xE8;me de fichier le permet). Par la suite la mise &#xE0; jour du client sera automatique.<br>
Il est n&#xE9;cessaire d&apos;ouvrir les ports 35621, 35622 et 35623 pour pouvoir connecter votre client au serveur Urbackup.</p>
<p>Si vous utilisez UFW, vous pouvez les ouvrir uniquement vers l&apos;IP de votre serveur Urbackup :</p>
<pre><code class="language-bash">ufw allow from IP.DE.VOTRE.SERVEUR-URBACKUP to any port 35621
ufw allow from IP.DE.VOTRE.SERVEUR-URBACKUP to any port 35622
ufw allow from IP.DE.VOTRE.SERVEUR-URBACKUP to any port 35623
</code></pre>
<p>D&#xE8;s la premi&#xE8;re connexion au serveur (apr&#xE8;s avoir ajout&#xE9; l&apos;IP ou le hostname du client via l&apos;interface UrBackup Server), une premi&#xE8;re sauvegarde compl&#xE8;te du client sera r&#xE9;alis&#xE9;e, en fonction des options que vous aurez d&#xE9;finie. Les sauvegardes suivantes seront incr&#xE9;mentielles.</p>
<p>La configuration du client urbackup se trouve dans le fichier <code>/etc/default/urbackupclient</code>, dans lequel vous pouvez changer l&apos;option <code>RESTORE=&quot;disabled&quot;</code> par <code>RESTORE=&quot;server-confirms&quot;</code> pour autoriser la restauration d&apos;un backup depuis l&apos;interface d&apos;administration de UrBackup Server.</p>
<p>Modification qui peut &#xEA;tre effectu&#xE9;e avant de connecter le client au serveur avec la commande :</p>
<pre><code class="language-bash">sed -i &apos;s/RESTORE=disabled/RESTORE=&quot;server-confirms&quot;/&apos; /etc/default/urbackupclient
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="sauvegardervosbasesdedonnes">Sauvegarder vos bases de donn&#xE9;es</h2>
<p>Si vous utilisez Urbackup en mode sauvegarde de fichiers, vous allez s&#xFB;rement souhaitez sauvegarder vos bases de donn&#xE9;es. Et pour cela il y a deux solutions avec UrBackup.</p>
<h3 id="utilisermysqldump">Utiliser mysqldump</h3>
<p>C&apos;est la solution la plus simple &#xE0; mettre en place, puisque vous pouvez utiliser un cronjob pour ex&#xE9;cuter un script bash r&#xE9;guli&#xE8;rement.<br>
J&apos;utilise par exemple un script modifi&#xE9; par mes soins disponible sur Github, que vous pouvez t&#xE9;l&#xE9;charger et utiliser librement. Voici les &#xE9;tapes &#xE0; suivre :</p>
<ol>
<li>T&#xE9;l&#xE9;charger le script et le rendre ex&#xE9;cutable</li>
</ol>
<pre><code class="language-bash">wget -O mysqldump.sh vtb.cx/mysqldump
chmod +x mysqldump.sh
</code></pre>
<ol start="2">
<li>D&#xE9;finir les identifiants root pour MySQL dans .my.cnf<br>
Pour acc&#xE9;der &#xE0; vos bases de donn&#xE9;es, le script utilise les identifiants stock&#xE9;s dans le fichier ~/my.cnf. Ce fichier doit ressembler &#xE0; :</li>
</ol>
<pre><code class="language-bash">[client]
user = root
password = votremotdepasse
</code></pre>
<ol start="3">
<li>ajouter un cronjob<br>
On ajoute une crontab en utilisant la commande <code>crontab -e</code>, puis en ajoutant la ligne :</li>
</ol>
<pre><code class="language-bash">@daily /root/mysqldump.sh &gt; /dev/null
</code></pre>
<p>Il ne reste plus qu&apos;&#xE0; enregister la modification et le cronjob r&#xE9;alisera ainsi un backup journalier de chacune des bases de donn&#xE9;es, stock&#xE9; par d&#xE9;faut dans le dossier /var/www/mysqldump.</p>
<h3 id="utiliserperconaxtrabackuppourdessauvegardesincrmentielles">Utiliser Percona XtraBackup pour des sauvegardes incr&#xE9;mentielles</h3>
<p>UrBackup a une fois de plus pr&#xE9;vu tout ce qu&apos;il vous faut, puisqu&apos;il permet de r&#xE9;aliser des sauvegardes incr&#xE9;mentales de votre serveur MySQL, en utilisant l&apos;outil Percona XtraBackup qui r&#xE9;alise des sauvegardes &#xE0; chaud du dossier /var/lib/mysql que vous pouvez restaurer en quelques minutes.</p>
<p>Avant de pouvoir utiliser XtraBackup, il vous faut installer le paquet percona-xtrabackup. Pour MariaDB, le d&#xE9;p&#xF4;t apt est automatiquement ajout&#xE9; par le script mariadb_repo_setup.</p>
<p>Exemple pour MariaDB 10.1</p>
<pre><code class="language-bash">curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup \
| sudo bash -s -- --mariadb-server-version=10.1 --skip-maxscale
sudo apt update &amp;&amp; sudo apt install percona-xtrabackup -y
</code></pre>
<p>Exemple pour MariaDB 10.2</p>
<pre><code class="language-bash">curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup \
| sudo bash -s -- --mariadb-server-version=10.2 --skip-maxscale
sudo apt update &amp;&amp; sudo apt install percona-xtrabackup-24 -y
</code></pre>
<p>Une fois XtraBackup install&#xE9;, il faut &#xE9;diter le fichier <code>/usr/local/etc/urbackup/mariadbxtrabackup.conf</code>, dans lequel il faut remplacer <code>MARIADB_XTRABACKUP_ENABLED=0</code> par <code>MARIADB_XTRABACKUP_ENABLED=1</code> et d&#xE9;finir le mot de passe root de MySQL &#xE0; la fin du fichier.</p>
<p>On peut ensuite activer la configuration avec la commande :</p>
<pre><code class="language-bash">/usr/local/share/urbackup/scripts/setup-mariadbbackup
</code></pre>
<p>Et v&#xE9;rifier que la sauvegarde fonctionne avec la commande :</p>
<pre><code class="language-bash">/usr/local/share/urbackup/scripts/mariadbxtrabackup &gt; /dev/null
</code></pre>
<p>Pour restaurer la derni&#xE8;re sauvegarde, vous pourrez utiliser la commande :</p>
<pre><code class="language-bash">/usr/local/share/urbackup/scripts/restore-mariadb
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Installer Isso sur Ubuntu 16.04 LTS pour remplacer disqus]]></title><description><![CDATA[Dans ce tutoriel, nous allons voir comment installer Isso, un gestionnaire de commentaires open-source afin de remplacer disqus]]></description><link>https://jesuisadmin.fr/installer-isso-sur-ubuntu-16-04-lts-remplacer-disqus/</link><guid isPermaLink="false">5c3f5221007fc1214a0a72e6</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[Self-hosting]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Thu, 19 Oct 2017 16:55:39 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2018/07/Installer-Isso-sur-Ubuntu-16.04-LTS.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jesuisadmin.fr/content/images/2018/07/Installer-Isso-sur-Ubuntu-16.04-LTS.jpg" alt="Installer Isso sur Ubuntu 16.04 LTS pour remplacer disqus"><p>Ayant r&#xE9;cemment migr&#xE9; de WordPress vers Ghost, j&apos;ai souhait&#xE9; utiliser une autre solution que Disqus pour la gestion des commentaires sur le blog, de pr&#xE9;f&#xE9;rence self-hosted. Je me suis donc tourn&#xE9; vers Isso, un syst&#xE8;me de gestion de commentaires open-source permettant de g&#xE9;rer plusieurs sites.</p>
<p>Nous allons dans ce tutoriel voir comment installer Isso et comment le configurer pour g&#xE9;rer les commentaires de plusieurs sites.</p>
<h2 id="installerisso">Installer Isso</h2>
<p>Pour l&apos;installation, on commence par cr&#xE9;er un nouvel utilisateur avec les droits sudo. De la m&#xEA;me fa&#xE7;on que pour installer ghost via la ghost-cli</p>
<pre><code class="language-bash">adduser isso
adduser isso sudo
</code></pre>
<p>On se connecte ensuite avec cet utilisateur</p>
<pre><code class="language-bash">su - isso
</code></pre>
<p>Et on commence par installer les paquets n&#xE9;cessaires pour isso</p>
<pre><code class="language-bash">sudo apt-get install python3-setuptools python3-virtualenv python3-dev sqlite3 build-essential
</code></pre>
<p>On d&#xE9;finit alors notre environnement pour python.</p>
<pre><code class="language-bash">python3 -m venv /opt/isso
source /opt/isso/bin/activate
</code></pre>
<p>Il y a plusieurs options pour installer isso, mais la plus simple &#xE9;tant visiblement via pip, c&apos;est cette derni&#xE8;re que j&apos;ai utilis&#xE9; :</p>
<pre><code class="language-bash">pip install isso
</code></pre>
<p>On peut ensuite sortir du virtualenv avec la commande :</p>
<pre><code class="language-bash">deactivate
</code></pre>
<p>Pour pouvoir utiliser directement la commande <code>isso</code> depuis le virtualenv, il suffit de cr&#xE9;er un symlink entre <code>/opt/isso/bin/isso</code> et <code>/usr/local/bin/isso</code> :</p>
<pre><code class="language-bash">ln -s /opt/isso/bin/isso /usr/local/bin/isso
</code></pre>
<p>Pour mettre &#xE0; jour isso, il suffit de faire :</p>
<pre><code class="language-bash">source /opt/isso/bin/activate
pip install --upgrade isso
deactivate
</code></pre>
<h2 id="configurerisso">Configurer Isso</h2>
<p>Nous avons termin&#xE9; l&apos;installation d&apos;Isso, et nous allons pouvoir passer &#xE0; la configuration. Pour cela on cr&#xE9;er un fichier yourwebsite1.cfg et yourwebsite2.cfg dans le dossier de Isso dans lesquel nous allons d&#xE9;finir les options suivantes :</p>
<ul>
<li>la base de donn&#xE9;e</li>
<li>la mod&#xE9;ration</li>
<li>le serveur SMTP</li>
</ul>
<p>Pour construire vos fichiers de configuration, utilisez l&apos;exemple officiel disponible sur github : <a href="https://github.com/posativ/isso/blob/master/share/isso.conf">https://github.com/posativ/isso/blob/master/share/isso.conf</a><br>
Comme vous pourrez le voir, il nous faut cr&#xE9;er un dossier /var/lib/isso et cr&#xE9;er un fichier vide pour chacun de nos sites :</p>
<pre><code class="language-bash">mkdir -p /var/lib/isso &amp;&amp; cd /var/lib/isso
touch comments.yourwebsite1.db comments.yourwebsite2.db
</code></pre>
<p>On pourra donc compl&#xE9;ter la section g&#xE9;n&#xE9;rale dans la configuration de Isso :</p>
<pre><code class="language-bash">[general]
name = yourwebsite1
host = http://yourwebsite1.tld/
dbpath = /var/lib/isso/yourwebsite1.db
</code></pre>
<h3 id="importerdescommentaires">Importer des commentaires</h3>
<p>Avant de d&#xE9;marrer Isso, vous pouvez importer des commentaires provenant de WordPress ou de Disqus. Pour cela utililsez la commande suivante :</p>
<pre><code class="language-bash">isso -c /path/to/isso.cfg import /path/to/disqus-or-wordpress.xml
</code></pre>
<p>L&apos;op&#xE9;ration est &#xE0; r&#xE9;aliser pour chaque site.</p>
<h3 id="configurationduserveurgunicorn">Configuration du serveur Gunicorn</h3>
<p>Pour ex&#xE9;cuter Isso en multi-site, nous avons besoin d&apos;installer Gunicorn. Cela se fait avec pip :</p>
<pre><code class="language-bash">pip install gunicorn
</code></pre>
<p>On peut d&#xE9;sormais lancer Isso, pour cela on d&#xE9;finit tout d&apos;abord l&apos;emplacement de nos fichiers de configurations via la commande :</p>
<pre><code class="language-bash">export ISSO_SETTINGS=&quot;/etc/isso.d/yourwebsite1.cfg;/etc/isso.d/yourwebsite2.cfg&quot;
</code></pre>
<p>Puis on lance Gunicorn :</p>
<pre><code class="language-bash">gunicorn isso.dispatch -b localhost:8080
</code></pre>
<h2 id="configurationdenginx">Configuration de Nginx</h2>
<p>Le serveur Gunicorn &#xE9;coute sur le port 8080, accessible uniquement localement, nous allons donc utiliser Nginx en tant que reverse-proxy, pour rendre accessible notre syst&#xE8;me de commentaire via un sous-domaine, et installer un certificat SSL let&apos;s encrypt.</p>
<p>On installe donc Nginx si ce n&apos;est pas d&#xE9;j&#xE0; fait :</p>
<pre><code class="language-bash">wget -O - https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
sudo echo &quot;deb http://nginx.org/packages/ubuntu/ $(lsb_release -sc) nginx&quot; &gt; /etc/apt/sources.list.d/nginx.list
sudo apt update
sudo apt install nginx
</code></pre>
<p>Et on cr&#xE9;er notre vhost, ici sur le sous domaine comments.yourdomain.ltd</p>
<pre><code class="language-nginx">upstream app_server {
    server 127.0.0.1:8080 fail_timeout=0;
}
server {

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/comments.yourdomain.tld/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/comments.yourdomain.tld/privkey.pem;

    keepalive_timeout 5;

    server_name comments.yourdomain.tld;

    access_log /var/log/nginx/comments.yourdomain.tld.access.log rt_cache;
    error_log /var/log/nginx/comments.yourdomain.tld.error.log;

    location / {
        try_files $uri @proxy_to_app;
    }
    
    location @proxy_to_app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app_server;
    }
}
</code></pre>
<p>On installe ensuite acme.sh pour g&#xE9;n&#xE9;rer notre certificat SSL :</p>
<pre><code class="language-bash">wget -O -  https://get.acme.sh | sh
source ~/.bashrc
</code></pre>
<p>Et on g&#xE9;n&#xE8;re le certificat via le serveur standalone de validation certbot, en arr&#xEA;tant le service nginx pour lib&#xE9;rer le port 80 et 443, durant la validation.</p>
<pre><code class="language-bash">acme.sh --issue -d comments.yourdomain.tld --keylength ec-384 --standalone --pre-hook &quot;systemctl stop nginx&quot; --post-hook &quot;systemctl start nginx&quot;
</code></pre>
<p>Il ne reste plus qu&apos;&#xE0; d&#xE9;ployer le certificat :</p>
<pre><code class="language-bash"># cr&#xE9;er le r&#xE9;pertoire
mkdir -p /etc/letsencrypt/live/comments.yourdomain.tld

# d&#xE9;ployer le certificat
acme.sh --install-cert -d comments.yourdomain.tld --ecc \
--cert-file /etc/letsencrypt/live/comments.yourdomain.tld/cert.pem \
--key-file /etc/letsencrypt/live/comments.yourdomain.tld/key.pem \
--fullchain-file /etc/letsencrypt/live/comments.yourdomain.tld/fullchain.pem \
--reloadcmd &quot;service nginx restart&quot;
</code></pre>
<p>Et &#xE0; ajouter la configuration suivante dans votre vhost Nginx :</p>
<pre><code class="language-nginx">    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate/etc/letsencrypt/live/comments.yourdomain.tld/fullchain.pem;
    ssl_certificate_key    /etc/letsencrypt/live/comments.yourdomain.tld/key.pem;
    ssl_trusted_certificate/etc/letsencrypt/live/comments.yourdomain.tld/cert.pem;
</code></pre>
<h3 id="lancerissoautomatiquemement">Lancer Isso automatiquemement</h3>
<p>Pour lancer Isso automatiquement au d&#xE9;marrage de votre machine, nous allons le d&#xE9;clarer en tant que service systemd.<br>
On cr&#xE9;er pour cela un fichier <code>/lib/systemd/system/isso.service</code> avec le contenu suivant :</p>
<pre><code class="language-bash">[Unit]
Description=lightweight Disqus alternative

[Service]
User=isso
Group=isso
Environment=&quot;ISSO_SETTINGS=/etc/isso.d/foo.example.cfg;/etc/isso.d/other.bar.cfg&quot;
ExecStart=/usr/local/bin/gunicorn --log-file /var/log/isso.log isso.dispatch -b localhost:8080
SyslogIdentifier=isso

[Install]
WantedBy=multi-user.target
</code></pre>
<p>Il suffit alors d&apos;activer le service avec systemd pour cr&#xE9;er un symkink entre le dossier /lib/systemd/system et /etc/systemd/system avant de le lancer.</p>
<pre><code class="language-bash">systemctl enable isso.service
systemctl start isso.service
</code></pre>
<h2 id="ajouterissosonsite">Ajouter Isso &#xE0; son site</h2>
<p>Si vous tentez d&apos;acc&#xE9;der au sous-domaine d&apos;Isso, il vous affichera les nom des diff&#xE9;rents sites sur lesquels vous pouvez installer le module de commentaire, sous la forme :</p>
<pre><code>/yourblogname
/yourblogname2
/yourblogname3
</code></pre>
<p>Pour installer Isso sur votre blog, il vous suffit d&apos;ins&#xE9;rer le code suivant, en rempla&#xE7;ant <code>yourblogname</code> par le nom de votre blog :</p>
<pre><code class="language-html">&lt;script data-isso=&quot;//comments.example.tld/yourblogname/&quot;
        src=&quot;//comments.example.tld/yourblogname/js/embed.min.js&quot;&gt;&lt;/script&gt;

&lt;section id=&quot;isso-thread&quot;&gt;&lt;/section&gt;
</code></pre>
<p>Vous pouvez &#xE9;galement ajouter des param&#xE8;tres via ce code, dont la liste est disponible dans la <a href="https://posativ.org/isso/docs/configuration/client/">documentation officielle de Isso</a>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Comment avoir une excellente configuration HTTPS en 2017 ?]]></title><description><![CDATA[Cet article s'adresse principalement aux administrateurs système et permet de faire le point sur les configuration https en 2017.]]></description><link>https://jesuisadmin.fr/comment-avoir-une-excellente-configuration-https-en-2017/</link><guid isPermaLink="false">5c3f5221007fc1214a0a72e8</guid><category><![CDATA[Nginx]]></category><category><![CDATA[Sysadmin]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Fri, 13 Oct 2017 00:05:47 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2017/10/https-2017-wonderfall.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jesuisadmin.fr/content/images/2017/10/https-2017-wonderfall.png" alt="Comment avoir une excellente configuration HTTPS en 2017 ?"><p>Article &#xE9;crit par  <a href="https://masto.targaryen.house/@wonder">Wonderfall</a>. Suite &#xE0; la fermeture de son blog, j&apos;ai souhait&#xE9; (avec son accord) remettre en ligne ce dernier pour que son contenu reste accessible.</p>
<p>Cet article est adress&#xE9; principalement aux administrateurs syst&#xE8;me, ou devrais-je plut&#xF4;t dire aux administrateurs <strong>de</strong> syst&#xE8;me puisque parmi vous il y a non seulement des personnes qui en ont fait leur m&#xE9;tier, et d&apos;autres personnes qui en font leur passion (comme moi, peut-&#xEA;tre...). Par manque de temps et surtout parce que je parlerai des outils sur lesquels j&apos;ai mis la main, j&apos;utiliserai un seul serveur web au cours de cet article, le bien connu <code>nginx</code>. Cet article reprendra en partie un ancien article de mon pr&#xE9;c&#xE9;dent blog : <a href="https://raw.githubusercontent.com/Wonderfall/wonderfall.xyz/master/Des%20certificats%20ECDSA%20avec%20Let&apos;s%20Encrypt.md"><em>Des certificats ECDSA avec Let&apos;s Encrypt</em></a>.</p>
<h2 id="1mettonsleschosesenordre">1. Mettons les choses en ordre...</h2>
<p>Jetez un coup d&apos;oeil &#xE0; l&apos;image d&apos;en-t&#xEA;te de l&apos;article. Vous vous y reconnaitrez peut-&#xEA;tre. Ou peut-&#xEA;tre pas. Certains parmi vous sont compl&#xE8;tement perdus, et ces noms ne leurs &#xE9;voqueront rien. D&apos;autres sont d&#xE9;j&#xE0; &#xE0; l&apos;aise, savent <strong>grossi&#xE8;rement</strong> &#xE0; quoi cela correspond. Eh bien, j&apos;en fais moi-m&#xEA;me partie. Dans un esprit d&apos;humilit&#xE9;, je reconnais ne pas avoir les capacit&#xE9;s n&#xE9;cessaires pour comprendre &#xE0; 100% les notions conceptuelles, math&#xE9;matiques, et toutes les subtilit&#xE9;s derri&#xE8;re les technologies que je mentionnerai. Cela dit, &#xE7;a ne m&apos;emp&#xEA;chera pas de tenter, au moins, de vulgariser et de montrer des exemples. Ma vulgarisation sera approximative, elle comportera peut-&#xEA;tre des erreurs, je l&apos;admets. Mais tant que j&apos;estime ne pas mettre en danger la s&#xE9;curit&#xE9; des personnes (au contraire...), et tant que vous avez compris ce que je voulais dire dans ce paragraphe, je me sens libre de continuer &#xE0; &#xE9;crire cet article.</p>
<p>Ce qui m&apos;a pouss&#xE9; &#xE0; le faire, c&apos;est que le nombre de demandes d&apos;aide &#xE0; propos de la configuration HTTPS est devenu croissant. <a href="https://psychedeli.cat/mastodon/">Vous vous souvenez de Mastodon ?</a> Aujourd&apos;hui le nombre d&apos;instances est bien plus important, et plus d&apos;instances, &#xE7;a veut dire aussi plus de configurations. Le <a href="https://instances.mastodon.xyz/list">principal site</a> qui recense les diff&#xE9;rentes instances classe d&#xE9;sormais les instances en fonction de leur configuration HTTPS, &#xE0; travers <a href="https://tls.imirhil.fr/">Cryptcheck</a> et depuis peu l&apos;<a href="https://observatory.mozilla.org/">Observatoire Mozilla</a> (qui comprend Cryptcheck &#xE9;galement puisqu&apos;il fait appel &#xE0; des tests tiers). &#xC9;videmment, c&apos;est la folie : tout le monde veut absolument avoir son instance le plus haut possible dans la liste, donc il faut &#xE0; tout prix mieux s&#xE9;curiser... si seulement c&apos;&#xE9;tait le cas pour les banques aussi, mais passons.</p>
<p>Et puis, certains iraient bien se masturber un coup sur un A+ de Cryptcheck/Qualys. Mais, pourquoi pas ? Ces questions ne me concernent pas. On atteindra cette finalit&#xE9; si c&apos;est ce que vous voulez, vos motivations sont les v&#xF4;tres. Quand je parle d&apos;une excellente configuration, c&apos;est effectivement une configuration qui vous donnera une note maximale sur ces outils. Dans le titre, <strong>je n&apos;ai pas parl&#xE9; de &quot;comment configurer HTTPS&quot;</strong>, nuance. Mais il ne faut pas non plus suivre mon tutoriel n&apos;importe comment, parce que premi&#xE8;rement, la compatibilit&#xE9; des clients en prend forc&#xE9;ment un coup, et deuxi&#xE8;mement, certains m&#xE9;canismes tels que HPKP peuvent vous casser la gueule si vous les utilisez n&apos;importe comment. Lisez, puis faites. Pas l&apos;inverse...</p>
<p><strong>D&apos;avance, j&apos;annonce que je ne me prendrai pas la t&#xEA;te avec la compatibilit&#xE9;. Donc ne venez pas me dire que votre site ne fonctionne pas sur X ou Y, parce que je vous aurais pr&#xE9;venu.</strong></p>
<h2 id="2choixdelabibliothquessltls">2. Choix de la biblioth&#xE8;que SSL/TLS</h2>
<p>Les biblioth&#xE8;ques SSL/TLS fournissent une impl&#xE9;mentation d&apos;algorithmes cryptographiques et de protocoles de communication s&#xE9;curis&#xE9;s (les diff&#xE9;rentes versions de SSL et TLS : SSLv2, SSLv3, TLS 1.0, TLS 1.1, TLS 1.2, TLS 1.3..). Aujourd&apos;hui, 3 biblioth&#xE8;ques sont compatibles avec <code>nginx</code> :</p>
<ul>
<li><strong>OpenSSL</strong> : la plus connue, et la plus pr&#xE9;sente.</li>
<li><strong>LibreSSL</strong> : fork d&apos;OpenSSL par OpenBSD.</li>
<li><strong>BoringSSL</strong> : fork d&apos;OpenSSL par Google.</li>
</ul>
<p>Il faut dire que <a href="http://heartbleed.com/">Heartbleed</a> a port&#xE9; en 2014 un coup &#xE0; la popularit&#xE9; d&apos;OpenSSL. Non pas que ce fut la premi&#xE8;re faille d&#xE9;couverte, loin de l&#xE0;, mais il y a eu une prise de conscience sur la qualit&#xE9; du code d&apos;OpenSSL et des impl&#xE9;mentations trop anciennes qui y sont pr&#xE9;sentes. OpenBSD fid&#xE8;le &#xE0; sa r&#xE9;putation, cr&#xE9;a son fork LibreSSL dans le but de litt&#xE9;ralement nettoyer OpenSSL et de le d&#xE9;barrasser d&apos;algorithmes d&#xE9;pass&#xE9;s et dangereux d&apos;utilisation. Aujourd&apos;hui, il n&apos;y a pas seulement OpenBSD qui utilise LibreSSL &#xE0; la place d&apos;OpenSSL en tant que biblioth&#xE8;que par d&#xE9;faut du syst&#xE8;me. En effet, d&apos;autres distributions ont saut&#xE9; le pas, y compris macOS.</p>
<p>Quant &#xE0; Google, ce n&apos;est pas vraiment la m&#xEA;me raison qui a conduit &#xE0; cr&#xE9;er BoringSSL. En effet, ils maintenaient d&#xE9;j&#xE0; une version d&apos;OpenSSL interne avec de nombreux patchs, Heartbleed a seulement &#xE9;t&#xE9; l&apos;&#xE9;l&#xE9;ment d&#xE9;clencheur pour repartir d&apos;une page blanche, et c&apos;est bien ce travail qui a &#xE9;t&#xE9; men&#xE9;. Peu importe si les mises &#xE0; jour cassent la compatibilit&#xE9; API/ABI avec d&apos;autres logiciels comme <code>nginx</code>, Google met de toute fa&#xE7;on en garde :</p>
<p><em>EN : Although BoringSSL is an open source project, it is not intended for general use, as OpenSSL is. We don&apos;t recommend that third parties depend upon it. Doing so is likely to be frustrating because there are no guarantees of API or ABI stability.</em></p>
<p><em>FR : Bien que BoringSSL soit un projet open-source, il n&apos;est pas destin&#xE9; &#xE0; un usage g&#xE9;n&#xE9;ral, comme OpenSSL l&apos;est. Nous ne recommandons pas que les tierces parties d&#xE9;pendent dessus. Faire ainsi sera probablement source de frustrations puisqu&apos;il n&apos;y aucune garantie de la stabilit&#xE9; de l&apos;API/ABI.</em></p>
<p>En pratique, BoringSSL fonctionne avec nginx et les d&#xE9;veloppeurs ont accept&#xE9; de faire quelques efforts pour satisfaire les quelques curieux qui souhaitent l&apos;utiliser de cette fa&#xE7;on. En revanche, <strong>pas de support de OCSP stapling</strong>.</p>
<blockquote>
<p>En pratique, qu&apos;est-ce que je dois choisir ?</p>
</blockquote>
<p>Utiliser la biblioth&#xE8;que de son syst&#xE8;me est une bonne chose car les mises &#xE0; jour sont simples, donc il n&apos;est pas n&#xE9;cessaire de recompiler nginx &#xE0; chaque fois. Sur Debian, &#xE7;a reste pour le moment OpenSSL. La version de Jessie est maintenue, mais elle est fig&#xE9;e du point de vue technologique, donc en pratique, on aura pas quelques algorithmes r&#xE9;cents (m&#xEA;me si on peut s&apos;en passer) et quelques features int&#xE9;ressantes compatibles avec nginx, mais n&#xE9;cessitant une version d&apos;OpenSSL sup&#xE9;rieure. La version d&apos;OpenSSL fournie par Stretch (1.1.0) est aujourd&apos;hui la version la plus r&#xE9;cente d&apos;OpenSSL.</p>
<p>Si vous &#xEA;tes pr&#xEA;ts &#xE0; ne pas utiliser une biblioth&#xE8;que syst&#xE8;me, je vous recommande sans h&#xE9;siter <strong>LibreSSL</strong>, pour les raisons que j&apos;ai &#xE9;nonc&#xE9;es plus haut. OpenBSD est une &#xE9;quipe de confiance, vraiment (et m&#xEA;me un peu trop) perfectionniste. BoringSSL est celui qui vous proposera le plus de nouveaut&#xE9;s, dont l&apos;utilisation des versions drafts de TLS 1.3, des exp&#xE9;rimentations d&apos;algorithmes <em>quantum proofs</em>  qui peuvent &#xEA;tre retir&#xE9;es du jour au lendemain par Google (comme <a href="https://www.imperialviolet.org/2016/11/28/cecpq1.html">CECPQ1</a>), etc. mais de mon point de vue, ce n&apos;est vraiment pas quelque chose &#xE0; utiliser sur une machine en production, il n&apos;y a m&#xEA;me pas de versioning, &#xE0; utiliser plus pour la curiosit&#xE9; donc.</p>
<p>Si vous avez fait le choix d&apos;utiliser une autre biblioth&#xE8;que que la biblioth&#xE8;que utilis&#xE9;e par d&#xE9;faut par le syst&#xE8;me, vous allez devoir recompiler nginx. Inutile que je passe mon temps &#xE0; faire un tutoriel, il y en a... plein : <a href="https://mondedie.fr/d/7621-Tuto-Compiler-la-derniere-version-de-nginx-avec-LibreSSL">ici (2015)</a> pour LibreSSL, <a href="https://raw.githubusercontent.com/Wonderfall/wonderfall.xyz/master/Compiler%20nginx%20avec%20BoringSSL.md">l&#xE0; (2016)</a> pour BoringSSL (je me fais un peu de publicit&#xE9;, je sais). Mais si vous ne voulez pas vous prendre la t&#xEA;te, je vous propose des scripts voire des images Docker :</p>
<ul>
<li><a href="https://github.com/Angristan/nginx-autoinstall">Angristan/nginx-autoinstall</a> : compile nginx sur Debian, avec le choix entre OpenSSL et LibreSSL et d&apos;autres modules !</li>
<li><a href="https://hub.docker.com/r/wonderfall/boring-nginx/">wonderfall/boring-nginx</a> : une image Docker bas&#xE9;e sur Alpine Linux, avec nginx compil&#xE9; depuis les sources avec BoringSSL.</li>
<li><a href="https://hub.docker.com/r/xataz/nginx/">xataz/nginx</a> : une image Docker bas&#xE9;e sur Alpine Linux qui installe simplement nginx, mais Alpine Linux utilise LibreSSL par d&#xE9;faut.</li>
<li><a href="https://github.com/ajhaydock/BoringNginx">ajhaydock/BoringNginx</a> : des scripts pour Debian/CentOS et une image Docker bas&#xE9;e sur CentOS pour utiliser nginx avec BoringSSL.</li>
</ul>
<h2 id="3dabordlescertificats">3. D&apos;abord, les certificats !</h2>
<h3 id="asavoirunpeudequoionparle">a. Savoir (un peu) de quoi on parle</h3>
<p>Inutile de s&apos;attaquer &#xE0; la configuration d&apos;HTTPS sans passer par la g&#xE9;n&#xE9;ration de certificats. Mais d&apos;abord, pourquoi parle-t-on de certificats ? Deux mots pour d&#xE9;crire les buts d&apos;HTTPS : <strong>chiffrement</strong> et <strong>authenticit&#xE9;</strong>. Ce dernier point repose sur la certification de la cl&#xE9; publique avec un certificat (d&apos;un certain format nomm&#xE9; X.509) sign&#xE9; par une autorit&#xE9; connue (CA pour Certificate Authority). L&apos;ensemble des composantes visant &#xE0; g&#xE9;rer le cycle de vie des certificats porte le nom de <em>Public Key Infrastructure</em> (PKI). Les certificats d&#xE9;finissent les informations d&apos;appartenance de la cl&#xE9; publique, et d&#xE9;finissent &#xE9;galement les <em>hostnames</em> pour lesquels le certificat est valide. Par exemple, le certificat que j&apos;utilise pour psychedeli.cat est aussi valable pour isso.psychedeli.cat (un sous-domaine). Ces informations, vous pouvez les obtenir tr&#xE8;s simplement depuis votre navigateur qui lit ces informations depuis le certificat fourni par le serveur web.</p>
<p><img src="https://jesuisadmin.fr/content/images/2017/10/Screenshot_158.png" alt="Comment avoir une excellente configuration HTTPS en 2017 ?" loading="lazy"></p>
<p><em>Voyez l&apos;illustration comme un arbre, on part de la racine (= root), on passe par les branches ramifi&#xE9;es (certificats interm&#xE9;diaires) et enfin on atteint les feuilles (= leaf)</em></p>
<p>Nous allons ici utiliser Let&apos;s Encrypt, qui est comme je vous l&apos;ai dit une autorit&#xE9; de certification. Le principe est celui d&apos;une cha&#xEE;ne de confiance : le certificat root (fourni ici par ISRG) est le certificat originel, qui peut signer des certificats interm&#xE9;diaires (ceux de Let&apos;s Encrypt). Ces certificats interm&#xE9;diaires permettront de signer les certificats que nous utilisons tous les jours, qu&apos;on appelle aussi <em>leaf certificate</em>, ils permettront de signer des cl&#xE9;s temporaires d&#xE9;riv&#xE9;es de la paire cl&#xE9; publique/priv&#xE9;e qui sera utilis&#xE9;e pour s&#xE9;curiser une session. Ces certificats sont en fin de cha&#xEE;ne et ce sont eux que nous allons obtenir.</p>
<h3 id="bgnrerdescertificatsecdsap384">b. G&#xE9;n&#xE9;rer des certificats ECDSA (P-384)</h3>
<p>Plus pr&#xE9;cis&#xE9;ment, on va le faire d&apos;une fa&#xE7;on un peu plus manuelle mais loin d&apos;&#xEA;tre difficile. Cela nous permettra :</p>
<ul>
<li>De g&#xE9;rer nous-m&#xEA;me le renouvellement de la paire de cl&#xE9;s, ce qui nous permet d&apos;utiliser plus sereinement et efficacement HPKP.</li>
<li>D&apos;utiliser une autre approche d&apos;algorithme asym&#xE9;trique que RSA, ECDSA qui repose donc sur la cryptographie sur les courbes elliptiques (ECC).</li>
</ul>
<p>Les algorithmes de la famille des courbes elliptiques proposent d&apos;utiliser des cl&#xE9;s bien plus courtes, pour une s&#xE9;curit&#xE9; comparable &#xE0; celle offerte par RSA, et ils permettent &#xE9;galement  d&apos;&#xE9;conomiser des ressources. Voici des tests de performance que j&apos;ai r&#xE9;alis&#xE9;s avec ma machine :</p>
<pre><code class="language-bash">$ openssl speed rsa
                  sign    verify    sign/s verify/s
rsa 2048 bits 0.000549s 0.000025s   1821.4  39636.0
rsa 3072 bits 0.002579s 0.000051s    387.7  19471.4
rsa 4096 bits 0.005829s 0.000089s    171.5  11270.1

$ openssl speed ecdsa
                              sign    verify    sign/s verify/s
 256 bit ecdsa (nistp256)   0.0000s   0.0001s  25425.7  10819.8
 384 bit ecdsa (nistp384)   0.0002s   0.0007s   5749.2   1340.1
 521 bit ecdsa (nistp521)   0.0003s   0.0006s   3007.0   1659.5
</code></pre>
<p>ECDSA en soit n&apos;est pas directement comparable &#xE0; RSA, il doit &#xEA;tre associ&#xE9; &#xE0; des courbes elliptiques, et ici, ce sont les courbes NIST P-256, P-384, et P-521, qui sont utilis&#xE9;es. Le nombre de signatures/secondes est tout simplement bien meilleur avec ECDSA. Quid de la s&#xE9;curit&#xE9; ? Selon la NSA elle-m&#xEA;me, une cl&#xE9; ECC de taille 384 bits offrirait une s&#xE9;curit&#xE9; &#xE9;quivalente &#xE0; une cl&#xE9; RSA de taille 7680 bits.</p>
<p>Depuis F&#xE9;vrier 2016, Let&apos;s Encrypt peut &#xE9;mettre des certificats ECDSA (les choix sont P-256 et P-384). Malheureusement, le client officiel certbot ne le permet pas. Alors soit on peut utiliser d&apos;autres clients comme lego qui vont m&#xE2;cher le travail, soit on peut toujours utiliser certbot mais se d&#xE9;brouiller nous-m&#xEA;me pour g&#xE9;n&#xE9;rer notre cl&#xE9; priv&#xE9;e et notre demande de signature de certificat (dans un fichier CSR).</p>
<p>Commen&#xE7;ons par g&#xE9;n&#xE9;rer une cl&#xE9; priv&#xE9;e P-384 :</p>
<pre><code class="language-bash">openssl ecparam -genkey -name secp384r1 &gt; privkey.pem
</code></pre>
<p>On peut maintenant cr&#xE9;er un <strong>fichier CSR</strong>, qui contient toutes les informations relatives &#xE0; une demande de certificat. Comme moi, vous aurez peut-&#xEA;tre envie de g&#xE9;n&#xE9;rer un seul certificat pour plusieurs domaines, ceci peut se faire avec l&apos;extension SAN de X.509. Vous devez tout d&apos;abord copier le fichier <code>/etc/ssl/openssl.cnf</code> dans votre r&#xE9;pertoire de travail. Par exemple :</p>
<pre><code class="language-bash">cp /etc/ssl/openssl.cnf custom.cnf
</code></pre>
<p>On va modifier ce <code>custom.cnf</code> pour b&#xE9;n&#xE9;ficier de SAN et donc d&apos;un certificat valable, en gros, pour plusieurs domaines. Voici comment. Dans la section <code>[ req ]</code>, d&#xE9;commettez <code>req_extensions = v3_req</code>. Dans la section <code>[ v3_req ]</code>, ajoutez une nouvelle ligne : <code>subjectAltName = @alt_names</code>. Enfin, tout se passe dans <code>[ alt_names ]</code> pour ajouter vos domaines. Cette section n&apos;existe pas, il faut la cr&#xE9;er, par exemple tout &#xE0; la fin du fichier.</p>
<pre><code class="language-cnf"># custom.cnf

...

[ req ]
...
req_extensions = v3_req 

...

[ v3_req ]
...
subjectAltName = @alt_names
### OCSP Must-Staple, cf. plus loin
#tlsfeature = status_request             # OpenSSL &gt;=1.1.0
#1.3.6.1.5.5.7.1.24 = DER:30:03:02:01:05 # OpenSSL &lt;=1.0

...

[ alt_names ]
DNS.1 = domain.tld
DNS.2 = sub1.domain.tld
DNS.3 = sub2.domain.tld
...
DNS.n = subn.domain.tld
</code></pre>
<p>Pour chaque domaine souhait&#xE9;, on l&apos;associe &#xE0; la directive <code>DNS.k</code> o&#xF9; <code>k</code>, allant de <code>1</code> &#xE0; <code>n</code>, est incr&#xE9;ment&#xE9; sur chaque nouvelle ligne. Le <a href="https://en.wikipedia.org/wiki/SubjectAltName">SAN</a> que peut signer Let&apos;s Encrypt peut atteindre 100 (autrement dit, 100 domaines diff&#xE9;rents dans un seul certificat X.509), donc <code>n &lt;= 100</code>.</p>
<p>Enregistrez toutes ces modifications. Vous pouvez d&#xE9;sormais g&#xE9;n&#xE9;rer votre CSR avec la commande suivante :</p>
<pre><code class="language-bash">openssl req -new -sha256 -key privkey.pem -out csr.der -config custom.cnf
</code></pre>
<p>Rentrez des informations, mais laissez <em>Common Name</em> vide, et ne prot&#xE9;gez pas avec un mot de passe. Vous devez, &#xE0; ce stade, avoir en votre possession un <code>privkey.pem</code> et un <code>csr.der</code>.</p>
<p>Pour demander &#xE0; Let&apos;s Encrypt de nous &#xE9;mettre un certificat &#xE0; partir de notre demande, il suffit d&apos;utiliser <code>certbot</code> de cette fa&#xE7;on, avec l&apos;argument <code>--csr</code> pour fournir le CSR :</p>
<pre><code class="language-bash">certbot certonly --standalone --agree-tos -m admin@domain.tld \
    --csr /path/to/csr.der \
    --cert-path /path/to/cert.pem \
    --chain-path /path/to/chain.pem \
    --fullchain-path /path/to/fullchain.pem
</code></pre>
<p><em>Congrats!</em> Vous avez ainsi obtenu :</p>
<ul>
<li><strong>cert.pem</strong> : leaf certificate, contient entre autres la cl&#xE9; publique</li>
<li><strong>chain.pem</strong> : certificat de la cha&#xEE;ne Let&apos;s Encrypt</li>
<li><strong>fullchain.pem</strong> : concat&#xE9;nation des deux fichiers ci-dessus</li>
<li><strong>privkey.pem</strong> : cl&#xE9; priv&#xE9;e qu&apos;on avait g&#xE9;n&#xE9;r&#xE9;e tout &#xE0; l&apos;heure</li>
</ul>
<p><strong>DNS CAA</strong> : N&apos;oubliez pas d&apos;ajouter des <strong>enregistrements CAA</strong> dans votre zone DNS, ils permettent de d&#xE9;finir quel CA est autoris&#xE9; &#xE0; &#xE9;mettre un certificat pour le domaine <code>domain.tld</code>. Exemple pour ce domaine avec Let&apos;s Encrypt :</p>
<pre><code class="language-dns">domain.tld. CAA 0 issue &quot;letsencrypt.org&quot;
domain.tld. CAA 0 iodef &quot;mailto:admin@domain.tld&quot;
</code></pre>
<h2 id="4leprotocolessltls">4. Le protocole SSL/TLS</h2>
<p><strong>Je vous recommande la lecture de cet article : <a href="https://blog.imirhil.fr/2015/09/02/cryptcheck-verifiez-implementations-tls.html">CryptCheck, v&#xE9;rifiez vos impl&#xE9;mentations de TLS</a>.</strong></p>
<p>TLS et son <strong>anc&#xEA;tre SSL</strong> sont des protocoles qui sont utilis&#xE9;s pour s&#xE9;curiser des &#xE9;changes sur Internet. Par exemple conjointement avec HTTP pour donner HTTPS, le joli cadenas vert que vous avez dans votre barre d&apos;adresse et qui ne veut pas dire grand chose parfois. Ils sont utilis&#xE9;s pour l&apos;int&#xE9;grit&#xE9;, l&apos;authentification, la confidentialit&#xE9; (chiffrement), etc.</p>
<p>Aujourd&apos;hui, la compatibilit&#xE9; de TLS 1.2 est r&#xE9;pandue et il s&apos;agit de la derni&#xE8;re version datant de 2008. TLS 1.0 (quoique...) et 1.1 peuvent &#xEA;tre activ&#xE9;s en cas de besoin de compatibilit&#xE9;. Pour cet article je ne vais garder que TLS 1.2. Il est par contre hors de question d&apos;utiliser SSL. SSLv3 c&apos;est poubelle (POODLE), SSLv2 c&apos;est poubelle aussi (DROWN). D&apos;ailleurs j&apos;en profite : arr&#xEA;tez de v&#xE9;hiculer cet abus de langage comme quoi SSL/TLS = SSL. J&apos;aurais d&apos;ailleurs trouv&#xE9; &#xE7;a appr&#xE9;ciable si LibreSSL s&apos;appelait plut&#xF4;t LibreTLS, bref.</p>
<p>Donc on configure nginx pour n&apos;accepter que TLS 1.2 :</p>
<pre><code>ssl_protocols TLSv1.2;
</code></pre>
<p>TLS 1.3 arrivera incessamment sous peu, &#xE0; l&apos;heure o&#xF9; j&apos;&#xE9;crit cet article la 19e <em>draft</em> est encore tr&#xE8;s r&#xE9;cente. OpenSSL 1.1.0 aura droit &#xE0; TLS 1.3, tout comme LibreSSL qui devrait suivre. BoringSSL propose d&#xE9;j&#xE0; TLS 1.3, j&apos;ai test&#xE9; et &#xE7;a fonctionne m&#xEA;me s&apos;il faut l&apos;activer de force. Cela dit je ne peux pas vraiment recommander d&apos;utiliser un protocole au stade de brouillon et dont l&apos;impl&#xE9;mentation est encore trop jeune.</p>
<p>Histoire de faire une transition avec la partie suivante : avec TLS, tout commence par un <em>handshake</em> entre le client et le serveur. Le client envoie au serveur un message <em>ClientHello</em> avec une liste de suites cryptographiques support&#xE9;es et de protocoles (par exemple pour HTTP/2). Le serveur renvoie &#xE0; son tour un <em>ServerHello</em> avec entre autres, le choix de la suite cryptographique pour la session.</p>
<h2 id="5lasuitecryptographique">5. La suite cryptographique</h2>
<p>Vous auriez d&#xE9;j&#xE0; d&#xFB; entendre parler du terme <em>cipher</em>. Cela d&#xE9;signe pour ceux qui ne le savent pas un algorithme qui chiffre et d&#xE9;chiffre, c&apos;est une notion simple et cela existe depuis l&apos;antiquit&#xE9; en fait, puisque ce sont les d&#xE9;buts m&#xEA;me de la cryptographie. Mais avant que les 2 parties (ici, le serveur et le client) ne puissent chiffrer/d&#xE9;chiffrer leurs communications (par exemple du chiffrement par bloc avec un algorithme de cryptographie sym&#xE9;trique comme AES), il faut que les deux s&apos;&#xE9;changent une cl&#xE9; temporaire qui a &#xE9;t&#xE9; d&#xE9;riv&#xE9;e de la paire de cl&#xE9;s du certificat, pour une session. Donc la question est de le faire d&apos;une fa&#xE7;on s&#xE9;curis&#xE9;e &#xE0; travers Internet, et &#xE9;viter &#xE0; tout prix les attaques <em>MiTM</em>.</p>
<h3 id="alchangedecls">a. L&apos;&#xE9;change de cl&#xE9;s</h3>
<p>Pour cela, on pr&#xE9;f&#xE8;re l&apos;&#xE9;change de cl&#xE9;s Diffie-Hellman (DH) car il y a la propri&#xE9;t&#xE9; de <strong>confidentialit&#xE9; persistante</strong> (Forward Secrecy FS ou Perfect Forward Secrecy PFS) : si la cl&#xE9; priv&#xE9;e &#xE0; partir de laquelle les cl&#xE9;s de session ont &#xE9;t&#xE9; d&#xE9;riv&#xE9;s est compromise dans le futur, les cl&#xE9;s de session utilis&#xE9;es pr&#xE9;c&#xE9;demment pour des communications pass&#xE9;es ne seront pas compromises. On pourrait en parler math&#xE9;matiquement, mais l&#xE0; n&apos;est pas vraiment le sujet, des personnes plus comp&#xE9;tentes en parleront mieux que moi.</p>
<p>Avec TLS, on utilise <strong>DHE</strong> (Diffie-Hellman Exchange) ou <strong>ECDHE</strong> (Elliptic Curve Diffie-Hellman Exchange), ECDHE &#xE9;tant une variante de DHE. Sans rentrer dans les d&#xE9;tails, la diff&#xE9;rence est dans la g&#xE9;n&#xE9;ration des cl&#xE9;s : pour ce faire, DHE repose sur de l&apos;algorithmique modulaire (simple), tandis que ECDHE repose sur le probl&#xE8;me math&#xE9;matique des courbes elliptiques (alg&#xE9;briques). Ces courbes (NIST, Brainpool, X25519...) ont les b&#xE9;n&#xE9;fices que nous avons en partie &#xE9;voqu&#xE9; plus haut.</p>
<p>De mon c&#xF4;t&#xE9;, je vous recommande carr&#xE9;ment de n&apos;utiliser que ECDHE pour l&apos;&#xE9;change de cl&#xE9;s. Si vous voulez continuer &#xE0; utiliser DHE, g&#xE9;n&#xE9;rez au moins une bonne cl&#xE9; de taille 4096 bits. Souvenez-vous des cons&#xE9;quences d&apos;une cl&#xE9; trop petite, je parle bien s&#xFB;r de <a href="https://weakdh.org/">Logjam</a>. DHE souffre &#xE9;galement d&apos;un autre probl&#xE8;me qui consiste en une <em>MiTM</em> assez violente : il est possible de downgrade vers une suite <code>EXPORT</code> d&#xE8;s que le serveur la supporte, et m&#xEA;me si le client ne la supporte pas (merci <a href="https://social.imirhil.fr/@aeris">@aeris</a> pour cette remarque). <strong>Je persiste, utilisez donc seulement ECDHE</strong>, c&apos;est tr&#xE8;s bien et dans la continuit&#xE9; de cet article. Et il n&apos;y a rien de plus simple pour nginx puisqu&apos;il suffit de jouer avec la directive <code>ssl_ecdh_curve</code>.</p>
<p>On peut ne pas renseigner cette directive, c&apos;est possible, et dans ce cas le client et le serveur se mettront d&apos;accord comme des grands sur la courbe &#xE0; utiliser. Avec des versions de nginx relativement r&#xE9;centes (1.11+) et OpenSSL 1.1.0+ / LibreSSL / BoringSSL, il est possible de d&#xE9;finir, c&#xF4;t&#xE9; serveur, un ordre de pr&#xE9;f&#xE9;rence. De mon c&#xF4;t&#xE9;, je pr&#xE9;f&#xE8;re le faire (et si vous ne pouvez pas pr&#xE9;ciser plusieurs courbes, ne pas renseigner la directive est plus sage, sinon vous pouvez utiliser P-384 seulement) :</p>
<pre><code class="language-nginx">ssl_ecdh_curve X25519:P-521:P-384;
# ssl_ecdh_curve secp521r1:secp384r1; # Autres noms
# ssl_ecdh_curve secp384r1; # Si nginx pas r&#xE9;cent
</code></pre>
<p>Petite apart&#xE9; sur X25519 : cette courbe elliptique est le fruit des recherches du Dr. Bernstein. Comme indiqu&#xE9; sur <a href="https://safecurves.cr.yp.to/">ce site</a>, la s&#xE9;curit&#xE9; offerte par les courbes NIST n&apos;est pas parfaite et math&#xE9;matiquement douteuse. X25519 est &quot;meilleur&quot;, et en plus, il ne vient pas d&apos;une agence proche de la NSA qui a tout int&#xE9;r&#xEA;t &#xE0; rendre la cryptanalyse des courbes NIST plus avantageuse pour elle.</p>
<p>X25519 n&apos;&#xE9;tant disponible que sur des versions r&#xE9;centes de Chromium, il faut accepter d&apos;autres courbes pour supporter par exemple Firefox et d&apos;autres plateformes : P-521 et P-384, c&apos;est tr&#xE8;s bien aussi. Ajoutez P-256 si la compatibilit&#xE9; est vraiment un probl&#xE8;me.</p>
<h3 id="blechiffrementdesdonnes">b. Le chiffrement des donn&#xE9;es</h3>
<p>Maintenant que la cl&#xE9; temporaire de session a &#xE9;t&#xE9; communiqu&#xE9;e de fa&#xE7;on s&#xE9;curis&#xE9;e gr&#xE2;ce &#xE0; ECDH au client, ce dernier et le serveur peuvent &#xE9;changer dans un canal chiffr&#xE9; dans une configuration sym&#xE9;trique, d&apos;o&#xF9; l&apos;utilisation d&apos;algorithmes sym&#xE9;triques comme AES. C&apos;est aujourd&apos;hui le plus &#xE9;prouv&#xE9;. RC4, DES, 3DES... <strong>sont &#xE0; bannir</strong>. Des chatons meurent &#xE0; chaque fois que ces algorithmes sont utilis&#xE9;es. En 2017, on utilise normalement AES.</p>
<p>AES faisant du chiffrement par bloc, on introduit deux notions :</p>
<ul>
<li>Le mode d&apos;op&#xE9;ration des blocs : CCM, CBC, GCM...</li>
<li>La taille des cl&#xE9;s utilis&#xE9;es : 128, 256...</li>
</ul>
<p>TLS 1.2 standardise notamment des suites cryptographiques qui reposent sur AES-CBC et AES-GCM, avec des cl&#xE9;s 128 et 256 bits. Le mode GCM est nettement pr&#xE9;f&#xE9;rable &#xE0; CBC. Pourquoi ? Dans le mode CBC, on utilise la fonction XOR (disjonction exclusive) avec un bloc de donn&#xE9;es en clair et un vecteur d&apos;initialisation (IV), ensuite la sortie de XOR est chiffr&#xE9;e avec notre cl&#xE9; sym&#xE9;trique. Le mode GCM diff&#xE8;re de par son fonctionnement : un compteur pour chaque bloc est chiffr&#xE9; par la cl&#xE9; sym&#xE9;trique (dans le Corps de Galois), puis on utilise la fonction XOR avec la sortie obtenue et le bloc de donn&#xE9;es en clair : le bloc chiffr&#xE9; est form&#xE9; ainsi. Pour ne pas aller plus loin dans les d&#xE9;tails m&#xEA;me si ce sont de grands mots qui peuvent faire peur, le fonctionnement inh&#xE9;rent de GCM est plus s&#xE9;curis&#xE9; que celui de CBC. Il est aussi tr&#xE8;s rapide. CBC est vuln&#xE9;rable aux attaques <em>padding oracle</em>.</p>
<p>Ne faites pas une erreur tentante : Qualys ne vous mettra pas du 100/100 partout si vous avez le malheur d&apos;utiliser AES avec une cl&#xE9; 128 bits, m&#xEA;me AES GCM. Donc certains vont forcer AES avec une cl&#xE9; 256 bits, mode GCM et CBC, parce que AES-256-GCM n&apos;est pas forc&#xE9;ment tr&#xE8;s bien support&#xE9; partout encore. C&apos;est une fausse bonne id&#xE9;e ! AES-128-GCM est tr&#xE8;s bien, et quoiqu&apos;il arrive, il faut privil&#xE9;gier GCM &#xE0; CBC. C&apos;est le comportement de la suite <code>EECDH+AES</code> par d&#xE9;faut, inutile d&apos;en pr&#xE9;ciser plus. Pour utiliser GCM seulement, ce que je fais, vous pouvez utiliser <code>EECDH+AESGCM</code>.</p>
<p>ChaCha20 est un autre algorithme sym&#xE9;trique, qui a un fonctionnement intrins&#xE8;quement diff&#xE9;rent puisqu&apos;il fonctionne par flot et non par blocs (comme RC4). C&apos;est une alternative &#xE0; AES propos&#xE9;e par le Dr. Bernstein encore une fois. Bien que la cryptanalyse faite sur ChaCha20 ne soit pas aussi importante qu&apos;avec AES, on le consid&#xE8;re comme s&#xFB;r, et de toute fa&#xE7;on, avoir une alternative est toujours une bonne chose (et  le monopole cryptographique n&apos;&#xE9;tant pas id&#xE9;al de toute fa&#xE7;on...). Il est moins rapide que AES sur des CPU qui disposent des instructions AES-NI, c&apos;est-&#xE0;-dire presque tous les CPU x86_64 actuels si je ne me trompe pas. Mais ChaCha20 offre des performances remarquables et se d&#xE9;fend bien, si bien qu&apos;il est pr&#xE9;f&#xE9;r&#xE9; &#xE0; AES quand on est sur des SoC ARM par exemple.</p>
<p>ChaCha20 est combin&#xE9; &#xE0; Poly1305, un type de code d&apos;authentification de message (MAC) assurant l&apos;int&#xE9;grit&#xE9; des donn&#xE9;es, alors qu&apos;on combine AES-GCM &#xE0; HMAC-SHA2 par exemple. La qualit&#xE9; du HMAC d&#xE9;pendant de la fonction de hashage utilis&#xE9;e, je pr&#xE9;f&#xE8;re ne pas utiliser SHA1 (et il est hors de question d&apos;utiliser MD5), mais s&apos;en s&#xE9;parer convient de faire une croix sur la compatibilit&#xE9; avec certains clients encore une fois. Pour continuer l&apos;analogie entre ChaCha20 et AES, est-ce que Poly1305 est mieux que HMAC-SHA2 ? C&apos;est diff&#xE9;rent, et c&apos;est bien d&apos;avoir le choix. Il y a certainement des subtilit&#xE9;s qui feront pencher les cryptographes d&apos;un c&#xF4;t&#xE9; plus que l&apos;autre... De mon c&#xF4;t&#xE9;, je pr&#xE9;f&#xE8;re m&#xEA;me mettre ChaCha20+Poly1305 en t&#xEA;te de liste parce que je pr&#xE9;f&#xE8;re Docteur Bernstein. Mais il ne faut pas basher AES non plus : bien qu&apos;il ait vu le jour lors du concours NIST au d&#xE9;but des ann&#xE9;es 2000, les crit&#xE8;res autour de sa cr&#xE9;ation sont rigoureusement transparents. Tout ce dont on peut &#xEA;tre s&#xFB;r c&apos;est que la NSA par exemple a eu le temps de faire sa cryptanalyse.</p>
<p>Donc la configuration que je propose est la suivante :</p>
<pre><code class="language-nginx">ssl_ciphers EECDH+CHACHA20:EECDH+AESGCM;
</code></pre>
<p>Restrictive, certes. Mais il ne devrait pas y avoir de soucis avec des clients modernes. Chrome et Firefox supportent d&#xE9;j&#xE0; ChaCha20+Poly1305. AES-GCM fera l&apos;affaire pour Edge, Safari (jusqu&apos;&#xE0; la version incluse dans Yosemite, mais n&apos;oubliez pas que Mavericks a le droit &#xE0; des updates majeures de Safari par exemple), et Android jusqu&apos;&#xE0; KitKat.</p>
<p>Bonus si vous utilisez BoringSSL : vous pouvez d&#xE9;finir des groupes de suites cryptographiques &#xE9;quivalentes. Au sein d&apos;un m&#xEA;me groupe, vous laissez le client choisir selon son ordre &#xE0; lui. Cela peut-&#xEA;tre utile si vous voulez utiliser AES sur votre PC, mais ChaCha20 sur votre smartphone ARM, par exemple. Le groupe est d&#xE9;fini entre crochets <code>[]</code> et avec une barre verticale <em>pipe</em> <code>|</code> entre chaque ciphersuite, &#xE7;a donnerait ceci :</p>
<pre><code class="language-nginx">ssl_ciphers [EECDH+CHACHA20|EECDH+AESGCM];
</code></pre>
<h2 id="6httpstricttransportsecurity">6. HTTP Strict Transport Security</h2>
<p>HSTS est un m&#xE9;canisme de s&#xE9;curit&#xE9; qui consiste &#xE0; indiquer par un header envoy&#xE9; au client qu&apos;il doit communiquer, pour un domaine donn&#xE9;, avec le serveur web par une connexion s&#xE9;curis&#xE9;e HTTPS uniquement. L&apos;int&#xE9;r&#xEA;t est &#xE9;vident, car <strong>si</strong> HSTS est actif, le client est prot&#xE9;g&#xE9; de diverses attaques r&#xE9;seau et d&apos;une <em>MiTM</em>. Mais je n&apos;ai pas mis le pr&#xE9;c&#xE9;dent &quot;si&quot; en gras pour rien, en effet si HSTS n&apos;a jamais &#xE9;t&#xE9; actif ou ne l&apos;est plus, HSTS ne peut plus plus offrir cette s&#xE9;curit&#xE9;. C&apos;est pour cela qu&apos;a &#xE9;t&#xE9; invent&#xE9; le m&#xE9;canisme de <strong>HSTS Preloading</strong>, qui consiste en des listes pr&#xE9;charg&#xE9;es et int&#xE9;gr&#xE9;es aux navigateurs pour indiquer la politique HSTS utilis&#xE9;e pour un domaine ; en quelque sorte, HSTS est d&#xE9;j&#xE0; actif avant m&#xEA;me que vous n&apos;ayez visit&#xE9; le site.</p>
<p>Pour utiliser HSTS, il faut utiliser :</p>
<ul>
<li>Le header <code>Strict-Transport-Security</code>.</li>
<li><code>max-age</code> : dur&#xE9;e d&apos;activit&#xE9; une fois actif <em>(recommand&#xE9; : 6 mois+)</em></li>
<li><code>includeSubDomains</code> : prot&#xE9;ger tous les sous-domaines.</li>
<li><code>preload</code> : activer HSTS preloading.</li>
</ul>
<p>De mon c&#xF4;t&#xE9;, je vais mettre <code>max-age</code> &#xE0; 1 an soit 31536000 secondes. J&apos;activerai HSTS preloading, et j&apos;indiquerai de prot&#xE9;ger tous les sous-domaines, soyez s&#xFB;r que vous souhaitez faire de m&#xEA;me :</p>
<pre><code class="language-nginx">add_header Strict-Transport-Security &quot;max-age=31536000; includeSubDomains; preload&quot;;
</code></pre>
<p>Pour s&apos;inscrire &#xE0; la liste pr&#xE9;charg&#xE9;e, il faut aller inscrire son domaine <a href="https://hstspreload.org/">ici</a>. La propagation peut prendre plusieurs semaines. Attention, HSTS Preload n&apos;est pas l&#xE0; pour remplacer la redirection 301 vers HTTPS depuis HTTP.</p>
<h2 id="7ocspstaplingetocspmuststaple">7. OCSP Stapling et OCSP Must-Staple</h2>
<p><em>OCSP Stapling</em> est une alternative au protocole <em>OCSP</em> qui consiste &#xE0; v&#xE9;rifier aupr&#xE8;s de l&apos;autorit&#xE9; de certification la validit&#xE9; du certificat. Avec <em>OCSP</em>, c&apos;est le client lui-m&#xEA;me qui fait cette d&#xE9;marche de v&#xE9;rification aupr&#xE8;s du CA ; tandis qu&apos;avec <em>OCSP Stapling</em>, c&apos;est le serveur qui fait cette t&#xE2;che et qui envoie la r&#xE9;ponse OCSP au d&#xE9;but de l&apos;&#xE9;change TLS. Bien que ce soit <a href="https://www.imperialviolet.org/2014/04/19/revchecking.html">discut&#xE9;</a> d&apos;un point de vue s&#xE9;curit&#xE9;, les gains apport&#xE9;s par <em>OCSP Stapling</em> pour la vie priv&#xE9;e sont non-n&#xE9;gligeables, il est donc pr&#xE9;f&#xE9;rable de l&apos;activer. Voyons comment cela se configure avec nginx, d&apos;abord les param&#xE8;tres <em>OCSP Stapling</em> &#xE0; proprement parler :</p>
<pre><code class="language-nginx">ssl_stapling on;
ssl_stapling_verify on;
resolver 213.133.98.98 213.133.99.99 valid=300s;
resolver_timeout 5s;
</code></pre>
<p>Les deux premi&#xE8;res lignes activeront <em>OCSP Stapling</em>. Mais il faut fournir un r&#xE9;solveur DNS &#xE0; <em>stapling</em> pour qu&apos;il puisse fonctionner. On peut fournir plusieurs IPs ou des FQDN pour pointer vers des r&#xE9;solveurs DNS, IPv4 et IPv6. Il faut &#xE9;galement fournir &#xE0; nginx le certificat de la cha&#xEE;ne Let&apos;s Encrypt <code>chain.pem</code> dans chaque configuration :</p>
<pre><code class="language-nginx">ssl_trusted_certificate /path/to/chain.pem;
</code></pre>
<p>Une fois que c&apos;est fait et nginx red&#xE9;marr&#xE9;, vous pouvez tester vos param&#xE8;tres <em>OCSP Stapling</em> sur Qualys SSL. Si <em>OCSP Stapling</em> s&apos;affiche en vert avec <em>Yes</em>, c&apos;est que logiquement &#xE7;a fonctionne bien.</p>
<p>Quant &#xE0; <em>OCSP Must-Staple</em>, imaginez tout simplement la m&#xEA;me probl&#xE9;matique qu&apos;avec HSTS : au d&#xE9;part, le client n&apos;a aucune id&#xE9;e si le serveur supporte HSTS, ou <em>OCSP Stapling</em>. <em>OCSP Must-Staple</em> est la solution pour <em>OCSP Stapling</em> qui a &#xE9;t&#xE9; propos&#xE9;e pour r&#xE9;soudre ce probl&#xE8;me. C&apos;est une extension &#xE0; activer dans le certificat, qui indique au client qu&apos;il doit &#xEA;tre livr&#xE9; en m&#xEA;me temps qu&apos;une r&#xE9;ponse <em>OCSP</em> du serveur, sinon c&apos;est <em>niet</em> (donc v&#xE9;rifiez bien, et r&#xE9;guli&#xE8;rement, que vos param&#xE8;tres fonctionnent...). Comment faire ? J&apos;en ai d&#xE9;j&#xE0; parl&#xE9; plus haut, lors de la g&#xE9;n&#xE9;ration du certificat, quand vous modifiez <code>custom.cnf</code> dans la section <code>[ v3_req ]</code>.</p>
<p>Si vous &#xEA;tes sur OpenSSL 1.1.0 ou sup&#xE9;rieur :</p>
<pre><code class="language-cnf">tlsfeature = status_request
</code></pre>
<p>Si vous &#xEA;tes sur OpenSSL 1.0 et inf&#xE9;rieur (<em>moins sexy</em>) :</p>
<pre><code class="language-cnf">1.3.6.1.5.5.7.1.24 = DER:30:03:02:01:05
</code></pre>
<p>Encore une fois vous pouvez v&#xE9;rifier que le <em>flag</em> est bien pr&#xE9;sent dans votre certificat apr&#xE8;s un petit tour sur Qualys SSL, ou en regardant les d&#xE9;tails du certificat depuis votre navigateur.</p>
<p><strong>Remarque</strong> : Firefox est ici le bon &#xE9;l&#xE8;ve puisqu&apos;apparemment il supporte bien OCSP Must-Staple. Cependant il se peut que d&#xE8;s le d&#xE9;marrage du serveur web et lors de la premi&#xE8;re tentative de connexion, Firefox vous colle une belle erreur OCSP : c&apos;est normal. En fait, il faut que nginx remplisse son cache OCSP, et c&apos;est ce que vous avez fait lors de la premi&#xE8;re connexion. Une id&#xE9;e toute b&#xEA;te pour contourner ce probl&#xE8;me est de faire un script qui va faire la connexion. Vous pouvez m&#xEA;me l&apos;ajouter dans une entr&#xE9;e <em>cron</em> pour &#xEA;tre s&#xFB;r qu&apos;il n&apos;y ait aucun probl&#xE8;me de ce genre sur le long terme.</p>
<p><strong>Probl&#xE8;me</strong> : le cache OCSP ne se remplit pas automatiquement lors du d&#xE9;marrage d&apos;nginx et il a besoin de se remplir de temps en temps. &quot;Oui, et ?&quot; me diriez-vous. Le probl&#xE8;me c&apos;est que quand le cache doit se remplir sur demande d&apos;un client, le client balancera une erreur. Si on rafra&#xEE;chit la page, hop, l&apos;erreur part. C&apos;est donc une limitation de OCSP stapling que l&apos;on peut contourner avec un script (merci <a href="https://soc.ialis.me/@href">@href</a> pour la piste) &#xE0; mettre en cron o&#xF9; <code>$domain</code> est le domaine concern&#xE9;, voici un bout de code pour vous montrer :</p>
<pre><code class="language-bash">/bin/echo &quot;Q&quot; | /usr/bin/openssl s_client -connect $domain:443 -status  &gt; /dev/null 2&gt;&amp;1
</code></pre>
<p>pm## 8. HTTP Public Key Pinning (HPKP)<br>
HPKP est un autre m&#xE9;canisme de s&#xE9;curit&#xE9;, bas&#xE9; sur un header HTTP, qui vise &#xE0; faire m&#xE9;moriser au client une liste s&#xFB;re de cl&#xE9;s. Si le CA est compromis et se met &#xE0; faire de faux certificats pour votre domaine, HPKP s&apos;il est bien configur&#xE9; vous prot&#xE9;gera d&apos;une <em>MiTM</em>. Vu qu&apos;on utilise Let&apos;s Encrypt, et avec la m&#xE9;thode que je vous ai fournie pour g&#xE9;rer vos certificats, nous pouvons directement <em>pin</em> la cl&#xE9; publique du <em>leaf certificate</em>. Pourquoi ? Parce que comme je vous l&apos;ai dit, on peut d&#xE9;sormais utiliser nos propres cl&#xE9;s priv&#xE9;es donc on peut se passer de la r&#xE9;g&#xE9;n&#xE9;ration automatique de Let&apos;s Encrypt qui rend l&apos;usage de HPKP tr&#xE8;s d&#xE9;licat.</p>
<p><strong>Prudence.</strong> Le probl&#xE8;me avec HPKP, c&apos;est qu&apos;une fois actif chez le client, il le reste pendant la dur&#xE9;e <code>max-age</code> fournie dans le header. Si par malheur la cl&#xE9; priv&#xE9;e est compromise mais que vous avez pin un seul certificat, pardonnez-moi le terme, mais vous &#xEA;tes litt&#xE9;ralement bais&#xE9; (et plus concr&#xE8;tement votre site sera inaccessible chez ceux qui auront l&apos;ancienne version du header active chez eux). Voil&#xE0; pourquoi il faut pin plusieurs cl&#xE9;s :</p>
<ul>
<li>Si la cl&#xE9; priv&#xE9;e est compromise, on peut changer de cl&#xE9;.</li>
<li>Par mesure de bon sens, il faut parfois rouler les cl&#xE9;s.</li>
<li>Si l&apos;algo est p&#xE9;t&#xE9;, on peut changer sur une autr&#xE9; cl&#xE9; d&apos;un autre type d&apos;algo.</li>
</ul>
<p>Concr&#xE8;tement, moi, ce que je vous recommande, c&apos;est de g&#xE9;n&#xE9;rer 2 cl&#xE9;s P-384 et une cl&#xE9; RSA 4096, et de faire le tutoriel pour cr&#xE9;er le certificat ECDSA &#xE0; partir d&apos;une cl&#xE9; P-384 g&#xE9;n&#xE9;r&#xE9;e.</p>
<pre><code class="language-bash"># G&#xE9;n&#xE9;ration des 3 cl&#xE9;s : 2x P-384, 1x RSA-4096
openssl ecparam -genkey -name secp384r1 &gt; privkey_ec_1.pem
openssl ecparam -genkey -name secp384r1 &gt; privkey_ec_2.pem
openssl genrsa -out privkey_rsa.pem 4096

# Configurez comme indiqu&#xE9; plus haut le custom.cnf
cp /etc/ssl/openssl.cnf custom.cnf

# Les 3 CSR &#xE0; g&#xE9;n&#xE9;rer
openssl req -new -sha256 -key privkey_ec_1.pem -out csr_ec_1.der -config custom.cnf
openssl req -new -sha256 -key privkey_ec_2.pem -out csr_ec_2.der -config custom.cnf
openssl req -new -sha256 -key privkey_rsa.pem -out csr_rsa.der -config custom.cnf

# R&#xE9;cup&#xE9;rer les empreintes
openssl req -pubkey &lt; csr_ec_1.der | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64
openssl req -pubkey &lt; csr_ec_2.der | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64
openssl req -pubkey &lt; csr_rsa.der | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64

# G&#xE9;n&#xE9;ration d&apos;un certificat &#xE0; partir de la premi&#xE8;re cl&#xE9;
letsencrypt certonly --standalone --agree-tos -m admin@domain.tld \
    --csr /path/to/csr_ec_1.der \
    --cert-path /path/to/cert.pem \
    --chain-path /path/to/chain.pem \
    --fullchain-path /path/to/fullchain.pem
</code></pre>
<p>Le header <code>Public-Key-Pins</code> est &#xE0; renseigner avec les 3 empreintes obtenues et un <code>max-age</code>. Pour l&apos;instant, et pour commencer, je le mettrais &#xE0; 2 mois (de toute fa&#xE7;on, Chrome limite la validit&#xE9; du header &#xE0; 60 jours...) ; libre &#xE0; vous de monter plus haut ensuite. Il est &#xE9;galement possible d&apos;appliquer HPKP &#xE0; tous les sous-domaines une fois actif sur un domaine.</p>
<pre><code class="language-nginx">add_header Public-Key-Pins &apos;pin-sha256=&quot;empreinte_ec_1&quot;; pin-sha256=&quot;empreinte ec_2&quot;; pin-sha256=&quot;empreinte_rsa&quot;; max-age=5184000; includeSubdomains&apos;;
</code></pre>
<p>Il va de soit que les cl&#xE9;s ne doivent pas &#xEA;tre id&#xE9;alement sur la m&#xEA;me machine, car si celle-ci est compromise, ce n&apos;est pas une mais les trois cl&#xE9;s priv&#xE9;es que vous allez perdre. N&apos;h&#xE9;sitez pas &#xE0; rouler les cl&#xE9;s, c&apos;est-&#xE0;-dire passer sur la deuxi&#xE8;me cl&#xE9; priv&#xE9;e puis en g&#xE9;n&#xE9;rer une nouvelle et l&apos;ajouter &#xE0; HPKP, en virant la premi&#xE8;re et en laissant la deuxi&#xE8;me.</p>
<h2 id="9daneunealternativehpkp">9. DANE, une alternative &#xE0; HPKP ?</h2>
<p>DANE pour <em>DNS-based Authentication of Named Entities</em> est un autre m&#xE9;canisme s&#xE9;curit&#xE9;, qui a la m&#xEA;me finalit&#xE9; que HPKP mais qui repose sur des entr&#xE9;es DNS (des enregistrements TLSA). La condition pour son utilisation est l&apos;activation de DNSSEC, sans quoi DANE n&apos;a aucun int&#xE9;r&#xEA;t. Je vais &#xE9;viter la redite parce que mon ami Hardware a r&#xE9;dig&#xE9; <a href="https://blog.meshup.net/securiser-lacces-a-son-site-internet-avec-le-protocole-dane/">un billet</a> sur le sujet, n&apos;h&#xE9;sitez pas &#xE0; le consulter.</p>
<p>Les entr&#xE9;es TLSA se pr&#xE9;sentent sous cette forme :</p>
<p><img src="https://jesuisadmin.fr/content/images/2017/10/Screenshot_157.png" alt="Comment avoir une excellente configuration HTTPS en 2017 ?" loading="lazy"></p>
<p>Pour extraire l&apos;empreinte SHA-256 du <code>fullchain.pem</code>, voici comment :</p>
<pre><code class="language-bash">openssl x509 -noout -in fullchain.pem -fingerprint -sha256 | cut -c 20- | sed s/://g | awk &apos;{print tolower($0)}&apos;
</code></pre>
<p>Puis il &quot;suffit&quot; d&apos;ajouter une entr&#xE9;e TLSA dans votre zone DNS :</p>
<pre><code class="language-dns">_443._tcp.domain.tld. IN  TLSA  3 0 1  EMPREINTE
# &#xC0; faire pour chaque sous-domaine.
</code></pre>
<p>Du coup si on met le <code>fullchain.pem</code>, il convient de mettre &#xE0; jour l&apos;entr&#xE9;e TLSA &#xE0; chaque fois qu&apos;on cr&#xE9;e un nouveau certificat. Personnellement j&apos;ai automatis&#xE9; &#xE7;a &#xE0; coups de <code>sed</code> dans mon script de renouvellement, et &#xE7;a marche bien.</p>
<p>Malheureusement DANE n&apos;est pas pr&#xE9;sent dans la plupart des clients modernes (m&#xEA;me pas Chrome et Firefox), c&apos;est pour cela qu&apos;il vaut mieux garder HPKP &#xE0; c&#xF4;t&#xE9;. Pour tester si DANE fonctionne correctement, je vous recommande l&apos;utilisation du plugin <a href="https://www.dnssec-validator.cz/">DNSSEC/TLSA Validator</a>. Vous devriez voir cela :</p>
<p><img src="https://jesuisadmin.fr/content/images/2017/10/Screenshot_159.png" alt="Comment avoir une excellente configuration HTTPS en 2017 ?" loading="lazy"></p>
<h2 id="10certificatetransparency">10. Certificate Transparency</h2>
<p>Certificate Transparency (CT) est en passe de devenir un standard. L&apos;objectif derri&#xE8;re est de rendre public et transparent par les CAs toutes les informations autour de la g&#xE9;n&#xE9;ration d&apos;un certificat. Ainsi, c&apos;est une fa&#xE7;on de lutter contre l&apos;apparition de certificats frauduleux.</p>
<p><img src="https://jesuisadmin.fr/content/images/2017/10/Transparency_1.jpg" alt="Comment avoir une excellente configuration HTTPS en 2017 ?" loading="lazy"></p>
<p>Lors de la cr&#xE9;ation du certificat, le CA envoie des informations au <em>log server</em> qui r&#xE9;pond avec un SCT (signed certificate timestamp). Ce SCT est soit int&#xE9;gr&#xE9; au certificat, soit pr&#xE9;sent&#xE9; au travers d&apos;autres moyens : une extension TLS, ou OCSP Stapling. Let&apos;s Encrypt est d&#xE9;j&#xE0; <a href="https://crt.sh/?Identity=%25&amp;iCAID=16418">compatible avec certificate transparency</a>, mais il ne pr&#xE9;sente pas encore de SCT (il est pr&#xE9;vu que OCSP Stapling s&apos;en occupe d&apos;ici la fin d&apos;ann&#xE9;e). Pour le moment on peut donc utiliser une <strong>extension TLS</strong>, il faudra compiler nginx avec le <a href="https://github.com/grahamedgecombe/nginx-ct">module nginx-ct</a>. Il ne fonctionnera qu&apos;avec une version d&apos;OpenSSL assez r&#xE9;cente.</p>
<p>Pour obtenir le SCT de <strong>fullchain.pem</strong> il nous faut utiliser <a href="https://github.com/grahamedgecombe/ct-submit">ct-submit</a>.</p>
<pre><code class="language-bash">git clone https://github.com/grahamedgecombe/ct-submit --depth=1
cd ct-submit &amp;&amp; go build
./ct-submit ct.googleapis.com/pilot &lt;fullchain.pem&gt;fullchain.sct
xxd fullchain.sct # Pour tester

00000000: 00a4 b909 90b4 1858 1487 bb13 a2cc 6770  .......X......gp
00000010: 0a3c 3598 04f9 1bdf b8e3 77cd 0ec8 0ddc  .&lt;5.......w.....
00000020: 1000 0001 4bc7 e617 c800 0004 0300 4830  ....K.........H0
00000030: 4602 2100 b9fe e206 f0f5 f600 93d5 e04c  F.!............L
00000040: d2fd 75c9 e1fc a5c8 4812 a8b7 bc2c eb0c  ..u.....H....,..
00000050: ee16 1fe9 0221 008a 5974 e1b6 a0e0 281a  .....!..Yt....(.
00000060: 61e8 3447 895f 7ad4 2f70 f528 6133 a445  a.4G._z./p.(a3.E
00000070: 4fd4 ab60 ba36 db                        O..`.6.
</code></pre>
<p>Je vous sugg&#xE8;re ici de cr&#xE9;er un fichier <code>ct_domain.tld.conf</code> o&#xF9; l&apos;on mettra les param&#xE8;tres nginx pour servir le SCT.</p>
<pre><code class="language-nginx">ssl_ct on;
ssl_ct_static_scts /path/to/sct/dir;
</code></pre>
<p>Normalement nginx devrait servir les SCTs qui sont dans ce dossier. Si jamais &#xE7;a ne marche pas, il est possible que ce soit d&#xFB; &#xE0; une limitation pour laquelle le serveur par d&#xE9;faut doit imp&#xE9;rativement servir des SCTs (ajoutez <code>default_server</code> aux directives <code>listen</code> d&apos;un vhost d&apos;un domaine qui utilise CT). Pour v&#xE9;rifier si Certificate Transparency est op&#xE9;rationnel, Chrome et Qualys SSL feront l&apos;affaire.</p>
<p>A ce fichier de configuration on peut aussi ajouter un header, <code>Expect-CT</code>. Il indique au browser que l&apos;on attend l&apos;utilisation de Certificate Transparency. Au jour d&apos;aujourd&apos;hui aucun browser ne l&apos;utilise mais ce sera bient&#xF4;t le cas. Surtout v&#xE9;rifiez bien que Certificate Transparency fonctionne et que les SCTs sont bien servis.</p>
<pre><code class="language-nginx">add_header Expect-CT &quot;enforce; max-age=86400&quot;;
</code></pre>
<p>Dans ce cas-ci le browser devrait forcer l&apos;utilisation de Certificate Transparency (erreur si pas possible) pendant un jour.</p>
<h2 id="11onrcapitule">11. On r&#xE9;capitule ?</h2>
<p>Et c&apos;est apr&#xE8;s, je l&apos;esp&#xE8;re, vous avoir expliqu&#xE9; en quoi consistent les m&#xE9;canismes utilis&#xE9;s, que je vais vous fournir les exemples de configuration. &#xC0; chaque fois qu&apos;il y a un <code>domain.tld</code>, c&apos;est bien s&#xFB;r &#xE0; remplacer par votre domaine. Cr&#xE9;ons peut-&#xEA;tre un dossier <code>/etc/nginx/conf</code> dans lequel on mettra des fichiers de configuration personnalis&#xE9;s, histoire d&apos;&#xE9;viter la redondance plus tard et de pouvoir maintenir plus facilement.</p>
<p>Cr&#xE9;ons un fichier <code>tls.conf</code> o&#xF9; l&apos;on mettra les param&#xE8;tres TLS :</p>
<pre><code class="language-nginx">ssl_protocols TLSv1.2;
ssl_ecdh_curve X25519:P-521:P-384;
ssl_ciphers EECDH+CHACHA20:EECDH+AESGCM;
ssl_prefer_server_ciphers on;

ssl_session_cache shared:SSL:20m;
ssl_session_timeout 15m;
ssl_session_tickets off;
</code></pre>
<p>On d&#xE9;sactive les tickets TLS car leur mauvaise impl&#xE9;mentation nuit au principe de confidentialit&#xE9; persistance (FS). Les autres directives modifient le cache allou&#xE9; aux sessions et le <em>timeout</em> d&apos;une session, elles sont &#xE0; adapter selon les capacit&#xE9;s de votre serveur et l&apos;affluence des connexions.</p>
<p>Un fichier <code>hsts.conf</code> pour HSTS :</p>
<pre><code class="language-nginx">add_header Strict-Transport-Security &quot;max-age=31536000; includeSubDomains; preload&quot;;
</code></pre>
<p>Un fichier <code>hpkp_domain.tld.conf</code> pour HPKP d&apos;un domaine :</p>
<pre><code class="language-nginx">add_header Public-Key-Pins &apos;pin-sha256=&quot;empreinte_ec_1&quot;; pin-sha256=&quot;empreinte ec_2&quot;; pin-sha256=&quot;empreinte_rsa&quot;; max-age=5184000; includeSubdomains&apos;;
</code></pre>
<p>Un fichier <code>ocsp.conf</code> avec les param&#xE8;tres OCSP :</p>
<pre><code class="language-nginx">ssl_stapling on;
ssl_stapling_verify on;
resolver 213.133.98.98 213.133.99.99 valid=300s;
resolver_timeout 5s;
</code></pre>
<p>Un fichier <code>headers.conf</code> qui peut &#xEA;tre ajout&#xE9; si l&apos;application n&apos;ajoute pas d&#xE9;j&#xE0; ces headers :</p>
<pre><code class="language-nginx">add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection &quot;1; mode=block&quot;;
</code></pre>
<p>Dans <code>sites-enabled/</code>, on aura notre fichier <code>lambda.conf</code> ainsi construit :</p>
<pre><code class="language-nginx">server {
  listen 80;
  listen [::]:80;
  server_name domain.tld;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name domain.tld;

  ssl_certificate /path/to/fullchain.pem;
  ssl_certificate_key /path/to/privkey.pem;
  ssl_trusted_certificate /path/to/chain.pem;

  include /etc/nginx/conf/tls.conf;
  include /etc/nginx/conf/hsts.conf;
  include /etc/nginx/conf/headers.conf;
  include /etc/nginx/conf/ocsp.conf;
  include /etc/nginx/conf/hpkp_domain.tld.conf;
 #include /etc/nginx/conf/ct_domain.tld.conf;

  ...
}
</code></pre>
<p>N&apos;oubliez pas de red&#xE9;marrer nginx une fois les param&#xE8;tres appliqu&#xE9;s, sans oublier un <code>nginx -t</code> avant pour &#xE9;viter les mauvaises surprises.</p>
<p>Les tests pour voir si vous avez tout bon :</p>
<ul>
<li>Qualys SSL (SSL/TLS) : <a href="https://www.ssllabs.com/ssltest/">https://www.ssllabs.com/ssltest/</a></li>
<li>Cryptcheck (SSL/TLS): <a href="https://tls.imirhil.fr/">https://tls.imirhil.fr/</a> (v2 bient&#xF4;t)</li>
<li>Observatoire Mozilla (SSL/TLS + headers) : <a href="https://observatory.mozilla.org">https://observatory.mozilla.org</a></li>
<li>DNSSEC Analyzer (DNS) : <a href="https://dnssec-debugger.verisignlabs.com/">https://dnssec-debugger.verisignlabs.com/</a></li>
<li>DANE Checker (DNS) : <a href="https://www.huque.com/bin/danecheck">https://www.huque.com/bin/danecheck</a></li>
<li>Si vous en avez d&apos;autres, proposez !</li>
</ul>
<p><img src="https://jesuisadmin.fr/content/images/2017/10/Screenshot_162.png" alt="Comment avoir une excellente configuration HTTPS en 2017 ?" loading="lazy"></p>
<p>Ce n&apos;est pas difficile, et je ne pense pas avoir menti sur la marchandise, il s&apos;agit d&apos;une excellente configuration HTTPS, peut-&#xEA;tre m&#xEA;me un peu trop extr&#xE9;miste. Si la compatibilit&#xE9; est un trop gros probl&#xE8;me, appliquez les conseils que j&apos;ai diss&#xE9;min&#xE9;s le long de l&apos;article.</p>
<p>Article r&#xE9;dig&#xE9; par Wonderfall, vous pouvez le suivre sur <a href="https://masto.targaryen.house/@wonder">Mastodon</a> ou <a href="https://twitter.com/thewonderfall">Twitter</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Installer Redis 4.0 sur Ubuntu 16.04 LTS]]></title><description><![CDATA[Dans ce tutoriel,  nous allons voir comment compiler redis 4.0 et comment le déclarer en tant que service
]]></description><link>https://jesuisadmin.fr/installer-redis-4-ubuntu/</link><guid isPermaLink="false">5c3f5221007fc1214a0a72e7</guid><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Sat, 16 Sep 2017 15:32:27 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2017/09/installer-redis--1-.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jesuisadmin.fr/content/images/2017/09/installer-redis--1-.png" alt="Installer Redis 4.0 sur Ubuntu 16.04 LTS"><p>La nouvelle release 4.0 de Redis est d&#xE9;sormais disponible en version stable, cependant si vous souhaitez installer la derni&#xE8;re version de redis-server, <s>il est n&#xE9;cessaire de le compiler.</s></p>
<p><mark>Edit du 10/10/2017 : redis-server est d&#xE9;sormais disponible depuis les d&#xE9;p&#xF4;ts officiel pour Ubuntu 16.04 LTS</mark>. Il vous suffit donc de mettre &#xE0; jour votre liste de d&#xE9;p&#xF4;ts et d&apos;installer redis-server via apt :</p>
<pre><code>apt update &amp;&amp; apt install redis-server
</code></pre>
<p>Nous allons donc voir dans ce tutoriel, comment compiler redis 4.0 et comment le d&#xE9;clarer en tant que service via systemd, sur Ubuntu 16.04 LTS ou Debian 8/9.</p>
<p>Il nous faut tout d&apos;abord installer les paquets n&#xE9;cessaires pour compiler depuis les sources :</p>
<pre><code>apt-get install build-essential
apt-get install tcl wget
</code></pre>
<p>On t&#xE9;l&#xE9;charge ensuite la derni&#xE8;re release depuis le site avant d&apos;extraire les fichiers :</p>
<pre><code>wget http://download.redis.io/releases/redis-4.0.1.tar.gz
tar xzf redis-4.0.1.tar.gz
cd redis-4.0.1
</code></pre>
<p>On commence par nettoyer la configuration</p>
<pre><code>make distclean
</code></pre>
<p>Puis on lance la compilation :</p>
<pre><code>make -j $(nproc)
</code></pre>
<p>Avant d&apos;installer redis-server, il est pr&#xE9;f&#xE9;rable d&apos;utiliser <code>make test</code> pour s&apos;assurer qu&apos;il n&apos;y a aucune erreur. Si cette op&#xE9;ration se d&#xE9;roule bien, on peut alors installer redis :</p>
<pre><code>make install
</code></pre>
<p>redis-server est d&#xE9;sormais install&#xE9;, mais pour faciliter sa gestion et pour qu&apos;il d&#xE9;marre automatiquement nous allons le d&#xE9;clarer en tant que service systemd. Pour cela il suffit d&apos;aller dans le dossier <code>utils</code> situ&#xE9; dans le dossier redis-4.0.1, puis d&apos;utiliser le script install_server.sh. Vous pourrez alors choisir le nom de votre service redis.</p>
<pre><code>cd utils
./install_server.sh
</code></pre>
<p>On peut enfin d&#xE9;marrer redis-server, dont le service se nomme par d&#xE9;faut redis_6379:</p>
<pre><code>systemctl start redis_6379
</code></pre>
<p>Redis 4.0 est maintenant install&#xE9; et op&#xE9;rationel sur votre serveur, mais certaines options sont &#xE0; ajouter dans votre fichier /etc/sysctl.conf pour assurer un bon fonctionnement, notamment la ligne :</p>
<pre><code>vm.overcommit_memory = 1
</code></pre>
<p>Pour appliquer la modification, utilisez la commande <code>sysctl -p</code>.<br>
Vous pouvez &#xE9;galement utiliser mon fichier de configuration systcl.conf disponible sur mon <a href="https://git.virtubox.net/virtubox/debian-config/src/master/etc/sysctl.conf">instance gogs</a> et qui contient la plupart des options pour optimiser les performances de votre serveur et vous prot&#xE9;ger de certaines attaques r&#xE9;seaux du type SYN flood :</p>
<pre><code>wget -O /etc/sysctl.conf https://git.virtubox.net/virtubox/debian-config/raw/master/etc/sysctl.conf
sysctl -e -p /etc/sysctl.conf
</code></pre>
<p>Il peut &#xE9;galement &#xEA;tre n&#xE9;cessaire de d&#xE9;sactiver la fonction transparent hugepage de votre kernel qui a normalement pour but d&apos;optimiser la gestion de la m&#xE9;moire. Cela se fait via la commande :</p>
<pre><code>echo never &gt; /sys/kernel/mm/transparent_hugepage/enabled
</code></pre>
<p>Enfin, si vous souhaitez optimiser la configuration de redis-server, vous pouvez d&#xE9;finir les valeurs suivantes dans /etc/redis/redis.conf</p>
<pre><code>maxclients 20000
tcp-backlog 8192
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Installer Plesk Onyx sur Ubuntu 16.04 LTS et optimiser la configuration]]></title><description><![CDATA[Un tutoriel pour installer Plesk Onyx sur Ubuntu 16.04 LTS avec une configuration optimisée permettant d'avoir un serveur stable, sécurisé et performant.]]></description><link>https://jesuisadmin.fr/installer-plesk-onyx-ubuntu-16-optimiser/</link><guid isPermaLink="false">5c3f5221007fc1214a0a72e3</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[Sysadmin]]></category><dc:creator><![CDATA[Thomas @VirtuBox]]></dc:creator><pubDate>Fri, 15 Sep 2017 18:53:00 GMT</pubDate><media:content url="https://jesuisadmin.fr/content/images/2017/09/Installer-Plesk-Onyx--4-.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jesuisadmin.fr/content/images/2017/09/Installer-Plesk-Onyx--4-.png" alt="Installer Plesk Onyx sur Ubuntu 16.04 LTS et optimiser la configuration"><p>Si pour mon utilisation personnelle, je pr&#xE9;f&#xE8;re configurer moi m&#xEA;me un serveur avec nginx pour b&#xE9;n&#xE9;ficier des meilleures performances possibles, il m&apos;arrive tout de m&#xEA;me r&#xE9;guli&#xE8;rement d&apos;installer Plesk Onyx.</p>
<p>Voici donc un tutoriel pour installer Plesk Onyx sur Ubuntu 16.04 LTS avec une configuration optimis&#xE9;e permettant d&apos;avoir un serveur stable, s&#xE9;curis&#xE9; et performant.</p>
<p>On commence par optimiser un peu la configuration du kernel via le fichier sysctl.conf :</p>
<pre><code>wget -O /etc/sysctl.conf https://raw.githubusercontent.com/VirtuBox/ubuntu-nginx-web-server/master/etc/sysctl.conf
sysctl -p
echo never &gt; /sys/kernel/mm/transparent_hugepage/enabled
wget -O /etc/security/limits.conf https://raw.githubusercontent.com/VirtuBox/ubuntu-nginx-web-server/master/etc/security/limits.conf
</code></pre>
<p>Par d&#xE9;faut, Plesk Onyx utilise MySQL 5.7 sur Ubuntu Xenial, mais il est tout &#xE0; fait possible d&apos;utiliser MariaDB 10.1. Il suffit pour cela d&apos;installer mariadb-server avant de d&#xE9;buter l&apos;installation de Plesk.</p>
<p>On ajoute donc le d&#xE9;p&#xF4;t MariaDB 10.1 :</p>
<pre><code>curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup |
    sudo bash -s -- --mariadb-server-version=10.1 --skip-maxscale
</code></pre>
<p>Puis on met &#xE0; jour la liste des d&#xE9;p&#xF4;ts avant d&apos;installer MariaDB. Durant l&apos;installation, laissez le mot de passe root vide. Il sera automatiquement mis &#xE0; jour durant l&apos;installation de Plesk.</p>
<pre><code>sudo apt update
sudo apt install mariadb-server
</code></pre>
<p>MariaDB 10.1 est d&#xE9;sormais install&#xE9; sur notre serveur, nous pouvons donc passer &#xE0; l&apos;installation de Plesk en mode personnalis&#xE9;. Il vous suffit de suivre les &#xE9;tapes pour choisir les composants et les extensions que vous souhaitez installer :</p>
<pre><code>sh &lt;(curl https://autoinstall.plesk.com/plesk-installer || wget -O - https://autoinstall.plesk.com/plesk-installer)
</code></pre>
<p>Une fois l&apos;installation termin&#xE9;e, n&apos;ouvrez pas tout de suite l&apos;interface web pour r&#xE9;aliser la configuration initiale. Nous allons tout d&apos;abord activer le mode vps_optimized. Ce dernier d&#xE9;sactive un bon nombre de modules apache, qui ne sont pas n&#xE9;cessaires sur un VPS.</p>
<pre><code>plesk bin vps_optimized --turn-on
</code></pre>
<p>Vous pouvez  enfin d&#xE9;finir le langage par d&#xE9;faut via la CLI de Plesk :</p>
<pre><code>plesk bin locales --set-default fr-FR
</code></pre>
<p>Pour s&#xE9;curiser notre serveur, nous allons &#xE9;galement activer l&apos;option pci_compliance, cela va configurer les diff&#xE9;rents services pour rendre le serveur pci compliant.</p>
<pre><code>plesk sbin pci_compliance_resolver --enable all
</code></pre>
<p>Si comme moi, vous pensez qu&apos;une cl&#xE9; d&apos;&#xE9;change Diffie-Hellman de 2048 bits est insuffisant, vous pouvez sans probl&#xE8;me utiliser une  cl&#xE9; ECC.</p>
<p>Il vous suffira ensuite de modifier la configuration SSL de Nginx, avec une meilleure suite de ciphers, et notre cl&#xE9; Diffie-Hellman :</p>
<pre><code>nano /etc/nginx/conf.d/ssl
</code></pre>
<p>Voici le contenu de mon fichier de configuration SSL pour Nginx :</p>
<pre><code>ssl_ciphers &apos;EECDH+AESGCM:EECDH+CHACHA20&apos;;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2;
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:20m;  
ssl_session_timeout 15m;  
ssl_session_tickets off;
</code></pre>
<p>Il vous suffit ensuite de reload nginx pour appliquer les changement :</p>
<pre><code>nginx -t &amp;&amp; service nginx reload
</code></pre>
<p>Apr&#xE8;s avoir optimiser la configuration Nginx, nous pouvons passer &#xE0; Apache. Pour cette partie, je me contente de modifier le fichier <code>/etc/apache2/conf-enabled/security.conf</code> et d&apos;y ajouter les headers suivants :</p>
<pre><code>Header set X-Content-Type-Options: &quot;nosniff&quot;
Header set X-Frame-Options: &quot;sameorigin&quot;
Header set Referrer-Policy &quot;strict-origin-when-cross-origin&quot;
Header set x-xss-protection &quot;1; mode=block&quot;
</code></pre>
<p>On relance Apache via la commande <code>service apache2 restart</code></p>
<p>Vous pouvez d&#xE9;sormais vous connecter &#xE0; l&apos;interface Plesk via l&apos;adresse affich&#xE9;e apr&#xE8;s l&apos;installation. Vous pouvez &#xE0; tout moment g&#xE9;n&#xE9;rer une autre adresse de connexion avec la commande <code>plesk login</code>.</p>
<p>Si vous souhaitez modifier la configuration g&#xE9;n&#xE9;rale de Plesk, cela est faisable en utilisant l&apos;extension Panel.ini editor, ou en modifiant directement le fichier /usr/local/psa/admin/conf/panel.ini. L&apos;extension vous permet de d&#xE9;finir depuis l&apos;interface web vos propre variables pour les options Plesk, ainsi que pour les extensions.<br>
Par exemple, pour que l&apos;extension let&apos;s encrypt utilise des cl&#xE9;s RSA de 4096 bits plut&#xF4;t que de 2048 bits, il vous suffit d&apos;ajouter au fichier panel.ini (via le fichier ou via l&apos;extension dans la partie editor), les lignes suivantes :</p>
<pre><code>[ext-letsencrypt]
renew-before-expiration = 45
rsa-key-size = 4096
</code></pre>
<p>Vous pouvez &#xE9;galement d&#xE9;sactiv&#xE9; les publicit&#xE9;s pour certaines extensions, et les propositions de certificats SSL Symantec en ajoutant les lignes suivantes :</p>
<pre><code>[ext-security-advisor]
promoteSymantec = false

[ext-catalog]
contextAds = off
</code></pre>
<p>Vous pouvez appliquer ces configurations en t&#xE9;l&#xE9;chargeant directement mon ficher panel.ini</p>
<pre><code>wget https://raw.githubusercontent.com/VirtuBox/ubuntu-plesk-onyx/master/usr/local/psa/admin/conf/panel.ini -O /usr/local/psa/admin/conf/panel.ini
</code></pre>
<p>Il est m&#xEA;me possible d&apos;aller plus loin avec Plesk Onyx, puisque vous pouvez compiler Nginx avec les modules de votre choix afin de remplacer le paquet install&#xE9; par Plesk.</p>
<p><strong>Edit du 11/12/2017 :</strong></p>
<p>Je propose d&#xE9;sormais un script bash pour compiler la derni&#xE8;re release mainline de Nginx (v1.13.8) avec certains modules tel que Brotli, support de TLS 1.3, dynamic-tls-records-patch, pagespeed etc ...</p>
<p>Le script est pour le moment mis &#xE0; jour uniquement pour Plesk Onyx sur Ubuntu 16.04 LTS, vous pouvez trouver toutes les informations sur <a href="https://github.com/VirtuBox/plesk-nginx">mon d&#xE9;p&#xF4;t Github</a>.</p>
<p>N&apos;h&#xE9;sitez pas &#xE0; ouvrir une Issue sur Github si vous rencontrez des erreurs durant la compilation.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>