Premiers pas avec Docker
La mise en place d’une passerelle de bureau à distance comme Apache Guacamole nécessite une attention particulière sur la sécurité. Ce déploiement est pensé pour un usage strictement interne. L’architecture repose sur une ségrégation des réseaux Docker pour isoler la base de données de l’application principale. Il s’agissait ici de mes premiers pas avec docker. L’objectif était de comprendre les concepts de base tout en assurant une configuration sécurisée et fonctionnelle. Le choix d’une base de données PostgreSQL a été motivé par sa robustesse et sa compatibilité avec Guacamole. L’utilisation de volumes Docker permet de persister les données et de faciliter la maintenance. La configuration du reverse proxy avec NPM assure une redirection propre et sécurisée vers l’application, tout en limitant l’exposition du service à l’extérieur du réseau local. J’aimerais tenter de nouveau l’expérience avec traefik à l’avenir, pour une oriention plus Infrastructure as Code (IaC) et une gestion plus fine des certificats SSL. Cependant, pour ce projet initial, NPM a suffi à répondre aux besoins de redirection et de sécurisation du service.
Architecture du fichier Docker Compose
Le fichier de déploiement intègre deux réseaux distincts. Un réseau interne permet la communication exclusive entre l’application, le démon guacd et la base de données PostgreSQL. Le service n’est exposé que sur le réseau local via le port 8080.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
version: '3.8'
services:
guacd:
image: guacamole/guacd:latest
container_name: guacd
restart: unless-stopped
volumes:
- /srv/docker/guacamole/drive:/drive:rw
- /srv/docker/guacamole/record:/record:rw
networks:
- backend
guacamole_db:
image: postgres:13.4
container_name: guacamole_db
restart: unless-stopped
environment:
TZ: Europe/Paris
POSTGRES_DB: guacamole_db
POSTGRES_USER: guacdb_user
POSTGRES_PASSWORD: [MOT_DE_PASSE_DB_SECURISE]
volumes:
- /srv/docker/guacamole/init:/docker-entrypoint-initdb.d:ro
- /srv/docker/guacamole/data:/var/lib/postgresql/data:rw
networks:
- backend
guacamole_app:
image: guacamole/guacamole:latest
container_name: guacamole_app
restart: unless-stopped
depends_on:
- guacd
- guacamole_db
environment:
GUACD_HOSTNAME: guacd
POSTGRESQL_HOSTNAME: guacamole_db
POSTGRESQL_DATABASE: guacamole_db
POSTGRESQL_USERNAME: guacdb_user
POSTGRESQL_PASSWORD: [MOT_DE_PASSE_DB_SECURISE]
REMOTE_IP_VALVE_ENABLED: "true"
REMOTE_IP_VALVE_INTERNAL_PROXIES: "^172\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$$"
REMOTE_IP_VALVE_REMOTE_IP_HEADER: "X-Forwarded-For"
REMOTE_IP_VALVE_PROTOCOL_HEADER: "X-Forwarded-Proto"
ports:
- "8080:8080"
networks:
- backend
- frontend
networks:
backend:
internal: true
frontend:
driver: bridge
Configuration du Reverse Proxy (NPM)
Pour rendre le service accessible proprement en interne, une redirection est nécessaire au niveau du proxy manager. Dans l’interface de gestion, la configuration avancée d’un hôte proxy doit intégrer la règle de redirection vers le répertoire de l’application.
1
2
3
4
location = / {
return 301 https://$host/guacamole/;
}
Initialisation manuelle de la base de données
Le schéma de la base de données PostgreSQL demande une intervention manuelle lors du tout premier déploiement. L’extraction du script SQL officiel et son injection sont requises pour que l’application puisse démarrer correctement.
La première étape consiste à créer l’arborescence complète sur la machine hôte.
1
2
sudo mkdir -p /srv/docker/guacamole/{init,data,drive,record}
Il faut ensuite extraire le script d’initialisation en lançant un conteneur éphémère. Le résultat est redirigé directement dans le dossier d’initialisation prévu à cet effet.
1
2
sudo sh -c 'docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --postgresql > /srv/docker/guacamole/init/initdb.sql'
Les droits d’accès au fichier fraîchement créé doivent être restreints par mesure de sécurité.
1
2
sudo chmod 644 /srv/docker/guacamole/init/initdb.sql
Le fichier SQL est ensuite copié à l’intérieur du conteneur de la base de données qui tourne en arrière-plan.
1
2
docker cp /srv/docker/guacamole/init/initdb.sql guacamole_db:/tmp/initdb.sql
L’exécution finale du script s’opère directement dans le conteneur cible à l’aide de l’utilitaire d’administration PostgreSQL.
1
2
docker exec -i guacamole_db psql -U guacdb_user -d guacamole_db -f /tmp/initdb.sql