Skip to content

demarches-simplifiees/ds_proxy

Repository files navigation

DS Proxy

Contexte

DS Proxy est un proxy HTTP de chiffrement en streaming. Il est utilisé sur démarches-simplifées avec un backend Openstack Swift mais devrait être compatible avec le protocol S3. Il permet de se prémunir d'accès non autorisé aux espaces de stockages mutualisés de type object storage en y stockant uniquement de la donnée chiffrée.

Fonctionnalités :

  • chiffre et déchiffre de manière transparente pour le client des fichiers en http en les stockants sur l'object storage
  • chiffre et stocke en local de gros fichier (/local/) depuis un envoi http
  • chiffrer et déchiffrer des fichiers sur le système de fichier
  • est performant
  • supporte de multiples clés de chiffrement pour se conformer à une politique de péremption de clés
  • possède une url de health check /ping qui renvoie une 404 si le fichier maintenance est présent à côté du binaire

Pour commencer

prérequis:

  • rust dans la version précisée par le fichier Cargo.toml
  • et dans le cadre de la démo node

puis lancer le script launch_demo.sh qui compilera le proxy, le démarrera, et qui lancera un faux backend object storage en node.

Installation

  • compiler le proxy pour la production: cargo build --release, le binaire se trouve à présent ici : target/release/ds_proxy
  • placer le binaire sur votre server et utiliser votre système habituel pour le superviser

Exemple d'un fichier service minimal de supervision par systemd:

[Unit]
Description=DS Proxy Service
After=network.target

[Service]
ExectStart=/usr/bin/ds_proxy proxy --password-file /var/ds_proxy/password --salt a_32_charactere_long_salt_123456 --keyring-file /var/ds_proxy/keyring.toml  --local-encryption-directory /var/ds_proxy/local_encryption/ --address 0.0.0.0:4444 --upstream_url 'https://my-storage-object.com'

Environment=RUST_LOG="actix_web=info"
...

Garder le mot de passe en mémoire

Pour éviter que le mot de passe ne reste sur le disque et en suivant https://www.netmeister.org/blog/passing-passwords.html, nous utilisons mkfifo pour créer un named pipe qui nous permet de le transmettre en restant en mémoire. En voici le principe :

mkfifo -m 0600 password_file
systemctl start ds_proxy
systemd-ask-password > password_file
rm -f password_file

Dans le détail

Algo

DS Proxy utilise actuellement l'algorithme de chiffrement xchacha20poly1305 proposé par la librairie sodium dont l'interface est portée en rust par sodiumoxide.

Les clés de chiffrement sont stockées sur un fichier keyring.toml. Ce fichier est lui-même chiffré à l'aide d'un mot de passe maître et d'un sel.

Dépendances

En plus des différents crates utilisés référencés dans le Cargo.lock, la signature aws est calculée à l'aide d'une implémentation proposée par https://github.com/psnszsn/aws-sign-v4.

Comment contribuer ?

ds_proxy est un logiciel libre sous licence AGPL.

Vous souhaitez y apporter des changements ou des améliorations ? Lisez notre guide de contribution.