23/04/2025

Cybersécurité

PrivateBin : comment déployer votre propre PasteBin sur un serveur ?

I. Présentation

PrivateBin est une alternative open source à PasteBin, que vous pouvez héberger sur votre propre machine, que ce soit un serveur ou un NAS. Pour rappel, PasteBien est un service en ligne très populaire qui permet de coller du texte ou du code, puis de partager un lien pour y accéder facilement.

PrivateBin est une application web libre et open source qui vous permet d’héberger votre propre instance de PasteBin, avec un chiffrement côté client (via AES 256 bits). Cela signifie que le serveur ne voit jamais le contenu, car il est chiffré directement dans le navigateur de l'utilisateur.

L'idée est simple : vous copiez-collez le texte à partager et vous obtenez un lien de partage unique (et temporaire). Ce lien peut être valide pendant une durée limitée et éventuellement protégé par un mot de passe.

Voici quelques d'usages intéressants de PrivateBin :

  • Partage sécurisé d'un mot de passe, d'une clé de licence ou toute autre information sensible : une alternative à l'e-mail.
  • Partage d'informations réseau, comme des adresses IP.
  • Partage d'une configuration.
  • Partage d'un fichier ou de n'importe quel document.
  • Mise à disposition d'un extrait de code, pour le partager simplement.

Cette alternative à PasteBin est idéale pour les entreprises ou ceux qui veulent garder un contrôle total sur leurs données.

II. Installation de PrivateBin avec Docker

Dans ce tutoriel, nous verrons comment installer une instance de PrivateBin à l'aide de Docker, en nous appuyant également sur le reverse proxy Nginx, lui aussi installé via Docker. En effet, l'application PrivateBin ne peut pas fonctionner sur une connexion HTTP, il convient donc d'utiliser une connexion HTTPS. Dans ce cas, ce qui me semble le plus judicieux, c'est d'utiliser un reverse proxy pour publier l'application.

Une machine sous Linux sera utilisée et elle est déjà équipée de Docker. Nous allons déployer 2 conteneurs Docker :

  • 1 conteneur Docker avec PrivateBin, basé sur PHP-FPM et un serveur Web Nginx
  • 1 conteneur Docker avec Nginx en tant que reverse proxy

L'objectif sera de pouvoir accéder à l'application via l'adresse suivante : https://privatebin.it-connect.local. Ici, j'utilise volontairement un nom de domaine local pour utiliser un certificat auto-signé. Pour passer une instance en production, il est fortement recommandé d'utiliser un certificat émit par une autorité de certification publique (Let's Encrypt peut suffire).

Avant de commencer, veillez à effectuer la configuration DNS. En ce qui me concerne, un enregistrement DNS a été créé dans la zone it-connect.local pour associer le nom privatebin à l'adresse IP 192.168.10.200.

A. Créer le conteneur Docker pour PrivateBin

Nous allons commencer par traiter le cas du conteneur PrivateBin, en utilisant l'image officielle privatebin/nginx-fpm-alpine. Il y a plusieurs images, car PrivateBin peut s'appuyer sur une base de données MySQL / PostgreSQL, un stockage S3 ou un environnement Google Cloud Storage. Ici, nous utiliserons le système de fichiers.

Créez les répertoires dans lesquels seront stockées les données du conteneur (/opt/docker-compose/ existe déjà) :

mkdir /opt/docker-compose/privatebin
mkdir /opt/docker-compose/privatebin/data

Puis, créez le fichier docker-compose.yml avec le code suivant :

cd /opt/docker-compose/privatebin
nano docker-compose.yml

L'application sera accessible sur le port 8080, même si cela n'a que peu d'importance puisque nous allons configurer un reverse proxy. Un réseau commun nommé nginx-net sera utilisé par les 2 conteneurs.

services:
  privatebin:
    image: privatebin/nginx-fpm-alpine
    restart: always
    read_only: true
    ports:
      - "8080:8080"
    volumes:
      - ./data:/srv/data
      - ./conf.php:/srv/cfg/conf.php:ro

networks:
  nginx-net:
    external: true
    name: nginx-net

Quand c'est fait, toujours dans le même répertoire, créez le fichier conf.php qui correspond à la configuration de l'application PrivateBin en elle-même. Pour affiner votre configuration, vous pouvez consulter la documentation officielle. Celle proposée ci-dessous est commentée pour faciliter votre compréhension.

[main]
; Nom affiché dans l'interface web
name = "PrivateBin - IT-Connect"

; Permet aux utilisateurs de protéger un paste avec un mot de passe
password = true

; Active la fonctionnalité de transfert de fichiers (upload) en plus du texte
fileupload = true

; Taille maximale autorisée pour un paste (texte + fichier), ici 10 Mo (10 * 1024 * 1024)
sizelimit = 10485760

; Thème visuel utilisé pour l'interface, ici "bootstrap-dark" pour un thème sombre
template = "bootstrap-dark"

; Message d'information affiché aux utilisateurs, utile pour les avertir sur les conditions d'utilisation
notice = "Note : les données de ce service peuvent être supprimées à tout moment."

; Langue par défaut de l'interface (ici le français)
languagedefault = "fr"

[model]
; Méthode de stockage utilisée pour enregistrer les pastes.
; Ici, on utilise le système de fichiers local
class = Filesystem

[model_options]
; Répertoire où sont enregistrés les pastes chiffrés. 
; Le mot-clé PATH signifie que le chemin est relatif à la racine de l'installation.
; Ici, nous utilisons le répertoire data créé précédemment.
dir = PATH "data"

Enfin, dernière étape : la gestion des droits sur le dossier data puisqu'il doit être accessible à l'application.

En principe, l'application va écrire dans ce répertoire avec l'utilisateur nobody. Si vous avez un doute ou un problème, mettez les droits en 777, puis créez un paste (quand le déploiement sera terminé) pour regarder les permissions et les adapter en conséquence.

sudo chown -R nobody:82 /opt/docker-compose/privatebin/data/
sudo chmod 700 /opt/docker-compose/privatebin/data/

Vous êtes prêt à passer à la suite : la création du conteneur Nginx.

B. Créer le conteneur Docker pour Nginx

Désormais, nous allons attaquer la configuration du reverse proxy Nginx pour publier notre application en HTTPS. Au-delà de configurer le conteneur Docker, nous allons devoir configurer Nginx et aussi créer un certificat auto-signé (à des fins de tests).

Commençons par créer les répertoires :

mkdir /opt/docker-compose/nginx /opt/docker-compose/nginx/certs

Puis, créez le fichier docker-compose.yml pour déclarer le conteneur. On aurait pu créer un seul fichier Docker Compose avec la déclaration des deux conteneurs pour créer un projet global.

Ici, nous mettons le conteneur en écoute sur le port 443. Le fichier privatebin.conf sera monté dans la configuration de Nginx et le dossier certs sera utilisé pour stocker les fichiers du certificat.

services:
  nginx:
    image: nginx:latest
    container_name: nginx-proxy
    ports:
      - "443:443"
    volumes:
      - ./privatebin.conf:/etc/nginx/conf.d/privatebin.conf:ro
      - ./certs:/etc/nginx/certs

networks:
  nginx-net:
    external: true
    name: nginx-net

Désormais, créez le fichier privatebin.conf pour configurer le serveur Nginx en tant que reverse proxy. La configuration ci-dessous part du principe que le reverse proxy dispose d'un frontend pour l'adresse privatebin.it-connect.local. Dans ce cas, le flux sera redirigé vers le conteneur PrivateBin accessible sur l'adresse IP du serveur, sur le port 8080, soit http://192.168.10.200:8080.

# privatebin.it-connect.local
server {
     listen 443 ssl;
     server_name privatebin.it-connect.local;
     ssl_certificate /etc/nginx/certs/privatebin.it-connect.local.crt;
     ssl_certificate_key /etc/nginx/certs/private.key;
     location / {
         proxy_pass http://192.168.10.200:8080;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
     }
}

Autre point important à bien comprendre :

  • /etc/nginx/certs/privatebin.it-connect.local.crt : chemin et nom attendu pour le certificat TLS
  • /etc/nginx/certs/private.key : chemin et nom attendu pour la clé privée associée au certificat TLS

Nous devons maintenant créer le certificat TLS auto-signé. Vous avez besoin du paquet openssl pour accomplir cette tâche. Il y a de fortes chances pour qu'il soit déjà présent sur votre machine. Commencez par accéder au répertoire adéquat :

cd /opt/docker-compose/nginx/certs

Créez une clé privée nommée private.key à l'aide l'algorithme RSA. Ici, nous ne demandons pas de passphrase pour permettre la lecture directe par Nginx.

openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048

Puis, vous devez créer une demande de signature de certificat (CSR) :

openssl req -new -key private.key -out cert.csr

Vous serez alors invité à renseigner différentes informations : pays, organisation, etc... Ainsi que le Common Name, où vous devez indiquer le nom de domaine de votre application.

Enfin, pour finir, générez le certificat auto-signé à partir des deux fichiers créé précédemment. Ce certificat sera valide 365 jours.

openssl x509 -req -days 365 -in cert.csr -signkey private.key -out privatebin.it-connect.local.crt

En sortie, vous devez obtenir le certificat sous le nom privatebin.it-connect.local.crt.

La configuration du reverse proxy Nginx est prête.

C. Créer le réseau Docker

Nos deux conteneurs vont chercher à utiliser le réseau Docker nommé nginx-net, sauf que celui-ci n'existe pas. Exécutez cette commande :

sudo docker network create nginx-net

Listez les réseaux Docker, celui que vous venez de créer devrait apparaître.

sudo docker network ls

D. Lancer les conteneurs Docker pour PrivateBin

Pour finir, nous allons lancer les deux conteneurs Docker puisque la configuration est terminée.

Exécutez ces commandes :

# Conteneur PrivateBin
cd /opt/docker-compose/privatebin
sudo docker compose -p privatebin up -d

# Conteneur Nginx
cd /opt/docker-compose/nginx
sudo docker compose -p nginx up -d

Les deux conteneurs seront exécutés en arrière-plan. Vous pouvez lister les conteneurs en cours d'exécution via cette commande :

sudo docker ps

CONTAINER ID   IMAGE                         COMMAND                  CREATED       STATUS    
4d8238b5815f   nginx:latest                  "/docker-entrypoint.…"   3 hours ago   Up 3 hours
6bd8f00849c8   privatebin/nginx-fpm-alpine   "/etc/init.d/rc.local"   4 hours ago   Up 3 hours

Il ne reste plus qu'à tester...

E. Utilisation de PrivateBin

Ouvrez un navigateur et accédez à l'adresse https://privatebin.it-connect.local (adaptez, bien entendu). Si votre reverse proxy est opérationnel, vous devriez arriver sur l'interface de PrivateBin. Si vous utilisez un certificat auto-signé, vous devez au préalable ignorer l'avertissement de sécurité.

Vous n'avez plus qu'à créer votre premier paste. Vous pouvez choisir une date d'expiration (5 minutes, 1 heure, 1 semaine, etc.), un mot de passe, et même l'effacer automatiquement après la lecture. La zone de saisie vous permet de saisir votre texte. Quand vous cliquez sur le bouton "Créer" vous valider le paste.

Vous obtenez alors un message de validation accompagné par un lien. Vous n'avez plus qu'à transférer ce lien au destinataire pour qu'il récupère l'information du paste. Pratique, n'est-ce pas ?

Vous avez aussi la possibilité de choisir un autre format, comme du code source ou Markdown, à la place du texte brut.

III. Conclusion

PrivateBin est une application simple et efficace qui répond à un besoin bien précis : le partage d'informations de façon sécurisée avec un système de lien temporaire et le chiffrement des données. C'est avec ce type d'outils que l'on peut éviter de retrouver des mots de passe ou autre information sensibles dans des e-mails, des conversations sur Teams ou sur d'autres plateformes.

Qu'en pensez-vous ?

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.