Signer ses commits Git et trans­fé­rer son gpg-agent sur un serveur distant

GPG, c’est bien. C’est encore ce qu’on a trouvé de mieux pour que tout un chacun puisse s’as­su­rer de l’au­then­ti­cité d’un message (non-modi­fi­ca­tion de celui-ci et que son auteur est bien celui annoncé) et chif­frer ses messages.

OK, c’est pas un exemple d’er­go­no­mie, OK, c’est pas ma mère qui va s’en servir sciem­ment tous les jours (sous le manteau, si, puisque les paquets de sa Debian sont signés avec GPG). Mais d’un autre côté, ma mère ne risque pas non plus (et je dirais même encore moins) de se payer un certi­fi­cat X509 pour signer ses mails. Ne parlons pas de mon père, à côté de lui, ma mère fait figure de hax0r.

Bon, d’ac­cord, c’est un bon gros truc de geek. OSEF, c’est cool quand même, c’était pour dire que c’était robuste et que tout le monde peut l’uti­li­ser sans bourse délier.

Que vous le sachiez (dans la colle) ou pas, on peut signer ses commits git avec GPG, histoire d’ajou­ter encore une couche de sécu­rité aux modi­fi­ca­tions qu’on apporte à un logi­ciel. Des forges comme Gitlab permettent d’ajou­ter une clé GPG à son profil permet­tant ainsi de véri­fier les signa­tures des commits d’un projet. Voyez sur ce commit le joli petit bouton « Veri­fied ».

Ceci n’est pas un cours sur GPG, on va donc consi­dé­rer que vous avez déjà une clé GPG.

Signer ses commits Git

Rien de plus simple. Il faut tout d’abord décla­rer à Git quelle clé doit être utili­sée pour signer ses commits (chan­gez l’em­preinte, ça c’est la mienne ) :

git config --global user.signingkey EA868E12D0257E3C

Main­te­nant, soit vous ajou­tez -S quand vous commit­tez :

git commit -S

Soit vous confi­gu­rez Git pour signer tous vos commits :

git config --global commit.gpgsign true

Voilà, c’est bon. Pour véri­fier un commit :

git verify-commit cce09ca

C’est bien beau, mais ça m’ar­rive de déve­lop­per direc­te­ment sur des serveurs, et surtout, je déve­loppe géné­ra­le­ment dans une machine virtuelle sur mon PC. Je ne vais certai­ne­ment pas aller copier ma clé privée sur les-dits serveurs ou dans la machine virtuelle ! C’est là qu’in­ter­vient le trans­fert du gpg-agent sur le serveur distant.

Ceci n’est toujours pas un cours sur GPG, on va donc consi­dé­rer que vous avez déjà un gpg-agent fonc­tion­nel sur votre ordi­na­teur.

Trans­fé­rer son gpg-agent sur un serveur distant

ATTENTION On ne trans­fère son agent gpg que sur une machine dans laquelle on a confiance, et dont on sait que les personnes y ayant accès ne s’amu­se­ront pas à utili­ser votre agent (rien de plus simple si on a un accès root à la machine). Cela vaut aussi pour l’agent ssh !

Premiè­re­ment, on va dire à l’agent de créer un socket supplé­men­taire en mettant dans ~/.gnupg/gpg-agent.conf (rempla­cez <user> par votre login) :

extra-socket /home/<user>/.gnupg/S.gpg-agent.extra

Ce socket a des restric­tions que n’a pas le socket habi­tuel (ne me deman­dez pas lesquelles) mais surtout, le logi­ciel qui vous deman­dera votre mot de passe (pinen­try de son petit nom géné­rique) vous présen­tera la demande de mot de passe diffé­rem­ment d’ha­bi­tude. Moi, il m’a dit en gros « Cette demande provient d’une machine distante », ce qui permet de repé­rer d’où vient la demande (déjà pas de votre machine pour déchif­frer un mail par exemple) et de réflé­chir à si c’est bien vous qui avez fait une action deman­dant la clé GPG.

On redé­marre l’agent pour prendre en compte la nouvelle confi­gu­ra­tion :

gpg-connect-agent /bye

Ensuite, il va falloir modi­fier sa confi­gu­ra­tion SSH. Comme un bon adminSys est fainéant, vous avez bien sûr utilisé concierge pour gérer votre fichier ~/.ssh/config. Il suffit d’ajou­ter dans le bloc de confi­gu­ra­tion du serveur souhaité la ligne (rempla­cez uid par votre uid (id pour le connaître) et <user> par votre login):

RemoteForward /run/user/<uid>/gnupg/S.gpg-agent /home/<user>/.gnupg/S.gpg-agent.extra

Enfin, il faut ajou­ter ceci dans le /etc/ssh/sshd_config du serveur distant (et redé­mar­rer son dæmon ssh après) :

StreamLocalBindUnlink yes

C’est fini ! Vous pouvez main­te­nant utili­ser votre clé GPG sur un serveur distant en vous y connec­tant en SSH, sans copier votre clé sur le serveur

Connec­tez-vous en SSH et testez avec

echo "test" | gpg2 --clearsign

Si, lorsque vous tentez de signer un commit sur votre serveur distant, cela échoue, assu­rez-vous que git utilise bien gpg2 :

git config --global gpg.program gpg2

Merci à Thomas Citha­rel pour avoir mis la signa­ture GPG des commits sur le tapis d’une discus­sion, ce qui m’a poussé à me pencher sur le trans­fert de l’agent GPG.

Crédit image d’en-tête de ce billet : logo de GnuPG, licence GPL, récu­péré sur Wiki­me­dia Commons

Me soutenir sur Tipeee Me soutenir sur Liberapay

Utili­ser les données de Munin dans Grafana

Munin est un super outil de métro­lo­gie. Simple à instal­ler (présent dans toutes les bonnes distri­bu­tions), simple à confi­gu­rer (à un tel point que c’en est risible) et simple à étendre (on peut écrire des plugins pour tout, même pour surveiller une cafe­tière).

Mais on entend souvent « Ouais, mais les graphes RRDtool, c’est moche » (RRDtool est un outil permet­tant de faire plein de choses avec des bases de données RRD (Round Robin Data­base, bases de données tempo­relles), qui donne des graphiques au look vieillot).

Genre des graphes comme ça :

Du coup on n’en­tend plus parler que de Prome­theus, NetData et autres trucs de hips­ter bran­chouilles (mode vieux con assumé).

Ok, vous voulez du joli dash­board ? On va vous en donner.

La réfé­rence du machin qui fait des jolis graphes, c’est Grafana. Donc je suis parti sur ça.

Permettre à Grafana d’avoir accès aux données de Munin

Parce que Grafana ne sait pas taper dans des bases de données RRD, on va instal­ler Grafana RRD Server. Celui-ci va four­nir une API JSON à Grafana pour aller taper dans les bases RRD de Munin.

apt install librrd-dev

Ensuite

cd /tmp
wget https://github.com/doublemarket/grafana-rrd-server/releases/download/v0.0.5/grafana-rrd-server_linux_amd64.gz -O grafana-rrd-server.gz
gunzip grafana-rrd-server.gz
mv grafana-rrd-server /usr/bin/

On le lance ainsi (regar­dez le -h pour le détail des options) :

grafana-rrd-server -r /var/lib/munin/

Il écou­tera par défaut sur toutes les IPs, sur le port 9000. Libre à vous de le mettre derrière un Nginx ou autre, avec ou sans authen­ti­fi­ca­tion.

Pour le service systemd :

[Unit]
Description=Grafana RRD Server
Documentation=https://github.com/doublemarket/grafana-rrd-server
Requires=network.target
After=network.target

[Service]
Type=simple
User=munin
ExecStart=/usr/bin/grafana-rrd-server -r /var/lib/munin/
SyslogIdentifier=grafana-rrd-server

[Install]
WantedBy=multi-user.target

(Je ne l’ai pas testé, je viens de l’écrire à l’os)

systemctl daemon-reload
systemctl start grafana-rrd-server
systemctl status grafana-rrd-server
systemctl enable grafana-rrd-server

Instal­ler Grafana

Grafana four­nit un dépôt APT, ce qui est bien pratique :

apt install -y apt-transport-https
echo "deb https://packagecloud.io/grafana/stable/debian/ stretch main" > /etc/apt/sources.list.d/grafana.list
curl https://packagecloud.io/gpg.key | sudo apt-key add -
apt update
apt install grafana
systemctl daemon-reload
systemctl start grafana-server
systemctl status grafana-server
systemctl enable grafana-server

Hop, il écoute par défaut sur toutes les inter­faces, sur le port 3000. Encore une fois, à vous de le mettre derrière un Nginx, etc.

Le couple login / mot de passe par défaut est admin et admin.

Faire la liai­son entre les deux

Il faut encore que Grafana soit capable d’in­ter­ro­ger l’API JSON de Grafana RRD Server. Pour ça, on va lui instal­ler le plugin SimpleJ­son :

grafana-cli plugins install grafana-simple-json-datasource

Confi­gu­rer Grafana

Allez sur votre Grafana, allez dans la section « Data sources », cliquez sur « Add data source », choi­sis­sez le type SimpleJ­son, mettez l’adresse de votre Grafana RRD Server et hop, c’est tout bon. Vous n’avez plus qu’à ajou­ter des graphes prove­nant de cette source de données dans vos dash­boards.

Bon pis voilà, ça permet d’avoir un truc comme ça :

Conclu­sion

J’ai fait ça pour le fun, parce que j’en avais marre d’en­tendre des critiques sur Munin et des « Nan mais Prome­theus, c’est vache­ment mieux tu vois ». Non, je ne vois pas. Oui, les nouveaux outils sont jolis. Oui, ils ont une super granu­la­rité. Mais des points qu’on oublie souvent, c’est :

  • Munin est telle­ment simple à instal­ler et confi­gu­rer ;
  • Des jolis graphes, ouais, c’est cool, mais sérieux, qui se touche la nouille sur ses graphes toute la jour­née ? Ok, Munin, c’est assez moche, mais ça fait le job, je suis informé en regar­dant les graphes, et c’est tout ce que je lui demande ;
  • Prome­theus, NetData et compa­gnie, ça surveille telle­ment de trucs en perma­nence que ça ne se fait pas oublier sur le serveur. Si, si, j’ai bien vu ces outils me ralen­tir mes serveurs. Quand le serveur est à la peine, ces deux outils ont empiré les choses, là où Munin ne fait ses checks que toutes les cinq minutes. #TrueS­tory

Donc voilà : on est capable d’avoir de jolis graphes avec Munin, avec un mini­mum de taf. Bon, c’est en place, je vais pas jeter le boulot que j’ai fait, mais à moins qu’on me dise au boulot « C’est méga top, je vais m’en servir tout le temps », je vais le désac­ti­ver.

Bon, y a quand même un truc pas mal avec cette histoire, c’est qu’on peut affi­cher sur le même graphe des données qui ne sont pas agré­gées sur Munin. Genre empi­ler les nombres de mails envoyés par jour par toutes les machines qui envoient du mail, comme sur le graphe en bas à gauche de l’image ci-dessus. C’est pas complè­te­ment dénué d’in­té­rêt.

NB : Prome­theus et NetData ont d’autres quali­tés que les jolis graphes, comme par exemple des alertes intel­li­gentes. Contrai­re­ment à Munin (ou Nagios, ou autre système de moni­to­ring clas­sique) qui alerte quand les valeurs dépassent un certain seuil, ces nouveaux outils vont dire « Atten­tion, si le disque conti­nue à se remplir à ce rythme là, il sera plein dans 4h », même si le disque n’est rempli qu’à 50%. Et c’est bien. Mais pour moi, Munin, c’est de la métro­lo­gie (on enre­gistre, on peut consul­ter le passé et le présent), pas de la super­vi­sion au sens Nagios. Il peut le faire, mais c’est clai­re­ment pas son usage premier. Donc du coup, les nouveaux outils vont se compa­rer à mon instal­la­tion de Shin­ken, pas à mon Munin. Compteur Dolomon

Me soutenir sur Tipeee Me soutenir sur Liberapay