Post

Premiers pas avec Docker

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