PrivateBin : comment déployer votre propre PasteBin sur un serveur ?
Sommaire
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 ?