Transférer des fichiers de manière sécurisée n’est pas forcément facile si l’on souhaite rester complètement maître des ses données. Une solution ? Se tourner – encore – vers l’open source. Voici le projet « Lufi »[0] qui propose un outil tout en un pour des transferts sécurisés, chiffrés de bout en bout, ou « E2E encrypted ».
Plateforme
C’est via Docker que son instanciation est proposée, et que je décris ici.
Build de l’image
Le build reste assez manuel : on va compiler à partir des sources les logiciels à embarquer dans une image docker Debian. Voici le docker-compose.yml
. On n’oubliera pas le HEALTHCHECK
.
FROM debian:11
RUN apt update \
&& apt install -y \
curl \
libmojo-sqlite-perl \
libmojo-pg-perl \
libpq-dev \
git \
build-essential \
libssl-dev \
libio-socket-ssl-perl \
liblwp-protocol-https-perl \
&& apt-get clean -y \
&& rm -rf /var/lib/{apt,dpkg,cache,log,tmp}/*
RUN cpan Carton
RUN git clone https://framagit.org/fiat-tux/hat-softwares/lufi.git /usr/lufi
WORKDIR /usr/lufi
RUN carton install --deployment --without=test --without=mysql --without=sqlite
VOLUME /usr/lufi/data /usr/lufi/files
HEALTHCHECK CMD curl --fail http://localhost:8081/ || exit 1
CMD ["carton", "exec", "hypnotoad", "-f", "/usr/lufi/script/lufi"]
Instanciation du container
Configuration
Son instanciation est tributaire de fichiers de configuration de la base de données – le backend, du front-end. Ces deux fichiers seront montés de manière persistante. ⚠️ Pour un régime de production, préférer une configuration stateless, et embarquer les fichiers de configuration directement dans le Dockerfile
.
Concernant la gestion de compte, on peut se connecter à un LDAP en coulisse, très pratique pour intégrer ce service dans un écosystème déjà mis en place.
- Le fichier de configuration du backend n’est qu’un simple descripteur de variables d’environnement pour la base de données.
POSTGRES_USER=lufi
POSTGRES_PASSWORD=password
POSTGRES_DB=defaultdb
Le fichier de configuration du service front-end quant à lui est un peu plus fourni. En voici un extrait avec les parties intéressantes, notamment de gestion de comptes. Une attention particulière sera portée au paramètre proxy
, si ce service se trouve derrière un reverse proxy. Un exemple de ce fichier de configuration se trouve ici.
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
{
hypnotoad => {
# array of IP addresses and ports you want to listen to
# you can specify a unix socket too, like 'http+unix://%2Ftmp%2Flufi.sock'
listen => ['http://0.0.0.0:8081'],
# if you use Lufi behind a reverse proxy like Nginx, you want to set proxy to 1
# if you use Lufi directly, let it commented
proxy => 1,
},
[...]
#############
# DB settings
#############
# Choose what database you want to use
# Valid choices are sqlite, postgresql and mysql (all lowercase)
# optional, default is sqlite
dbtype => 'postgresql',
# SQLite ONLY - only used if dbtype is set to sqlite
# Define a path to the SQLite database
# You can define it relative to lufi directory or set an absolute path
# Remember that it has to be in a directory writable by Lufi user
# optional, default is lufi.db
#db_path => 'data/lufi.db',
# PostgreSQL ONLY - only used if dbtype is set to postgresql
# These are the credentials to access the PostgreSQL database
# mandatory if you choosed postgresql as dbtype
pgdb => {
database => 'defaultdb',
host => 'files_transferer_database',
# optional, default is 5432
#port => 5432,
user => 'lufi',
pwd => 'password',
# https://mojolicious.org/perldoc/Mojo/Pg#max_connections
# optional, default is 1
#max_connections => 1,
#############################################
# LDAP settings (authentication and features)
#############################################
# Set `ldap` if you want that only authenticated users can upload files
# Please note that everybody can still download files
# optional, no default
ldap => {
uri => 'ldap://ldap_hostname', # server URI
user_tree => 'dc=example,dc=com', # search base DN
bind_dn => 'cn=readonly,dc=example,dc=com', # search bind DN
bind_pwd => 'readonly', # search bind password
user_attr => 'uid', # user attribute (uid, mail, sAMAccountName, etc.)
# user_filter => '(!(uid=ldap_user))', # user filter (to exclude some users, etc.)
# # optional start_tls configuration. See https://metacpan.org/pod/distribution/perl-ldap/lib/Net/LDAP.pod#start_tls
# # don't set or uncomment if you don't want to configure it
# start_tls => {
# verify => 'optional',
# clientcert => '/etc/ssl/certs/ca-bundle.pem'
# }
},
[...]
};
Lancement
Et voici le docker-compose.yml
final permettant de lancer les deux containers : la base de données et le front-end.
version: '2.4'
services:
files_transferer:
build: build
container_name: files_transferer
restart: always
mem_limit: 16gb
memswap_limit: 16gb
volumes:
- ./conf/lufi.conf:/usr/lufi/lufi.conf:ro
files_transferer_database:
container_name: files_transferer_database
image: postgres:14
restart: always
mem_limit: 16gb
memswap_limit: 16gb
env_file: ./conf/postgres.env
volumes:
- ./dbdata:/var/lib/postgresql/data
Conclusion
Très pratique et implémentant les fonctionnalités classiques de transfert de fichiers (protection par mot de passe, stockage de la liste de fichiers téléchargés, date d’expiration,…) ce service semble répondre aux besoins de maîtrise de ses propres informations. Pour en savoir plus, c’est sur le wiki [1].
Ressources :
[0] https://framagit.org/fiat-tux/hat-softwares/lufi.git
[1] https://framagit.org/fiat-tux/hat-softwares/lufi/-/wikis/home