<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>adminsys &amp;mdash; Juin en anglais</title>
    <link>https://grimoire.eu.org/june/tag:adminsys</link>
    <description>Je déteste l’informatique, mais ça m’empêche pas d’en parler.</description>
    <pubDate>Mon, 20 Apr 2026 07:44:41 +0200</pubDate>
    <item>
      <title>Installer Zulip avec un reverse proxy NGINX</title>
      <link>https://grimoire.eu.org/june/installer-zulip-avec-un-reverse-proxy-nginx</link>
      <description>&lt;![CDATA[AdminSys&#xA;&#xA;Zulip est une application de messagerie qu’on pourrait assimiler à Slack ou Microsoft Teams. Bien que par défaut, l’équipe de développement encourage à utiliser son service centralisé, il est possible d’auto-héberger sa propre instance Zulip. À noter que Zulip n’est pas du tout un réseau fédéré.&#xA;&#xA;!--more--&#xA;&#xA;Containérisation &amp; sécurité&#xA;&#xA;Cette section part du principe que vous utilisez un environnement debian ou ubuntu sur lequel docker n’est pas installé.&#xA;L’installation d’un serveur Zulip est pour le moins… opaque. Oui, l’installeur est censé affiché toutes les étapes de son exécution, mais 1) comment vérifier que c’est bien le cas, autrement qu’en lisant entièrement le script? 2) parfois les infos s’affichent vite, ce qui peut rendre assez ardu de suivre tout ce qui se passe.&#xA;Pour palier à ce problème, une solution très simple est de le faire tourner dans un conteneur LXC. À défaut d’être aussi sécurisé qu’une VM, ça nous permettra au moins de relativement isoler le système, et d’éviter que l’installation de Zulip casse quoique ce soit sur notre serveur.&#xA;Pour la gestion du LXC, on va simplifier ça avec LXD, qui permet d’automatiser quelques tâches pour nous.&#xA;&#xA;Installation de LXD&#xA;&#xA;On installe :&#xA;&#xA;sudo apt install lxd&#xA;&#xA;On lance la configuration de LXD (un prompt va nous poser quelques questions)  :&#xA;&#xA;sudo lxd init&#xA;&#xA;Et enfin, on ajoute les droits LXD  à notre utilisateur, pour ne pas avoir à passer en root à chaque fois qu’on veut interagir avec nos conteneurs :&#xA;&#xA;sudo adduser utilisateur lxd&#xA;&#xA;Création du conteneur&#xA;&#xA;Pour Zulip, on peut se lancer sur une debian toute simple.&#xA;&#xA;lxc launch images:debian/trixie MonConteneur&#xA;&#xA;On peut lister les différents conteneurs créés et voir leurs adresses ip à l’aide de la commande lxc list. On va noter l’adresse IP  de notre conteneur pour plus tard. S’il manque des IPs fonctionnelles à notre conteneur, on procède comme indiqué dans le point suivant.&#xA;&#xA;Si le réseau ne passe pas&#xA;&#xA;Il arrive parfois que la configuration du pare-feu empêche LXD d’ajouter les conteneurs au réseau qu’il aura créé. Pour régler ça, on va mettre à jour notre pare-feu, et ça devrait être bon. Ici, je vais utiliser les règles proposées dans la documentation d’Ubuntu, qui conviennent très bien dans notre cas.&#xA;&#xA;permet au conteneur d’obtenir une IP de la part de l’hôte&#xA;sudo ufw allow in on lxdbr0 to any port 67 proto udp&#xA;sudo ufw allow in on lxdbr0 to any port 547 proto udp&#xA;&#xA;permet au conteneur d’utiliser la résolution DNS de l’hôte&#xA;sudo ufw allow in on lxdbr0 to any port 53&#xA;&#xA;permet au conteneur d’avoir accès aux connexions sortantes&#xA;CIDR4=&#34;$(lxc network get lxdbr0 ipv4.address | sed &#39;s|\.[0-9]\+/|.0/|&#39;)&#34;&#xA;CIDR6=&#34;$(lxc network get lxdbr0 ipv6.address | sed &#39;s|:[0-9]\+/|:/|&#39;)&#34;&#xA;sudo ufw route allow in on lxdbr0 from &#34;${CIDR4}&#34;&#xA;sudo ufw route allow in on lxdbr0 from &#34;${CIDR6}&#34;&#xA;&#xA;Agir dans le conteneur&#xA;&#xA;Pour passer des commandes au conteneur, on utilisera la commande suivante :&#xA;&#xA;lxc exec MonConteneur -- la commande&#xA;&#xA;Si on a besoin d’entrer dans l’environnement, ça suit la même logique :&#xA;&#xA;lxc exec MonConteneur -- /bin/bash&#xA;&#xA;Installation de Zulip&#xA;&#xA;Téléchargement&#xA;&#xA;Pour la suite, on va se baser sur la documentation de Zulip, pour installer l’instance de manière standard. Mais avant tout, on va rentrer dans l’environnement en root avec la commande renseignée précédemment, lxc exec MonConteneur -- /bin/bash. Ensuite on se contente de suivre ce que nous dit la documentation.&#xA;Téléchargement de la dernière version en date.&#xA;&#xA;cd $(mktemp -d)&#xA;curl -fLO https://download.zulip.com/server/zulip-server-latest.tar.gz&#xA;&#xA;On vérifie le sha256sum.&#xA;&#xA;sha256sum zulip-server-latest.tar.gz&#xA;&#xA;Si tout est bon, on extrait le tout.&#xA;&#xA;tar -xf zulip-server-latest.tar.gz&#xA;&#xA;L’installation en elle-même&#xA;&#xA;On va faire tourner l’installeur avec les arguments qui nous concernent. Dans notre cas, on veut les notifications push, accepter les TOS automatiquement, refuser d’envoyer les statistiques d’utilisation, pas de certificat SSL parce qu’on est derrière un proxy, et évidemment le hostname et l’adresse mail de contact qu’il faut obligatoirement indiquer.&#xA;&#xA;./zulip-server-*/scripts/setup install --push-notifications --agree-to-terms-of-service --no-submit-usage-statistics --hostname exemple.fr --email=contact@exemple.fr&#xA;&#xA;L’installeur va tourner tout seul, et créer un utilisateur zulip, qui fera tourner l’instance. Une fois l’installation finie, il nous fournira un lien à usage unique, permettant de créer l’organisation de notre instance. À ce stade, le lien ne sera pas fonctionnel, donc on le met de côté, pour ne pas le perdre.&#xA;&#xA;Création du reverse proxy&#xA;&#xA;On va créer un fichier de configuration nginx, puis certbot pour installer un certificat SSL.&#xA;&#xA;sudo vim /etc/nginx/sites-available/zulip&#xA;&#xA;Et on remplit comme suit, en utilisant la documentation pour les reverse proxies :&#xA;&#xA;server {&#xA;    listen 80;&#xA;    listen [::]:80;&#xA;    servername exemple.fr&#xA;&#xA;    location /.well-known/acme-challenge/ { allow all; }&#xA;&#xA;    location / {&#xA;        proxysetheader    X-Forwarded-For $proxyaddxforwardedfor;&#xA;        proxysetheader    X-Forwarded-Proto $scheme;&#xA;        proxysetheader    Host $host;&#xA;        proxyhttpversion  1.1;&#xA;        proxybuffering     off;&#xA;        proxyreadtimeout  20m;&#xA;        proxypass http:/X.X.X.X:80;&#xA;&#x9;}&#x9;&#xA;}&#xA;&#xA;On active le tout avec un lien symbolique :&#xA;&#xA;sudo ln -s /etc/nginx/sites-available/zulip /etc/nginx/sites-enabled/zulip&#xA;&#xA;Et on relance nginx :&#xA;&#xA;sudo systemctl restart nginx&#xA;&#xA;Si tout va bien, on va pouvoir passer à la certification :&#xA;&#xA;sudo certbot --nginx -d exemple.fr&#xA;&#xA;On vérifie qu’il ne reste pas un port 80  inutilement ouvert dans la config nginx. Sinon, on édite et on relance nginx à nouveau. Désormais, notre instance est normalement accessible sur le web.&#xA;&#xA;Configurer les mails sortants&#xA;&#xA;Avant de créer notre organisation, je vous conseille de passer par cette étape, pour que tout fonctionne au mieux.&#xA;En premier lieu, on va éditer /etc/zulip/settings.py, et s’assurer de configurer le serveur SMTP. On s’assure d’éditer les lignes suivantes :&#xA;&#xA;EMAILHOST = &#34;smtp.fournisseurmail.fr&#34;&#xA;EMAILHOSTUSER = &#34;utilisateur@fournisseurmail.fr&#34;&#xA;[…]&#xA;EMAILUSETLS = TRUE&#xA;EMAILPORT = 587&#xA;[…]&#xA;TOKENIZEDNOREPLYEMAILADDRESS = &#34;nepasrepondre+{token}@exemple.fr&#34;&#xA;[…]&#xA;INSTALLATIONNAME = &#34;Exemple&#34;&#xA;&#xA;On vérifier si les mails fonctionne bien en faisant tourner la commande suivante. Normalement on devrait obtenir un mail de la part de contact@exemple.fr et un autre de nepasrepondre+{token}@exemple.fr. Si ça tombe dans les spams, il faudra bidouiller de votre côté, je n’ai pas eu ce problème.&#xA;&#xA;su zulip -c &#39;/home/zulip/deployments/current/manage.py sendtest_email monadressemailperso@monfournisseurmail.fr&#39;&#xA;&#xA;Dernière ligne droite&#xA;&#xA;On peut enfin cliquer sur le lien que nous a donné l’installeur ! On le ressort de nos notes, on clique dessus, et on suit les différentes étapes proposées. Félicitations, notre Zulip est désormais fonctionnel !&#xA;&#xA;Si t’as apprécié ce post, envoie-moi une disquette.]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="/june/tag:AdminSys" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">AdminSys</span></a></p>

<p>Zulip est une application de messagerie qu’on pourrait assimiler à Slack ou Microsoft Teams. Bien que par défaut, l’équipe de développement encourage à utiliser son service centralisé, il est possible d’auto-héberger sa propre instance Zulip. À noter que Zulip n’est pas du tout un réseau fédéré.</p>



<h2 id="containérisation-sécurité">Containérisation &amp; sécurité</h2>

<p><strong>Cette section part du principe que vous utilisez un environnement debian ou ubuntu sur lequel docker n’est pas installé.</strong>
L’installation d’un serveur Zulip est pour le moins… opaque. Oui, l’installeur est censé affiché toutes les étapes de son exécution, mais 1) comment vérifier que c’est bien le cas, autrement qu’en lisant entièrement le script? 2) parfois les infos s’affichent vite, ce qui peut rendre assez ardu de suivre tout ce qui se passe.
Pour palier à ce problème, une solution très simple est de le faire tourner dans un conteneur LXC. À défaut d’être aussi sécurisé qu’une VM, ça nous permettra au moins de <a href="https://doc.ubuntu-fr.org/virtualisation#environnement_virtuel_operating_system-level_virtualization" rel="nofollow">relativement isoler</a> le système, et d’éviter que l’installation de Zulip casse quoique ce soit sur notre serveur.
Pour la gestion du LXC, on va simplifier ça avec LXD, qui permet d’automatiser quelques tâches pour nous.</p>

<h3 id="installation-de-lxd">Installation de LXD</h3>

<p>On installe :</p>

<pre><code>sudo apt install lxd
</code></pre>

<p>On lance la configuration de LXD (un prompt va nous poser quelques questions)  :</p>

<pre><code>sudo lxd init
</code></pre>

<p>Et enfin, on ajoute les droits LXD  à notre utilisateur, pour ne pas avoir à passer en root à chaque fois qu’on veut interagir avec nos conteneurs :</p>

<pre><code>sudo adduser utilisateur lxd
</code></pre>

<h3 id="création-du-conteneur">Création du conteneur</h3>

<p>Pour Zulip, on peut se lancer sur une debian toute simple.</p>

<pre><code>lxc launch images:debian/trixie MonConteneur
</code></pre>

<p>On peut lister les différents conteneurs créés et voir leurs adresses ip à l’aide de la commande <code>lxc list</code>. On va noter l’adresse IP  de notre conteneur pour plus tard. S’il manque des IPs fonctionnelles à notre conteneur, on procède comme indiqué dans le point suivant.</p>

<h3 id="si-le-réseau-ne-passe-pas">Si le réseau ne passe pas</h3>

<p>Il arrive parfois que la configuration du pare-feu empêche LXD d’ajouter les conteneurs au réseau qu’il aura créé. Pour régler ça, on va mettre à jour notre pare-feu, et ça devrait être bon. Ici, je vais utiliser <a href="https://documentation.ubuntu.com/lxd/latest/howto/network_bridge_firewalld/#network-bridge-firewall" rel="nofollow">les règles proposées dans la documentation d’Ubuntu</a>, qui conviennent très bien dans notre cas.</p>

<pre><code># permet au conteneur d’obtenir une IP de la part de l’hôte
sudo ufw allow in on lxdbr0 to any port 67 proto udp
sudo ufw allow in on lxdbr0 to any port 547 proto udp

# permet au conteneur d’utiliser la résolution DNS de l’hôte
sudo ufw allow in on lxdbr0 to any port 53

# permet au conteneur d’avoir accès aux connexions sortantes
CIDR4=&#34;$(lxc network get lxdbr0 ipv4.address | sed &#39;s|\.[0-9]\+/|.0/|&#39;)&#34;
CIDR6=&#34;$(lxc network get lxdbr0 ipv6.address | sed &#39;s|:[0-9]\+/|:/|&#39;)&#34;
sudo ufw route allow in on lxdbr0 from &#34;${CIDR4}&#34;
sudo ufw route allow in on lxdbr0 from &#34;${CIDR6}&#34;
</code></pre>

<h3 id="agir-dans-le-conteneur">Agir dans le conteneur</h3>

<p>Pour passer des commandes au conteneur, on utilisera la commande suivante :</p>

<pre><code>lxc exec MonConteneur -- la commande
</code></pre>

<p>Si on a besoin d’entrer dans l’environnement, ça suit la même logique :</p>

<pre><code>lxc exec MonConteneur -- /bin/bash
</code></pre>

<h2 id="installation-de-zulip">Installation de Zulip</h2>

<h3 id="téléchargement">Téléchargement</h3>

<p>Pour la suite, on va se baser sur <a href="https://zulip.readthedocs.io/en/stable/production/install.html" rel="nofollow">la documentation de Zulip</a>, pour installer l’instance de manière standard. Mais avant tout, on va rentrer dans l’environnement en root avec la commande renseignée précédemment, <code>lxc exec MonConteneur -- /bin/bash</code>. Ensuite on se contente de suivre ce que nous dit la documentation.
Téléchargement de la dernière version en date.</p>

<pre><code>cd $(mktemp -d)
curl -fLO https://download.zulip.com/server/zulip-server-latest.tar.gz
</code></pre>

<p>On vérifie <a href="https://download.zulip.com/server/SHA256SUMS.txt" rel="nofollow">le sha256sum</a>.</p>

<pre><code>sha256sum zulip-server-latest.tar.gz
</code></pre>

<p>Si tout est bon, on extrait le tout.</p>

<pre><code>tar -xf zulip-server-latest.tar.gz
</code></pre>

<h3 id="l-installation-en-elle-même">L’installation en elle-même</h3>

<p>On va faire tourner l’installeur avec les arguments qui nous concernent. Dans notre cas, on veut les notifications push, accepter les TOS automatiquement, refuser d’envoyer les statistiques d’utilisation, pas de certificat SSL parce qu’on est derrière un proxy, et évidemment le hostname et l’adresse mail de contact qu’il faut obligatoirement indiquer.</p>

<pre><code>./zulip-server-*/scripts/setup install --push-notifications --agree-to-terms-of-service --no-submit-usage-statistics --hostname exemple.fr --email=contact@exemple.fr
</code></pre>

<p>L’installeur va tourner tout seul, et créer un utilisateur zulip, qui fera tourner l’instance. Une fois l’installation finie, il nous fournira un lien à usage unique, permettant de créer l’organisation de notre instance. À ce stade, le lien ne sera pas fonctionnel, donc on le met de côté, pour ne pas le perdre.</p>

<h2 id="création-du-reverse-proxy">Création du reverse proxy</h2>

<p>On va créer un fichier de configuration nginx, puis certbot pour installer un certificat SSL.</p>

<pre><code>sudo vim /etc/nginx/sites-available/zulip
</code></pre>

<p>Et on remplit comme suit, en utilisant <a href="https://zulip.readthedocs.io/en/stable/production/reverse-proxies.html" rel="nofollow">la documentation pour les reverse proxies</a> :</p>

<pre><code>server {
    listen 80;
    listen [::]:80;
    server_name exemple.fr

    location /.well-known/acme-challenge/ { allow all; }

    location / {
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_set_header    Host $host;
        proxy_http_version  1.1;
        proxy_buffering     off;
        proxy_read_timeout  20m;
        proxy_pass http:/X.X.X.X:80;
	}	
}
</code></pre>

<p>On active le tout avec un lien symbolique :</p>

<pre><code>sudo ln -s /etc/nginx/sites-available/zulip /etc/nginx/sites-enabled/zulip
</code></pre>

<p>Et on relance nginx :</p>

<pre><code>sudo systemctl restart nginx
</code></pre>

<p>Si tout va bien, on va pouvoir passer à la certification :</p>

<pre><code>sudo certbot --nginx -d exemple.fr
</code></pre>

<p>On vérifie qu’il ne reste pas un port 80  inutilement ouvert dans la config nginx. Sinon, on édite et on relance nginx à nouveau. Désormais, notre instance est normalement accessible sur le web.</p>

<h2 id="configurer-les-mails-sortants">Configurer les mails sortants</h2>

<p>Avant de créer notre organisation, je vous conseille de passer par cette étape, pour que tout fonctionne au mieux.
En premier lieu, on va éditer <code>/etc/zulip/settings.py</code>, et s’assurer de <a href="https://zulip.readthedocs.io/en/stable/production/email.html" rel="nofollow">configurer le serveur SMTP</a>. On s’assure d’éditer les lignes suivantes :</p>

<pre><code>EMAIL_HOST = &#34;smtp.fournisseurmail.fr&#34;
EMAIL_HOST_USER = &#34;utilisateur@fournisseurmail.fr&#34;
[…]
EMAIL_USE_TLS = TRUE
EMAIL_PORT = 587
[…]
TOKENIZED_NOREPLY_EMAIL_ADDRESS = &#34;nepasrepondre+{token}@exemple.fr&#34;
[…]
INSTALLATION_NAME = &#34;Exemple&#34;
</code></pre>

<p>On vérifier si les mails fonctionne bien en faisant tourner la commande suivante. Normalement on devrait obtenir un mail de la part de <code>contact@exemple.fr</code> et un autre de <code>nepasrepondre+{token}@exemple.fr</code>. Si ça tombe dans les spams, il faudra bidouiller de votre côté, je n’ai pas eu ce problème.</p>

<pre><code>su zulip -c &#39;/home/zulip/deployments/current/manage.py send_test_email monadressemailperso@monfournisseurmail.fr&#39;
</code></pre>

<h2 id="dernière-ligne-droite">Dernière ligne droite</h2>

<p>On peut enfin cliquer sur le lien que nous a donné l’installeur ! On le ressort de nos notes, on clique dessus, et on suit les différentes étapes proposées. Félicitations, notre Zulip est désormais fonctionnel !</p>

<p>Si t’as apprécié ce post, <a href="http://elud.tkt.lol/" rel="nofollow">envoie-moi une disquette</a>.</p>
]]></content:encoded>
      <guid>https://grimoire.eu.org/june/installer-zulip-avec-un-reverse-proxy-nginx</guid>
      <pubDate>Sun, 19 Apr 2026 21:00:54 +0000</pubDate>
    </item>
    <item>
      <title>Mettre en place un VPN avec WireGuard en 5 minutes</title>
      <link>https://grimoire.eu.org/june/yb3x0ixd3m</link>
      <description>&lt;![CDATA[AdminSys&#xA;&#xA;Edito&#xA;&#xA;Cet article a été rédigé et publié en quelques minutes, son accessibilité est moins travaillée que d’habitude.&#xA;&#xA;!--more--&#xA;&#xA;Environnement&#xA;&#xA;OS serveur : Debian 10 à jour&#xA;OS client : Distribution GNU/Linux à jour&#xA;Un utilisateur avec les droits sudo sur chaque machine&#xA;&#xA;## Côté serveur #1&#xA;&#xA;sudo apt install wireguard&#xA;wg genkey | tee privatekey | wg pubkey   publickey&#xA;sudo mkdir /etc/wireguard/helper&#xA;&#xA;Créer et éditer le fichier de configuration du serveur, pour cet exemple, c’est wg0.conf.&#xA;&#xA;[Interface]&#xA;Address = 10.200.200.1/24&#xA;ListenPort = 51821&#xA;PrivateKey = [coller ici le contenu du fichier &#39;privatekey&#39; généré précedemment]&#xA;PostUp = /etc/wireguard/helper/add-nat-routing.sh&#xA;PostDown = /etc/wireguard/helper/remove-nat-routing.sh&#xA;&#xA;Créer et éditer le fichier /etc/wireguard/helper/add-nat-routing.sh.&#xA;&#xA;!/bin/bash&#xA;IPT=&#34;/sbin/iptables&#34;&#xA;IPT6=&#34;/sbin/ip6tables&#34;          &#xA; &#xA;INFACE=&#34;eth0&#34;                   # interface réseau connectée à Internet&#xA;WGFACE=&#34;wg0&#34;                    # interface réseau connectée à WireGuard&#xA;SUBNET=&#34;10.200.200.0/24&#34;            # sous-réseau de WireGuard en IPv4&#xA;WGPORT=&#34;51821&#34;                  # port UDP utilisé par WireGuard &#xA;SUBNET6=&#34;fd42:42:42:42::/112&#34;  # sous-réseau de WireGuard en IPv6&#xA; &#xA;règles IPv4 &#xA;$IPT -t nat -I POSTROUTING 1 -s $SUBNET -o $INFACE -j MASQUERADE&#xA;$IPT -I INPUT 1 -i $WGFACE -j ACCEPT&#xA;$IPT -I FORWARD 1 -i $INFACE -o $WGFACE -j ACCEPT&#xA;$IPT -I FORWARD 1 -i $WGFACE -o $INFACE -j ACCEPT&#xA;$IPT -I INPUT 1 -i $INFACE -p udp --dport $WGPORT -j ACCEPT&#xA; &#xA;IPv6 (à décommenter si utilisation d’IPv6, non testé) &#xA;$IPT6 -t nat -I POSTROUTING 1 -s $SUBNET6 -o $INFACE -j MASQUERADE&#xA;$IPT6 -I INPUT 1 -i $WGFACE -j ACCEPT&#xA;$IPT6 -I FORWARD 1 -i $INFACE -o $WGFACE -j ACCEPT&#xA;$IPT6 -I FORWARD 1 -i $WGFACE -o $INFACE -j ACCEPT&#xA;&#xA;Créer et éditer le fichier /etc/wireguard/helper/remove-nat-routing.sh.&#xA;&#xA;!/bin/bash&#xA;IPT=&#34;/sbin/iptables&#34;&#xA;IPT6=&#34;/sbin/ip6tables&#34;          &#xA; &#xA;INFACE=&#34;eth0&#34;                   # interface réseau connectée à Internet&#xA;WGFACE=&#34;wg0&#34;                   # interface réseau connectée à WireGuard&#xA;SUBNET=&#34;10.200.200.0/24&#34;            # sous-réseau de WireGuard en IPv4&#xA;WGPORT=&#34;51821&#34;                 # port UDP utilisé par WireGuard &#xA;SUBNET6=&#34;fd42:42:42:42::/112&#34;  # sous-réseau de WireGuard en IPv6&#xA; &#xA;règles IPv4 &#xA;$IPT -t nat -D POSTROUTING -s $SUBNET -o $INFACE -j MASQUERADE&#xA;$IPT -D INPUT -i $WGFACE -j ACCEPT&#xA;$IPT -D FORWARD -i $INFACE -o $WGFACE -j ACCEPT&#xA;$IPT -D FORWARD -i $WGFACE -o $INFACE -j ACCEPT&#xA;$IPT -D INPUT -i $INFACE -p udp --dport $WGPORT -j ACCEPT&#xA; &#xA;règles IPv6 (à décommenter si utilisation d’IPv6, non testé) &#xA;$IPT6 -t nat -D POSTROUTING -s $SUBNET6 -o $INFACE -j MASQUERADE&#xA;$IPT6 -D INPUT -i $WGFACE -j ACCEPT&#xA;$IPT6 -D FORWARD -i $INFACE -o $WGFACE -j ACCEPT&#xA;$IPT6 -D FORWARD -i $WGFACE -o $INFACE -j ACCEPT&#xA;&#xA;Rendre les scripts exécutables&#xA;&#xA;sudo chmod +x /etc/wireguard/helper/*.sh&#xA;&#xA;Créer et éditer le fichier /etc/sysctl.d/10-wireguard.conf&#xA;&#xA;net.ipv4.ipforward=1&#xA;net.ipv6.conf.all.forwarding=1&#xA;&#xA;Prendre en compte les modifications de sysctl.d&#xA;&#xA;sysctl -p /etc/sysctl.d/10-wireguard.conf&#xA;&#xA;Supprimer le fichier privatekey&#xA;&#xA;## Côté client #1&#xA;&#xA;wg genkey | tee privatekey | wg pubkey   publickey&#xA;&#xA;Créer et éditer le fichier de configuration client de WireGuard, dans cet exemple wg0-client.conf.&#xA;&#xA;[Interface]&#xA;Address = 10.200.200.2/32&#xA;PrivateKey = [coller ici le contenu du fichier &#39;privatekey&#39; généré côté client]&#xA;DNS = 80.67.169.12, 80.67.169.40&#xA;&#xA;[Peer]&#xA;PublicKey = [coller ici le contenu du fichier &#39;publickey&#39; généré côté serveur&#xA;Endpoint = [adresse IP Internet du serveur]:51821&#xA;AllowedIPs = 0.0.0.0/0&#xA;PersistentKeepalive = 21&#xA;&#xA;Supprimer le fichier privatekey.&#xA;&#xA;## Côté serveur #2&#xA;&#xA;Éditer /etc/wireguard/wg0.conf.&#xA;&#xA;[…]&#xA;&#xA;[Peer]&#xA;PublicKey = [coller ici le contenu du fichier &#39;public_key&#39; généré côté client]&#xA;AllowedIPs = 10.200.200.2/32&#xA;&#xA;Démarrer WireGuard, puis l’activer au démarrage du serveur.&#xA;&#xA;sudo wg-quick up wg0&#xA;sudo systemctl enable wg-quick@wg0.service&#xA;&#xA;## Côté client #2&#xA;&#xA;Démarrer WireGuard.&#xA;&#xA;sudo wg-quick up wg0-client&#xA;&#xA;Source&#xA;&#xA;https://www.cyberciti.biz/faq/how-to-set-up-wireguard-firewall-rules-in-linux/&#xA;&#xA;Si t’as apprécié ce post, envoie-moi une disquette.]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="/june/tag:AdminSys" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">AdminSys</span></a></p>

<h2 id="edito">Edito</h2>

<p>Cet article a été rédigé et publié en quelques minutes, son accessibilité est moins travaillée que d’habitude.</p>



<h2 id="environnement">Environnement</h2>
<ul><li>OS serveur : Debian 10 <strong>à jour</strong></li>
<li>OS client : Distribution GNU/Linux <strong>à jour</strong></li>
<li>Un utilisateur avec les droits sudo sur chaque machine</li></ul>

<h2 id="côté-serveur-1">Côté serveur #1</h2>

<pre><code class="language-shell">sudo apt install wireguard
wg genkey | tee private_key | wg pubkey &gt; public_key
sudo mkdir /etc/wireguard/helper
</code></pre>

<p>Créer et éditer le fichier de configuration du serveur, pour cet exemple, c’est <strong>wg0.conf</strong>.</p>

<pre><code class="language-conf">[Interface]
Address = 10.200.200.1/24
ListenPort = 51821
PrivateKey = [coller ici le contenu du fichier &#39;private_key&#39; généré précedemment]
PostUp = /etc/wireguard/helper/add-nat-routing.sh
PostDown = /etc/wireguard/helper/remove-nat-routing.sh
</code></pre>

<p>Créer et éditer le fichier <strong>/etc/wireguard/helper/add-nat-routing.sh</strong>.</p>

<pre><code class="language-shell">#!/bin/bash
IPT=&#34;/sbin/iptables&#34;
IPT6=&#34;/sbin/ip6tables&#34;          
 
IN_FACE=&#34;eth0&#34;                   # interface réseau connectée à Internet
WG_FACE=&#34;wg0&#34;                    # interface réseau connectée à WireGuard
SUB_NET=&#34;10.200.200.0/24&#34;            # sous-réseau de WireGuard en IPv4
WG_PORT=&#34;51821&#34;                  # port UDP utilisé par WireGuard 
SUB_NET_6=&#34;fd42:42:42:42::/112&#34;  # sous-réseau de WireGuard en IPv6
 
## règles IPv4 ##
$IPT -t nat -I POSTROUTING 1 -s $SUB_NET -o $IN_FACE -j MASQUERADE
$IPT -I INPUT 1 -i $WG_FACE -j ACCEPT
$IPT -I FORWARD 1 -i $IN_FACE -o $WG_FACE -j ACCEPT
$IPT -I FORWARD 1 -i $WG_FACE -o $IN_FACE -j ACCEPT
$IPT -I INPUT 1 -i $IN_FACE -p udp --dport $WG_PORT -j ACCEPT
 
## IPv6 (à décommenter si utilisation d’IPv6, non testé) ##
## $IPT6 -t nat -I POSTROUTING 1 -s $SUB_NET_6 -o $IN_FACE -j MASQUERADE
## $IPT6 -I INPUT 1 -i $WG_FACE -j ACCEPT
## $IPT6 -I FORWARD 1 -i $IN_FACE -o $WG_FACE -j ACCEPT
## $IPT6 -I FORWARD 1 -i $WG_FACE -o $IN_FACE -j ACCEPT
</code></pre>

<p>Créer et éditer le fichier <strong>/etc/wireguard/helper/remove-nat-routing.sh</strong>.</p>

<pre><code class="language-shell">#!/bin/bash
IPT=&#34;/sbin/iptables&#34;
IPT6=&#34;/sbin/ip6tables&#34;          
 
IN_FACE=&#34;eth0&#34;                   # interface réseau connectée à Internet
WG_FACE=&#34;wg0&#34;                   # interface réseau connectée à WireGuard
SUB_NET=&#34;10.200.200.0/24&#34;            # sous-réseau de WireGuard en IPv4
WG_PORT=&#34;51821&#34;                 # port UDP utilisé par WireGuard 
SUB_NET_6=&#34;fd42:42:42:42::/112&#34;  # sous-réseau de WireGuard en IPv6
 
# règles IPv4 #
$IPT -t nat -D POSTROUTING -s $SUB_NET -o $IN_FACE -j MASQUERADE
$IPT -D INPUT -i $WG_FACE -j ACCEPT
$IPT -D FORWARD -i $IN_FACE -o $WG_FACE -j ACCEPT
$IPT -D FORWARD -i $WG_FACE -o $IN_FACE -j ACCEPT
$IPT -D INPUT -i $IN_FACE -p udp --dport $WG_PORT -j ACCEPT
 
# règles IPv6 (à décommenter si utilisation d’IPv6, non testé) #
## $IPT6 -t nat -D POSTROUTING -s $SUB_NET_6 -o $IN_FACE -j MASQUERADE
## $IPT6 -D INPUT -i $WG_FACE -j ACCEPT
## $IPT6 -D FORWARD -i $IN_FACE -o $WG_FACE -j ACCEPT
## $IPT6 -D FORWARD -i $WG_FACE -o $IN_FACE -j ACCEPT
</code></pre>

<p>Rendre les scripts exécutables</p>

<pre><code class="language-shell">sudo chmod +x /etc/wireguard/helper/*.sh
</code></pre>

<p>Créer et éditer le fichier <strong>/etc/sysctl.d/10-wireguard.conf</strong></p>

<pre><code class="language-conf">net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
</code></pre>

<p>Prendre en compte les modifications de sysctl.d</p>

<pre><code class="language-shell">sysctl -p /etc/sysctl.d/10-wireguard.conf
</code></pre>

<p>Supprimer le fichier <strong>private_key</strong></p>

<h2 id="côté-client-1">Côté client #1</h2>

<pre><code class="language-shell">wg genkey | tee private_key | wg pubkey &gt; public_key
</code></pre>

<p>Créer et éditer le fichier de configuration client de WireGuard, dans cet exemple <strong>wg0-client.conf</strong>.</p>

<pre><code class="language-conf">[Interface]
Address = 10.200.200.2/32
PrivateKey = [coller ici le contenu du fichier &#39;private_key&#39; **généré côté client**]
DNS = 80.67.169.12, 80.67.169.40

[Peer]
PublicKey = [coller ici le contenu du fichier &#39;public_key&#39; **généré côté serveur**
Endpoint = [adresse IP Internet du serveur]:51821
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 21
</code></pre>

<p>Supprimer le fichier <strong>private_key</strong>.</p>

<h2 id="côté-serveur-2">Côté serveur #2</h2>

<p>Éditer <strong>/etc/wireguard/wg0.conf</strong>.</p>

<pre><code class="language-conf">[…]

[Peer]
PublicKey = [coller ici le contenu du fichier &#39;public_key&#39; **généré côté client**]
AllowedIPs = 10.200.200.2/32
</code></pre>

<p>Démarrer WireGuard, puis l’activer au démarrage du serveur.</p>

<pre><code class="language-shell">sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0.service
</code></pre>

<h2 id="côté-client-2">Côté client #2</h2>

<p>Démarrer WireGuard.</p>

<pre><code class="language-shell">sudo wg-quick up wg0-client
</code></pre>

<h2 id="source">Source</h2>
<ul><li><a href="https://www.cyberciti.biz/faq/how-to-set-up-wireguard-firewall-rules-in-linux/" rel="nofollow">https://www.cyberciti.biz/faq/how-to-set-up-wireguard-firewall-rules-in-linux/</a></li></ul>

<p>Si t’as apprécié ce post, <a href="http://elud.tkt.lol/" rel="nofollow">envoie-moi une disquette</a>.</p>
]]></content:encoded>
      <guid>https://grimoire.eu.org/june/yb3x0ixd3m</guid>
      <pubDate>Tue, 18 May 2021 22:00:00 +0000</pubDate>
    </item>
    <item>
      <title>GitLab sur un serveur peu puissant</title>
      <link>https://grimoire.eu.org/june/ia3h9um58g</link>
      <description>&lt;![CDATA[AdminSys&#xA;&#xA;Environnement utilisé&#xA;&#xA;Un CPX21 de l’offre Cloud de Hetzner. Je pense que les modifications restent intéressantes pour toute autre configuration équivalente ou moins puissante que celle-ci. Le serveur tourne sous Debian 10.&#xA;&#xA;!--more--&#xA;&#xA;Pré-requis&#xA;&#xA;Avoir déjà configuré son serveur SSH pour se connecter avec un utilisateur ayant accès aux droits d’administration.&#xA;&#xA;Installer et configurer zRAM&#xA;&#xA;zRAM est un outil permettant de compresser la RAM, pour gagner en mémoire vive disponible. Pour plus de détails, je vous recommande de lire l’introduction de cette page de documentation.&#xA;&#xA;On installe le paquet.&#xA;&#xA;sudo apt install zram-tools&#xA;&#xA;Une fois installé, zRAM se lance tout seule avec une configuration par défaut. Pour configurer zRAM, on édite le fichier /etc/default/zramswap. On modifie la valeur PERCENTAGE pour augmenter la capacité que peut gérer zRAM, la valeur par défaut devrait être 10, on la passe à 100. On relance le service. pour que la modification fasse effet.&#xA;&#xA;sudo systemctl restart zramswap.service&#xA;&#xA;Installer GitLab&#xA;&#xA;Suivre cette documentation&#xA;&#xA;Limiter le nombre de processus&#xA;&#xA;Par défaut, GitLab fait tourner un nombre important de processus, ce qui fait fortement ralentir les serveurs peu puissants. Pour résoudre ce problème, on va éditer /etc/gitlab/gitlab.rb et réduire le nombre de processus simultanés utilisés par les services de GitLab.&#xA;&#xA;[…]&#xA;puma[&#39;workerprocesses&#39;]=1&#xA;[…]&#xA;sidekiq[&#39;maxconcurrency&#39;]=5&#xA;&#xA;On relance GitLab pour que les modifications soient prises en compte.&#xA;&#xA;sudo gitlab-ctl reconfigure&#xA;&#xA;Une fois GitLab relancé, tout devrait fonctionner correctement et l’utilisation de la RAM du serveur ne devrait pas exceder 90%.&#xA;&#xA;Sources&#xA;&#xA;Faire fonctionner GitLab sur un Raspberry Pi (en)&#xA;&#xA;Si t’as apprécié ce post, envoie-moi une disquette.]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="/june/tag:AdminSys" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">AdminSys</span></a></p>

<h2 id="environnement-utilisé">Environnement utilisé</h2>

<p>Un CPX21 de <a href="https://www.hetzner.com/cloud" rel="nofollow">l’offre Cloud de Hetzner</a>. Je pense que les modifications restent intéressantes pour toute autre configuration équivalente ou moins puissante que celle-ci. Le serveur tourne sous Debian 10.</p>



<h2 id="pré-requis">Pré-requis</h2>

<p>Avoir déjà configuré son serveur SSH pour se connecter avec un utilisateur ayant accès aux droits d’administration.</p>

<h2 id="installer-et-configurer-zram">Installer et configurer zRAM</h2>

<p>zRAM est un outil permettant de compresser la RAM, pour gagner en mémoire vive disponible. Pour plus de détails, je vous recommande de lire l’introduction de <a href="https://doc.ubuntu-fr.org/zram" rel="nofollow">cette page de documentation</a>.</p>

<p>On installe le paquet.</p>

<pre><code class="language-shell">sudo apt install zram-tools
</code></pre>

<p>Une fois installé, zRAM se lance tout seule avec une configuration par défaut. Pour configurer zRAM, on édite le fichier <code>/etc/default/zramswap</code>. On modifie la valeur <code>PERCENTAGE</code> pour augmenter la capacité que peut gérer zRAM, la valeur par défaut devrait être 10, on la passe à 100. On relance le service. pour que la modification fasse effet.</p>

<pre><code class="language-shell">sudo systemctl restart zramswap.service
</code></pre>

<h2 id="installer-gitlab">Installer GitLab</h2>

<p>Suivre <a href="https://about.gitlab.com/install/#debian" rel="nofollow">cette documentation</a></p>

<h2 id="limiter-le-nombre-de-processus">Limiter le nombre de processus</h2>

<p>Par défaut, GitLab fait tourner un nombre important de processus, ce qui fait fortement ralentir les serveurs peu puissants. Pour résoudre ce problème, on va éditer <code>/etc/gitlab/gitlab.rb</code> et réduire le nombre de processus simultanés utilisés par les services de GitLab.</p>

<pre><code class="language-ruby">[…]
puma[&#39;worker_processes&#39;]=1
[…]
sidekiq[&#39;max_concurrency&#39;]=5
</code></pre>

<p>On relance GitLab pour que les modifications soient prises en compte.</p>

<pre><code class="language-shell">sudo gitlab-ctl reconfigure
</code></pre>

<p>Une fois GitLab relancé, tout devrait fonctionner correctement et l’utilisation de la RAM du serveur ne devrait pas exceder 90%.</p>

<h2 id="sources">Sources</h2>
<ul><li><a href="https://docs.gitlab.com/omnibus/settings/rpi.html" rel="nofollow">Faire fonctionner GitLab sur un Raspberry Pi (en)</a></li></ul>

<p>Si t’as apprécié ce post, <a href="http://elud.tkt.lol/" rel="nofollow">envoie-moi une disquette</a>.</p>
]]></content:encoded>
      <guid>https://grimoire.eu.org/june/ia3h9um58g</guid>
      <pubDate>Tue, 06 Apr 2021 22:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Créer un utilisateur SFTP de manière sécurisée et minimaliste</title>
      <link>https://grimoire.eu.org/june/6pl30534ms</link>
      <description>&lt;![CDATA[AdminSys&#xA;&#xA;Pré-requis&#xA;&#xA;Avoir déjà configuré son serveur SSH pour se connecter avec un utilisateur ayant accès aux droits d’administration.&#xA;&#xA;!--more--&#xA;&#xA;Mettre en place l’environnement&#xA;&#xA;Tout ce qui est indiqué dans cette partie a lieu sur le serveur&#xA;&#xA;Pour notre exemple, nous allons assumer que vous souhaitez créer un utilisateur qui va publier du contenu web. Les répertoires indiqués le sont à titre d’exemples, adaptez les chemins en conséquence de vos besoins.&#xA;&#xA;Créer l’utilisateur et son groupe&#xA;&#xA;On créé l’utilisateur, puis son groupe, on rajoute l’utilisateur au groupe et enfin, on s’assure qu’il ne puisse accéder qu’au client SFTP.&#xA;&#xA;sudo useradd username&#xA;sudo groupadd groupname&#xA;sudo gpasswd -a username groupname&#xA;sudo usermod -s  /usr/lib/openssh/sftp-server username&#xA;&#xA;Créer le répertoire de l’utilisateur&#xA;&#xA;On créé le répertoire, on s’assure qu’il appartiennent bien à l’utilisateur root, de le protégér d’écriture de la part d’autres utilisateurs, puis on le définit comme répertoire d’accueil de l’utilisateur.&#xA;&#xA;sudo mkdir /srv/www/domain.tld/&#xA;sudo chown root /srv/www/domain.tld&#xA;sudo chmod go-w /srv/www/domain.tld&#xA;sudo usermod -d /srv/www/domain.tld/ username&#xA;&#xA;Créer le répertoire web&#xA;&#xA;C’est dans ce répertoire que l’utilisateur aura les droits pour créer, supprimer et éditer des fichiers et dossiers. On créé le répertoire, on nomme l’utilisateur et son groupe propriétaires puis on leur donne les droits nécessaires.&#xA;&#xA;sudo mkdir /srv/www/domain.tld/publichtml&#xA;sudo chown username:groupname /srv/www/domain.tld/publichtml&#xA;sudo chmod ug+rwX /srv/www/domain.tld/publichtml&#xA;&#xA;Finaliser l’environnement&#xA;&#xA;N’oubliez pas de rajouter la clef publique SSH de votre utilisateur dans le dossier nécessaire.&#xA;&#xA;On créé le répertoire .ssh nécessaire et le fichier authorizedkeys dans lequel on va mettre la clef publique, enfin, on rend l’utilisateur propriétaire et on s’assure qu’il puisse lire le fichier.&#xA;&#xA;sudo mkdir /srv/www/domain.tld/.ssh&#xA;sudo touch /srv/www/domain.tld/.ssh/authorizedkeys&#xA;sudo chown -R username:groupname /srv/www/domain.tld/.ssh&#xA;sudo chmod u+rX /srv/www/domain.tld/.ssh&#xA;&#xA;Il n’y a plus qu’à copier-coller la clef publique SSH dans le fichier authorizedkeys.&#xA;&#xA;Bloquer l’utilisateur dans l’environnement&#xA;&#xA;Tout ce qui est indiqué dans cette partie a lieu sur le serveur&#xA;&#xA;On édite le fichier /etc/ssh/sshdconfig on vérifie si la directive Subsystem est bien comme indiquée ci-dessous, sinon, on la corrige ou la créé.&#xA;&#xA;[…]&#xA;Subsystem sftp internal-sftp&#xA;[…]&#xA;&#xA;On cherche le bloc AllowUsers, s’il est commenté (avec un en début de ligne #), on le décommente (on efface le #) et puis on y ajoute notre utilisateur.&#xA;&#xA;[…]&#xA;AllowUsers username&#xA;[…]&#xA;&#xA;On se rend à la fin du fichier de configuration, et on rajoute la partie suivante.&#xA;&#xA;[…]&#xA;Match User username # On indique que notre partie concerne l’utilisateur&#xA;&#x9;ChrootDirectory /srv/www/domain.tld # Là où on veut enfermer l’utilisateur&#xA;&#x9;AllowTCPForwarding no&#xA;&#x9;X11Forwarding no&#xA;&#x9;ForceCommand internal-sftp # On force l’utilisateur à utiliser seulement le terminal SFTP&#xA;&#xA;On redémarre SSH pour que la nouvelle configuration soit prise en compte.&#xA;&#xA;sudo systemctl restart sshd.service&#xA;&#xA;Côté client&#xA;&#xA;Sur le PC de l’utilisateur·trice, on génère simplement la clef, et on utilisera SFTP pour se connecter de manière sécurisée.&#xA;&#xA;Tester la connexion à l’environnement&#xA;&#xA;En essayant de se connecter via SSH avec l’utilisateur SFTP, on devrait obtenir le message suivant : This service allows sftp connections only.. SFTP devrait se connecter sans soucis, la commande pwd affichant /. Toute tentative d’ajouter du contenu dans le dossier racine devrait échouée mais une fois dans le dossier /publichtml, l’utilisateur devrait pouvoir ajouter, éditer et supprimer des fichiers et dossiers.&#xA;&#xA;Sources&#xA;&#xA;Créer l’utilisateur proprement (en)&#xA;Placer l’utilisateur et son dossier web (en)&#xA;Restreindre l’utilisateur à l’environnement SFTP (en)&#xA;&#xA;Pour aller plus loin…&#xA;&#xA;Créer un seul groupe pour les utilisateurs SFTP&#xA;&#xA;Si on doit créer plusieurs utilisateurs, avoir un seul groupe à gérer peut être plus pratique. On peut par exemple l’appeler sftp. À la création de nouveaux utilisateurs, on n’aura qu’à directement ajouter ces derniers au groupe comme indiqué au début de ce billet.&#xA;&#xA;Un lien pour approfondir&#xA;&#xA;&#34;How to Set File Permissions Using chmod&#34; par l’Université de Washington(en)&#xA;&#xA;Si t’as apprécié ce post, envoie-moi une disquette.]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="/june/tag:AdminSys" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">AdminSys</span></a></p>

<h2 id="pré-requis">Pré-requis</h2>

<p>Avoir déjà configuré son serveur SSH pour se connecter avec un utilisateur ayant accès aux droits d’administration.</p>



<h2 id="mettre-en-place-l-environnement">Mettre en place l’environnement</h2>

<p><strong>Tout ce qui est indiqué dans cette partie a lieu sur le serveur</strong></p>

<p>Pour notre exemple, nous allons assumer que vous souhaitez créer un utilisateur qui va publier du contenu web. Les répertoires indiqués le sont à titre d’exemples, adaptez les chemins en conséquence de vos besoins.</p>

<h3 id="créer-l-utilisateur-et-son-groupe">Créer l’utilisateur et son groupe</h3>

<p>On créé l’utilisateur, puis son groupe, on rajoute l’utilisateur au groupe et enfin, on s’assure qu’il ne puisse accéder qu’au client SFTP.</p>

<pre><code class="language-sh">sudo useradd &lt;username&gt;
sudo groupadd &lt;groupname&gt;
sudo gpasswd -a &lt;username&gt; &lt;groupname&gt;
sudo usermod -s  /usr/lib/openssh/sftp-server &lt;username&gt;
</code></pre>

<h3 id="créer-le-répertoire-de-l-utilisateur">Créer le répertoire de l’utilisateur</h3>

<p>On créé le répertoire, on s’assure qu’il appartiennent bien à l’utilisateur <code>root</code>, de le protégér d’écriture de la part d’autres utilisateurs, puis on le définit comme répertoire d’accueil de l’utilisateur.</p>

<pre><code class="language-sh">sudo mkdir /srv/www/domain.tld/
sudo chown root /srv/www/domain.tld
sudo chmod go-w /srv/www/domain.tld
sudo usermod -d /srv/www/domain.tld/ &lt;username&gt;
</code></pre>

<h3 id="créer-le-répertoire-web">Créer le répertoire web</h3>

<p>C’est dans ce répertoire que l’utilisateur aura les droits pour créer, supprimer et éditer des fichiers et dossiers. On créé le répertoire, on nomme l’utilisateur et son groupe propriétaires puis on leur donne les droits nécessaires.</p>

<pre><code class="language-sh">sudo mkdir /srv/www/domain.tld/public_html
sudo chown &lt;username&gt;:&lt;groupname&gt; /srv/www/domain.tld/public_html
sudo chmod ug+rwX /srv/www/domain.tld/public_html
</code></pre>

<h3 id="finaliser-l-environnement">Finaliser l’environnement</h3>

<p>N’oubliez pas de rajouter la clef publique SSH de votre utilisateur dans le dossier nécessaire.</p>

<p>On créé le répertoire <code>.ssh</code> nécessaire et le fichier <code>authorized_keys</code> dans lequel on va mettre la clef publique, enfin, on rend l’utilisateur propriétaire et on s’assure qu’il puisse lire le fichier.</p>

<pre><code class="language-sh">sudo mkdir /srv/www/domain.tld/.ssh
sudo touch /srv/www/domain.tld/.ssh/authorized_keys
sudo chown -R &lt;username&gt;:&lt;groupname&gt; /srv/www/domain.tld/.ssh
sudo chmod u+rX /srv/www/domain.tld/.ssh
</code></pre>

<p>Il n’y a plus qu’à copier-coller la clef publique SSH dans le fichier <code>authorized_keys</code>.</p>

<h2 id="bloquer-l-utilisateur-dans-l-environnement">Bloquer l’utilisateur dans l’environnement</h2>

<p><strong>Tout ce qui est indiqué dans cette partie a lieu sur le serveur</strong></p>

<p>On édite le fichier <code>/etc/ssh/sshd_config</code> on vérifie si la directive <code>Subsystem</code> est bien comme indiquée ci-dessous, sinon, on la corrige ou la créé.</p>

<pre><code>[…]
Subsystem sftp internal-sftp
[…]
</code></pre>

<p>On cherche le bloc <code>AllowUsers</code>, s’il est commenté (avec un en début de ligne <code>#</code>), on le décommente (on efface le <code>#</code>) et puis on y ajoute notre utilisateur.</p>

<pre><code>[…]
AllowUsers &lt;username&gt;
[…]
</code></pre>

<p>On se rend à la fin du fichier de configuration, et on rajoute la partie suivante.</p>

<pre><code>[…]
Match User &lt;username&gt; # On indique que notre partie concerne l’utilisateur
	ChrootDirectory /srv/www/domain.tld # Là où on veut enfermer l’utilisateur
	AllowTCPForwarding no
	X11Forwarding no
	ForceCommand internal-sftp # On force l’utilisateur à utiliser seulement le terminal SFTP
</code></pre>

<p>On redémarre SSH pour que la nouvelle configuration soit prise en compte.</p>

<pre><code class="language-sh">sudo systemctl restart sshd.service
</code></pre>

<h2 id="côté-client">Côté client</h2>

<p>Sur le PC de l’utilisateur·trice, <a href="https://tutox.fr/2020/04/16/generer-des-cles-ssh-qui-tiennent-la-route/" rel="nofollow">on génère simplement la clef</a>, et on utilisera SFTP pour se connecter de manière sécurisée.</p>

<h3 id="tester-la-connexion-à-l-environnement">Tester la connexion à l’environnement</h3>

<p>En essayant de se connecter via SSH avec l’utilisateur SFTP, on devrait obtenir le message suivant : <code>This service allows sftp connections only.</code>. SFTP devrait se connecter sans soucis, la commande <code>pwd</code> affichant <code>/</code>. Toute tentative d’ajouter du contenu dans le dossier racine devrait échouée mais une fois dans le dossier <code>/public_html</code>, l’utilisateur devrait pouvoir ajouter, éditer et supprimer des fichiers et dossiers.</p>

<h2 id="sources">Sources</h2>
<ul><li><a href="https://unix.stackexchange.com/questions/83221/how-to-create-a-ftp-user-with-specific-dir-access-only-on-a-centos-linux-ins" rel="nofollow">Créer l’utilisateur proprement (en)</a></li>
<li><a href="https://askubuntu.com/questions/134425/how-can-i-chroot-sftp-only-ssh-users-into-their-homes" rel="nofollow">Placer l’utilisateur et son dossier web (en)</a></li>
<li><a href="https://www.howtoforge.com/restricting-users-to-sftp-plus-setting-up-chrooted-ssh-sftp-debian-squeeze" rel="nofollow">Restreindre l’utilisateur à l’environnement SFTP (en)</a></li></ul>

<h2 id="pour-aller-plus-loin">Pour aller plus loin…</h2>

<h3 id="créer-un-seul-groupe-pour-les-utilisateurs-sftp">Créer un seul groupe pour les utilisateurs SFTP</h3>

<p>Si on doit créer plusieurs utilisateurs, avoir un seul groupe à gérer peut être plus pratique. On peut par exemple l’appeler <code>sftp</code>. À la création de nouveaux utilisateurs, on n’aura qu’à directement ajouter ces derniers au groupe comme indiqué au début de ce billet.</p>

<h3 id="un-lien-pour-approfondir">Un lien pour approfondir</h3>
<ul><li><a href="https://www.washington.edu/computing/unix/permissions.html" rel="nofollow">“How to Set File Permissions Using <code>chmod</code>” par l’</a><em><a href="https://www.washington.edu/computing/unix/permissions.html" rel="nofollow">Université de Washington</a></em><a href="https://www.washington.edu/computing/unix/permissions.html" rel="nofollow">(en)</a></li></ul>

<p>Si t’as apprécié ce post, <a href="http://elud.tkt.lol/" rel="nofollow">envoie-moi une disquette</a>.</p>
]]></content:encoded>
      <guid>https://grimoire.eu.org/june/6pl30534ms</guid>
      <pubDate>Tue, 08 Dec 2020 23:00:00 +0000</pubDate>
    </item>
  </channel>
</rss>