Git commiting : entre user.name, author et propriétaire de clé.¶
Dans le cadre de ma VAE, je me suis posé quelques questions concernant les traçages des commit de git. Mon objectif était de prouver qu’il fallait forcément signer ses commits pour qu’ils puissent être jugés légitime. Et même après ça, j’ai encore un petit doute quant au derniers cas d’usage. Mais bon, commençons par le commencement.
Initialisons le repos git¶
Avant toute chose, il convient d’intialiser le repos git.
lucas@OP3:~$ cd Github/
lucas@OP3:~/Github$ git init git_impersonate
Dépôt Git vide initialisé dans /home/lucas/Github/git_impersonate/.git/
lucas@OP3:~/Github$ cd git_impersonate/
lucas@OP3:~/Github/git_impersonate$ git remote add origin https://git.luclis.fr/Lucas.FILIPPI/git_impersonate.git
Cas n° 1 : écrivons un commit normal¶
Et comme on commence simplement, on va faire un commit tout simple. Rien de bien méchant jusque là.
lucas@OP3:~/Github/git_impersonate$ touch fichier1
lucas@OP3:~/Github/git_impersonate$ git add fichier1
lucas@OP3:~/Github/git_impersonate$ git commit --m "Mon tout premier commit !"
[master (commit racine) 1d6daad] Mon tout premier commit !
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 fichier1
lucas@OP3:~/Github/git_impersonate$ git push origin master
To https://git.luclis.fr/Lucas.FILIPPI/git_impersonate.git
bd3c5ce...1d6daad master -> master
Cas n° 2 : je me fais passer pour un autre¶
Bien, maintenant on va tenter de se faire passer pour quelqu’un d’autre, au hasard … Loïc.
lucas@OP3:~/Github/git_impersonate$ echo '[user]
name = Loic.FILIPPI
email= Loic.FILIPPI@luclis.fr' >> ./.git/config
J’ai configuré mon git, je vais maintenant envoyer un commit sans rien de particulier.
lucas@OP3:~/Github/git_impersonate$ touch fichier2
lucas@OP3:~/Github/git_impersonate$ git add fichier2
lucas@OP3:~/Github/git_impersonate$ git commit -m "Maintenant je suis loïc"
[master c455554] Maintenant je suis loïc
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 fichier2
lucas@OP3:~/Github/git_impersonate$ git push origin master
To https://git.luclis.fr/Lucas.FILIPPI/git_impersonate.git
1d6daad..c455554 master -> master
Ça marche, c’est logique me diriez-vous, si vous êtes loïc, vous avez le droit de vous appeler comme ça. Concernant la permission de pousser du code sur le répertoire, celle-ci est gérée côté gitea, et ne se voit pas sur la répository directement donc je l’ai jugé hors périmètre et sans intérêt.
Cas n°3 : on dit être un autre auteur durant le commit¶
Bon, maintenant que se passe-t-il si je souhaite écrire un commit en précisant que je n’en suis pas l’auteur ?
lucas@OP3:~/Github/git_impersonate$ touch fichier3
lucas@OP3:~/Github/git_impersonate$ git add fichier3
lucas@OP3:~/Github/git_impersonate$ git commit --author "Toto <toto@localhost>" -m "Je suis caché !"
[master 1c2a8df] Je suis caché !
Author: Toto <toto@localhost>
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 fichier3
lucas@OP3:~/Github/git_impersonate$ git push origin master
To https://git.luclis.fr/Lucas.FILIPPI/git_impersonate.git
c455554..1c2a8df master -> master
Tout passe sans soucis. On remarquera tout de même que le commit est vu comme « commité par Loïc FILIPPI » (normal, je ne l’ai pas changé).
Cas n°4 : avec un commit signé via GPG¶
Maitenant, le clou du spectacle : on va montrer que GPG permet de s’assurer de qui a fait le commit, et que c’est ; jusqu’à présent ; la seule solution.
On commence par enlever la configuration de l’autre auteur et par demander à git de signer automatiquemeent tous mes commits avec ma clé GPG:
lucas@OP3:~/Github/git_impersonate$ vi ./.git/config
lucas@OP3:~/Github/fake_account$ git config --global --add commit.gpgsign true
lucas@OP3:~/Github/git_impersonate$ git config -l
user.signingkey=5F2EE16CF79746B73A92037D912566351E4B8A03
user.name=Lucas FILIPPI
user.email=Lucas.FILIPPI@luclis.fr
init.defaultbranch=master
core.editor=vim
commit.gpgsign=true
credential.helper=cache --timeout=300
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=https://git.luclis.fr/Lucas.FILIPPI/git_impersonate.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
N.B: Je n’ai pas configuré ici ma clé, cette dernière l’étant déjà. j’ai juste forcer git à signer ces commits. Ensuite, comme tout à l’heure, je vais faire un simple commit signé.
lucas@OP3:~/Github/git_impersonate$ touch fichier4
lucas@OP3:~/Github/git_impersonate$ git add fichier4
lucas@OP3:~/Github/git_impersonate$ git commit -m 'Mon premier commit signé !'
[master 019bd72] Mon premier commit signé !
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 fichier4
lucas@OP3:~/Github/git_impersonate$ git push origin master
To https://git.luclis.fr/Lucas.FILIPPI/git_impersonate.git
1c2a8df..019bd72 master -> master
Comme ma clé GPG est rentré côté serveur, on voit bien c’est moi qui ai signé le commit. C’est en accord avec l’auteur et le commiteur, alors tout va bien.
Cas n°5 : On mélange tout ça¶
Bon, on vient de voir qu’il était possible de changer pas mal de chose, et que gitea m’identifie grâce à ma clé privée. Qu’en est-il si jamais je mélange un peu tout ce qu’on a fait jusque là. Disons que je vais signer un commit avec la clé du lucas, le publier en tant que Loïc et dire que c’est toto l’auteur.
lucas@OP3:~/Github/git_impersonate$ echo '[user]
name = Loic.FILIPPI
email= Loic.FILIPPI@luclis.fr' >> ./.git/config
lucas@OP3:~/Github/git_impersonate$ touch fichier5
lucas@OP3:~/Github/git_impersonate$ git add fichier5
lucas@OP3:~/Github/git_impersonate$ git commit --author "Toto <toto@localhost>" -m "Ça tourne, c'est bizarre ..."
[master 80b1312] Ça tourne, c'est bizarre ...
Author: Toto <toto@localhost>
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 fichier5
lucas@OP3:~/Github/git_impersonate$ git push origin master
To https://git.luclis.fr/Lucas.FILIPPI/git_impersonate.git
019bd72..80b1312 master -> master
Ça nous fait un beau bordel pas vrai ?

Le bilan¶

Au final, avec ce petit exercice, on peut comprendre que la sécurité de git repose quasiment exclusivement sur les clés privée GPG qui ne sont pas activées par défaut. Ainsi, il convient donc de mettre en place une clé privée et de signer tout vos commit. C’est la seule façon pour que quelqu’un ne puisse pas se faire passer pour vous sans qu’il ai accès à votre machine (et donc la clé privée) ou à votre compte (et donc qu’il puisse rajouter une clé publique).