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