Authentification et chiffrement
Cette page est à destination des administrateurices, elle détaille les protocoles d'authentification et de chiffrement utilisés pour les opérations de maintenance. Le but de ces protocoles est de permettre une administration collaborative fluide et sécurisée tout en gardant une bonne traçabilité.
Authentification¶
Authentification sur les services¶
Authentification centralisée¶
Afin de d'éviter de créer un compte (et donc un mot de passe) par service, ce que devient vite fastidieux et source d'insécurité pour les utilisateurices, nous utilisons un service d'authentification centralisé (SSO). Nous avons choisi Hiboo pour les raisons explicitées ici par les créateurices. L'un des principaux avantages de cet outil et qu'il permet de séparer le processus d'authentification et la gestion des profils.
Ce service est hébergé à l'adresse auth.felinn.org (voir la documentation).
Il est possible d'activer une double authentification avec TOTP (nécessite un client TOTP) sur Hiboo. Cf. doc utilisateurice.
Hiboo gère l'authentification via les protocoles SAML et OICD qui permettent notamment que les services n'aient pas connaissance des identifiants et mots de passe utilisés par les comptes.
Pour le moment tous les services ne sont pas connectés à Hiboo.
Compte administrateurice¶
- Pour s'occuper des services web, on utilise au un compte dédié aux tâches d'administration. Dans certains cas (par exemple sur GitLab) ce sont les utilisateurices administrateurices qui ont les privilèges admin directement depuis leur compte personnel.
- Pour les services système, on utilise généralement l'authentification PAM. Dans la mesure du possible, les services utilisent des user avec les privilège strictement nécessaires (pas root).
Authentification sur les serveurs¶
Accès¶
L'accès à distance au serveur pour les opération de maintenance se font en SSH avec une authentification par clé publique personnelle. Votre clé doit être ajoutée aux clé autorisées .ssh/authorized_keys
.
Les services tournent dans des containers séparés. À de rares exceptions, les services sont accessibles depuis l'extérieur uniquement en https
. Pour entrer dans un container, il faut se connecter sur le serveur principale en SSH et utiliser la commande pct enter <id>
.
Traçabilité¶
Les services utilisent etckeeper
pour le suivi des modifications. Dans la mesure du possible les fichiers de configuration des services sont ajoutés dans /etc
pour pouvoir tracer leur modification, en utilisant des liens symboliques vers leurs emplacements fonctionnels si besoin. Les répertoires git sont ajoutés sur la forge, ce qui permet de mettre en relation des issues
et leurs résolutions dans les commits
des fichiers de configuration et d'avoir une traçabilité historique.
Identification¶
Pour identifier l'auteurice des modifications, un petit réglage est nécessaire dans les paramètres shell et SSH :
- configurer localement git avec le nom et l'email de l'auteurice tels que connus par notre instance Gitlab :
1 2
$ git config --global user.name "me" $ git config --global user.email me@felinn.org
- ajouter des variables d'environnement git et les exporter dans
.zshrc
,.bashrc
, etc :1 2 3 4 5
# export local git config to ssh export GIT_AUTHOR_NAME=`/usr/bin/git config user.name` export GIT_AUTHOR_EMAIL=`/usr/bin/git config user.email` export GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME export GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL
- demander à ssh d'exporter ces variables lors d'une connexion
$HOME/.ssh/config 1 2
Host cs20 SendEnv LANG LC_* GIT_*
- côté serveur, SSH est déjà configuré pour autoriser ces variables
/etc/ssh/sshd_config 1 2
# Allow client to pass locale environment variables AcceptEnv LANG LC_* GIT_*
Maintenant lorsqu'un commit est réalisé, c'est votre configuration qui est utilisée :
1 2 3 4 5 6 7 8 |
|
Authentification¶
Pour authentifier l'auteurice, les commits sont signés sur la machine distante avec votre clé privée locale grâce à gpg-agent forwarding.
La partie serveur étant déjà implémentée, voici ce qu'il faut faire en local :
- utiliser
gpgconf --list-dir agent-extra-socket
pour obtenir le chemin vers l'extra socket
. - modifier votre configuration SSH
$HOME/.ssh/config 1 2
Host cs20 # utiliser /etc/hosts ou l'IP RemoteForward /run/user/0/gnupg/S.gpg-agent <chemin-vers-votre-extra-socket>
- ajouter votre clé publique sur le serveur, comme la clé est utilisée uniquement pour signer vous pouvez envoyer uniquement la sous-clé dédiée à cette tâche
1 2
# Le "!" permet d'agir sur une sous-clé gpg --export XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX! | ssh root@cs20 'gpg --import'
- se connecter au serveur en ssh et vérifier que ça fonctionne
1 2
# Affiche le message PGP echo "It works" | gpg --sign --armor -r XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!
PGP¶
Sous-clés¶
Pour s'authentifier, la FELINN utilise PGP. Pour éviter de compromettre la clé mère CD182B1C1A8519150B19F186F69F95B658570C00
, on utilise des paires de sous-clés.
Tip
Si vous n'avez jamais utilisé GPG nous vous recommandons d'aller voir un guide, par exemple celui-ci
On utilise des paires de sous-clés pour les différentes fonctions offertes par PGP : (E)ncrypt/decrypt, (S)ign, (A)uthentification, (C)reate/revoke
.
1 2 3 4 5 6 7 8 9 10 |
|
Note
Il éxiste un ancienne clé qui a été révoquée : C2B1708DD2935BB2A6E53FFBB3A4AE5611CD4314
Attention
En cas de compromission d'une sous-clé, un certificat de révocation est publié et une nouvelle sous-clé générée.
Clé mère¶
Si les clés filles permettent les opérations PGP du quotidien, la clé mère est quant à elle nécessaire pour des opérations plus sensible :
- créer un certificat de révocation
- générer une clé fille
- modifier les clés existantes (expiration)
- signer et truster une autre clé
Dès lors, cette clé bénéficie d'une protection beaucoup plus importante que les clés filles :
Personne ne détient la clé, elle n'existe pas à proprement parler, elle est découpée en plusieurs parties qui doivent être rassemblées pour la reconstituer et l'utiliser.
La clé mère est à la source de la chaine d'authentification. Il faut donc s'assurer que la clé :
- est pérenne
- est accessible aux membres certifié·es quand c'est nécessaire
- n'est pas corrompue
- n'est pas compromise
- son pouvoir ne puisse pas être utilisé de manière despotique, i.e. qu'un·e membre ne puisse pas l'utiliser sans l'aval d'une décision collective
C'est un enjeu connu en cryptographie, que permet de résoudre le « secret sharing ». Il existe plusieurs implémentations de cet algorithme. Nous avons retenu sss-cli, une librairie écrite en Rust qui utilise notamment une secretbox AEAD.
Note
Une implémentation de la spécification DarkCrystal en Rust est en cours d'élaboration pour la suite. Ref. et disscussion
On utiliser sss-cli pour découper et recombiner la clé. Les parties (shards) sont signées avec la clé FELINN et chiffrées avec PGP avec les clés personnelles avant d'être envoyées. Les fichiers sont ensuite shredé et la clé mère supprimée.
Gestion des mots de passe¶
La sous-clé privée (E) donne la possibilité de lire l'ensemble des mots de passe utilisés par la FELINN qui sont gérés avec pass
. Les mots de passe sont partagés entre les administrateurice sur un répertoire git accessible ici.
En temps qu'administrateurices vous aurez besoin d'accéder à ces mot de passe, et donc être en possession de la sous-clé qui permet de les déchiffrer. Pour cela il faut que vous soyez authentifié en temps que membre administrateurice avec les droits associés.
Pour vous authentifier personnellement auprès de la FELINN il faut suivre les étapes suivante. :
Protocole
- Faire une clé RSA
4096 bit
avec une bonne phrase de passe pour votre compte personnel si vous n'en avez pas déjà une, si possible utiliser ou ajouter l'identité<username>@felinn.org
(votre adresse mail par défaut). - Il est recommandé d'utiliser également des sous-clés pour chaque fonction et de garder votre clé mère en lieu sûr.
- Publiez votre clé sur un serveur de clé ou envoyez là directement à la FELINN via un canal qui vous identifie bien, avec une double authentification, par exemple [matrix] avec visio si une rencontre physique est impossible.
Si vous êtes administrateurice, votre clé sera signée par la clé de la FELINN, ce qui permettra de vous certifier comme administrateurice fiable. En fonction des besoins les clés privées vous seront transmises chiffrées avec votre propre clé par les autres membres. Pour importer une clé sans l'écrire en claire sur le disque on peux utiliser:
1 |
|
On peut utiliser shred -un 42 clé_privée.gpg
pour la supprimer vraiment d'un support de stockage.
Structure du répertoire¶
Les mots de passe sont organisés suivant l'arborescence suivante : <service>/<logiciel>/<uid.gpg>
.
service
représente un service (foo.felinn.org
), un logiciel
(mysql
), uid
un identifiant (root
).
On inscrit un seul mot de passe par fichier, sur une seule ligne, pour pouvoir utiliser pass -c
.
Example
1 2 3 4 5 6 |
|
Utilisation¶
Attention
Ne faites rien avant d'avoir passé cette check-list :
- vous utilisez Linux ou un OS libre dans lequel vous avez confiance (pas windows, ya trop de backdoor)
- votre OS n'utilise pas ou très peu de code propriétaire et les grands méchants ne sont pas root dessus
- le support sur lequel vous aller stocker la clé est chiffré
- votre session utilisateurice est protégée par une solide phrase de passe
- vous avez lu et compris les bases du chiffrement asymétrique et et de PGP
- vous avez réussi à envoyer un email chiffré à la FELINN avec votre propre clé (que vous n'oublierez pas de communiquer en PJ), et vous avez réussi à lire la réponse
- vous maîtrisez les bases de git
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
pass
gère git automatiquement, et il est possible de passer des commandes git à pass
(voir la doc).
Attention
N'oubliez pas de pull/push les répertoires afin de garder à jour les mots de passe avec tout le monde.
Utiliser pass
avec git submodule
¶
Si vous utilisez déjà pass
pour vos mots de passe personnels parce que c'est super, voici une solution :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
Tip
Chiffrement¶
Chiffrement du serveur (server-side)¶
Les serveurs utilisent ZFS, les datasets qui contiennent les données sont chiffrés avec le chiffrement natif de ZFS.
Note
Voir l'installation et la maintenance du serveur pour le détail de la gestion du stockage.
Chiffrement des connexions¶
La totalité des connexions aux services est réalisée par des protocoles chiffrés :
- les connexion en SSH sont chiffrées nativement.
La plupart des services ne sont pas accessible en SSH depuis l'exterieur, on passe par le serveur principale pour s'y connecter avec
pct
. Quelques LXC et VM sont accessible en SSH sur des ports alternatifs. - les service web sont accessible via
https
, les certificats sont signés par Let's encrypt avec certbot. Toutes les connexionshttp
sur le port80
sont redirigées vershttps
sur le port443
. Le proxy web concentre toutes les connexions entrantes sur le serveur web. Les connexions sont redirigées vers les bons services en se basant sur le nom de domaine, la plupart des connexions internes sont enhttp
sur le port80
mais certaines sont chiffrées. À terme la totalité des connexions seront chiffrées en interne. - les connexions au service de mail
SMTP
etIMAP
sont chiffrées, les certificats sont signés par Let's encrypt avec certbot. Les émails sortant sont authentifiés avec le protocole DKIM. L'interface webmail roundcube permet d'utiliser des clés de PGP pour chiffrer et signer les mails. - les connexions ftp sont rootées dans une connexion SSH.
- les requêtes DNS ne sont pas chiffrées, une amélioration sera d'utiliser et héberger un serveur DOH.
Chiffrement des services¶
En plus du chiffrement ZFS, certains services possèdent leur propre capacité de chiffrement.
Chiffrement du cloud¶
Nextcloud permet une couche supplémentaire de sécurité aux personnes voulant stocker des données sensibles. Notre instance propose du chiffrement de bout en bout : une fois les données chiffrées par cette technique elles sont accessibles uniquement au propriétaire et aux personnes concernées par un partage, il n'est pas possible pour les administrateurices de les déchiffrés. L'utilisateurice peut utiliser cette méthode de chiffrement sur des dossiers uniquement, et ceux-ci ne seront lisibles que par les appareils possédant les clés de chiffrement (et par les autres utilisateurices autorisé.es).
Choisir de chiffrer des fichiers avec cette technique est donc à double tranchant : nous ne pouvont pas fournir les données en clair en cas de demande judiciaire, mais nous ne pouvons pas vous aider à les recouvrer en cas de perte des clés de chiffrement non plus.
Un récapitulatif du chiffrement sur le cloud est disponible en commentaire de cette issue.
Chiffrement de [matrix]¶
Le protocole [matrix] stocke les messages chiffrés en E2E sur le serveur (pour les salons privés ayant activé le chiffrement de bout-en-bout).
Chiffrement des émails¶
Les emails sont chiffrés pendant le transit (SSL/TLS) mais ne sont actuellement pas chiffrés sur le serveur. À terme, les mails seront chiffrés avec une clé, elle-même chiffrée avec le mot de passe de l'utilisateurice et seront donc illisibles pour tout autre personne. Voir ici pour suivre l'avancée.