RDP Bastion

Le Bastion RDP Reemo est un environnement durci, exposé de manière sécurisée via une session Reemo directement dans le navigateur.

Ce guide couvre d’abord le déploiement (côté administrateur), puis l’usage au quotidien (côté utilisateur final), avec un focus particulier sur le transfert de fichiers via le lecteur \\tsclient\Reemo.

Template

Ce gabarit est importable depuis la page Images de l’interface d’administration. Reportez-vous à la section Import et export d’images pour la procédure d’importation et de mise à jour.

{
  "name": "RDP Bastion",
  "type": "ALU",
  "comments": "",
  "reference": "registry.reemo.io/reemosbrdp",
  "icon": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg width=\"800px\" height=\"800px\" viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">\n  <path style=\"fill:#888888;stroke:#222222;stroke-width:1.5\" d=\"m 30,56 0,6 c 0,0 -4,0 -5,0 -3,0 -4,4 -4,4 1,0 33,0 34,0 0,0 -1,-4 -3,-4 -2,0 -5,0 -5,0 l 0,-6\"/>\n  <path style=\"fill:#cccccc;stroke:#222222;stroke-width:3px;stroke-linecap:butt\" d=\"M 4,51 C 4,41 4,19 4,11 4,9 4,4.6 8,4.6 c 8,0 57,0 61,0 4,0 4,4.4 4,9.4 0,7 0,33 0,37 0,1 0,4 -6,4 -4,0 -55,0 -59,0 -4,0 -4,-4 -4,-4 z\"/>\n  <path style=\"fill:#1E567D;stroke:#333333\" d=\"M 8,9 69,9 69,51 8,51 z\"/>\n  <path style=\"fill:#888888;stroke:#222222;stroke-width:1.5\" d=\"m 53,88 0,6 c 0,0 -4,0 -5,0 -3,0 -4,4 -4,4 1,0 33,0 34,0 0,0 -1,-4 -3,-4 -2,0 -5,0 -5,0 l 0,-6\"/>\n  <path style=\"fill:#cccccc;stroke:#222222;stroke-width:3px;stroke-linecap:butt\" d=\"m 27,83 c 0,-10 0,-32 0,-40 0,-2 0,-6 4,-6 8,0 57,0 61,0 4,0 4,4 4,9 0,7 0,33 0,37 0,1 0,4 -6,4 -4,0 -55,0 -59,0 -4,0 -4,-4 -4,-4 z\"/>\n  <path style=\"fill:#3B739A;stroke:#444444\" d=\"m 31,41 61,0 0,42 -61,0 z\"/>\n  <circle cx=\"72\" cy=\"12\" r=\"5\" style=\"fill:#e24b4a;stroke:#791f1f;stroke-width:1\"/>\n  <path style=\"fill:none;stroke:#ffffff;stroke-width:1.5\" d=\"M 70,12 72,14 75,10\"/>\n</svg>",
  "config": [
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "desktop",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "volumeName": null,
      "volumeTarget": null,
      "volumeStorageClass": null,
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "editable": true,
      "hint": "Choose between a full desktop environment or a single isolated application",
      "name": "Session Type",
      "placeholder": null,
      "type": "SELECT",
      "uiPriority": 950,
      "value": "",
      "variable": "REEMO_SESSION_TYPE",
      "optional": false
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "volumeName": null,
      "volumeTarget": null,
      "volumeStorageClass": null,
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "editable": false,
      "hint": null,
      "name": "Desktop",
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 10,
      "value": "desktop",
      "variable": "REEMO_SESSION_TYPE",
      "optional": false
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "volumeName": null,
      "volumeTarget": null,
      "volumeStorageClass": null,
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "editable": false,
      "hint": null,
      "name": "Vault",
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 10,
      "value": "vault",
      "variable": "REEMO_AUTH_METHOD",
      "optional": false
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": "3389",
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "volumeName": null,
      "volumeTarget": null,
      "volumeStorageClass": null,
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "editable": true,
      "hint": "Target RDP service port",
      "name": "Port",
      "placeholder": null,
      "type": "STRING",
      "uiPriority": 960,
      "value": "",
      "variable": "REEMO_RDP_PORT",
      "optional": false
    },
    {
      "conditionOp": "EQUAL",
      "conditionVal": "remoteapp",
      "conditionVar": "REEMO_SESSION_TYPE",
      "defaultValue": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "volumeName": null,
      "volumeTarget": null,
      "volumeStorageClass": null,
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "editable": true,
      "hint": "Optional command-line arguments to pass to the standalone application",
      "name": "Application Arguments",
      "placeholder": null,
      "type": "STRING",
      "uiPriority": 930,
      "value": "",
      "variable": "REEMO_RDP_APPCMD",
      "optional": true
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "volumeName": null,
      "volumeTarget": null,
      "volumeStorageClass": null,
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "editable": false,
      "hint": null,
      "name": "RemoteApp",
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 5,
      "value": "remoteapp",
      "variable": "REEMO_SESSION_TYPE",
      "optional": false
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "volumeName": null,
      "volumeTarget": null,
      "volumeStorageClass": null,
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "editable": true,
      "hint": "Target server IP address or fully qualified domain name",
      "name": "IP",
      "placeholder": null,
      "type": "STRING",
      "uiPriority": 970,
      "value": "",
      "variable": "REEMO_RDP_IP",
      "optional": false
    },
    {
      "conditionOp": "EQUAL",
      "conditionVal": "remoteapp",
      "conditionVar": "REEMO_SESSION_TYPE",
      "defaultValue": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "volumeName": null,
      "volumeTarget": null,
      "volumeStorageClass": null,
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "editable": true,
      "hint": "The RemoteApp alias or system path configured on the server",
      "name": "Application Path",
      "placeholder": null,
      "type": "STRING",
      "uiPriority": 940,
      "value": "",
      "variable": "REEMO_RDP_APP",
      "optional": false
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "volumeName": null,
      "volumeTarget": null,
      "volumeStorageClass": null,
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "editable": false,
      "hint": null,
      "name": "Password",
      "placeholder": null,
      "type": "SELECT_OPTION",
      "uiPriority": 5,
      "value": "password",
      "variable": "REEMO_AUTH_METHOD",
      "optional": false
    },
    {
      "conditionOp": null,
      "conditionVal": "",
      "conditionVar": "",
      "defaultValue": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "volumeName": null,
      "volumeTarget": null,
      "volumeStorageClass": null,
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "editable": true,
      "hint": "Select the authentication method",
      "name": "Authentification",
      "placeholder": null,
      "type": "SELECT",
      "uiPriority": 1000,
      "value": "",
      "variable": "REEMO_AUTH_METHOD",
      "optional": false
    },
    {
      "conditionOp": "EQUAL",
      "conditionVal": "password",
      "conditionVar": "REEMO_AUTH_METHOD",
      "defaultValue": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "volumeName": null,
      "volumeTarget": null,
      "volumeStorageClass": null,
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "editable": true,
      "hint": "User account name",
      "name": "Username",
      "placeholder": null,
      "type": "STRING",
      "uiPriority": 990,
      "value": "",
      "variable": "REEMO_RDP_USERNAME",
      "optional": true
    },
    {
      "conditionOp": "EQUAL",
      "conditionVal": "password",
      "conditionVar": "REEMO_AUTH_METHOD",
      "defaultValue": null,
      "intMax": null,
      "intMin": null,
      "intStep": null,
      "volumeName": null,
      "volumeTarget": null,
      "volumeStorageClass": null,
      "volumeAccessMode": null,
      "volumeMode": null,
      "volumeRequestSize": null,
      "volumeRequestSizeOverhead": null,
      "editable": true,
      "hint": "User account password",
      "name": "Password",
      "placeholder": null,
      "type": "BASE64",
      "uiPriority": 980,
      "value": "",
      "variable": "REEMO_RDP_PASSWORD",
      "optional": true
    }
  ],
  "links": [],
  "usePushNotifications": false,
  "assignableToProvider": true,
  "os": null,
  "vmStartMode": null,
  "vmCreationMode": null,
  "vmCreationDate": null,
  "vmPersistentDisk": null,
  "official": false
}

Configuration et déploiement

Le bastion se déploie via un template Reemo importé dans le portail. Le formulaire généré expose les paramètres ci-dessous.

Informations de l’image

  • Image :

registry.reemo.io/reemosbrdp:latest
  • Service interne : RDP Bastion (Rust)

Définir la cible RDP

Champ

Description

Target Host IP

Adresse de la machine Windows distante (FQDN accepté). Obligatoire.

Target Port

Port RDP cible. Défaut : 3389.

Domain

Domaine NetBIOS / Active Directory. Optionnel.

Session Type

desktop (défaut) ou remoteapp. En mode remoteapp, la session bascule en kiosque : un seul programme s’affiche, sans bureau Windows.

Kiosk Program

Chemin Windows absolu du programme à lancer en mode kiosque (ex. C:\Windows\System32\notepad.exe). Obligatoire en mode remoteapp.

Kiosk Args

Arguments de ligne de commande transmis au programme kiosque. Optionnel.

Mode RemoteApp (Kiosk Mode) — prérequis côté cible

Le mode kiosque demande au serveur Windows d’exécuter un programme spécifique à la place du bureau standard. Ce mécanisme est réservé à Windows Server avec le rôle RDS Session Host installé.

  1. Windows Server (2016, 2019, 2022, 2025) — pas Workstation (voir limitation ci-dessous).

  2. Rôle RDS Session Host installé, via une commande PowerShell admin :

    Install-WindowsFeature -Name RDS-RD-Server -IncludeManagementTools -Restart
    

    Un redémarrage est inclus (~3 min). Vérification post-reboot :

    Get-WindowsFeature -Name RDS-RD-Server | Select Name, InstallState
    # attendu : InstallState = Installed
    
  3. L’utilisateur cible présent dans le groupe Remote Desktop Users ou Administrators.

  4. Aucune GPO « Start a program on connection » active (Computer Configuration > Administrative Templates > Windows Components > Remote Desktop Services > Remote Desktop Session Host > Remote Session Environment) — une telle GPO prend la priorité sur le programme demandé.

  5. Aucune session existante pour l’utilisateur cible au moment de la connexion : RDP réutilise la session ouverte, et le programme kiosque n’est consulté qu’à l’ouverture d’une nouvelle session. Si le compte est auto-logué, utilisez query session puis logoff <id> pour le déconnecter d’abord, ou utilisez un compte dédié non auto-logué.

Warning

Limitation Windows Workstation : sur Windows 10/11, le comportement est variable et non garanti — selon l’image, les GPO actives et l’état du registre, Windows peut ignorer le programme demandé et démarrer l’Explorateur à la place. Pour une session kiosque en production, utilisez Windows Server avec RDS.

Choisir la méthode d’authentification

Le sélecteur Auth Method pilote le mécanisme utilisé par le bastion pour s’authentifier sur la cible RDP.

Option

Comportement

Vault (défaut recommandé)

Le bastion résout les credentials au démarrage via une connexion sécurisée au portail Reemo. Rien n’est stocké sur disque.

Password

Authentification par nom d’utilisateur et mot de passe statiques, saisis dans le formulaire.

Interactive (JIT)

Aucun secret dans le formulaire. Au lancement, le bastion affiche un formulaire de saisie à l’écran ; l’utilisateur entre ses identifiants depuis le navigateur.

Note

Mode interactif — détails :

  • Tab bascule entre les champs Username et Password, Backspace efface, Entrée valide (les deux champs doivent être remplis), Échap annule.

  • Pour un compte de domaine Active Directory, saisir DOMAINE\utilisateur dans le champ Username.

  • En cas d’échec de connexion (mauvais identifiants), le formulaire réapparaît automatiquement après environ 1 seconde.

  • Les frappes saisies dans ce formulaire ne sont pas journalisées (confidentialité des identifiants).

  • Le mode interactif conserve l’authentification NLA/CredSSP — compatible avec les cibles « Require NLA ».

Guide d’utilisation

Vous êtes dans une session Reemo, face à un bureau Windows. Vous le pilotez à la souris et au clavier comme un poste local : les événements partent du navigateur vers le bastion, sont rejoués sur la cible Windows, et le rendu vous revient en streaming.

Se connecter

Quand votre session s’ouvre, le bastion établit automatiquement la connexion vers la cible Windows.

Mode interactif : si votre administrateur a configuré la méthode interactive, un formulaire de saisie apparaît à l’écran avant la connexion. Entrez votre nom d’utilisateur et votre mot de passe, puis appuyez sur Entrée.

Si la connexion échoue (mauvais identifiants, cible injoignable), fermez l’onglet et corrigez la configuration côté portail Reemo.

Résolution et redimensionnement

L’image affichée dans le navigateur est rendue à la résolution initiale définie par l’administrateur (par défaut 1920×1080). Quand vous redimensionnez l’onglet, le bureau Windows est automatiquement redimensionné pour correspondre — si le canal Allow display resize est activé. Sinon, l’image est étirée côté navigateur.

Clavier et souris

  • Clavier : layout configurable dans le formulaire (défaut : fr). Toutes les touches sont transmises fidèlement à la cible Windows, y compris les touches étendues (PrintScreen, Pause, etc.).

  • Souris : boutons gauche, droit, molette verticale et boutons latéraux supportés.

  • Journalisation : si la journalisation des frappes est activée par l’administrateur, chaque caractère tapé est enregistré côté bastion.

Transférer des fichiers

Le drive \\tsclient\Reemo est le pivot du transfert de fichiers entre votre poste local et la session Windows distante. Cette section détaille la configuration côté administrateur, puis l’usage complet côté utilisateur final.

Activer le transfert (administrateur)

Dans le formulaire Reemo, cochez Allow file transfer et redémarrez le conteneur. Au démarrage suivant :

  • Le drive \\tsclient\Reemo est automatiquement exposé dans la session Windows.

  • Le bouton Transfer devient disponible dans la barre de contrôle du navigateur Reemo.

  • Le bouton Transfer du navigateur et le drive Windows partagent le même dossier — ils sont toujours synchronisés.

Utiliser le transfert depuis le navigateur Reemo

Le navigateur Reemo expose un bouton *Transfer* dans la barre de contrôle de la session.

Déposer un fichier vers Windows

  1. Cliquez sur Transfer dans la barre Reemo.

  2. Glissez-déposez un fichier de votre poste local vers le panneau, ou utilisez le bouton Upload pour le sélectionner.

  3. Le fichier apparaît dans le panneau.

Il est immédiatement disponible côté Windows sous \\tsclient\Reemo.

Récupérer un fichier depuis Windows

  1. Depuis la session Windows, déposez un fichier dans \\tsclient\Reemo (voir section suivante).

  2. Le fichier apparaît instantanément dans le panneau Transfer du navigateur.

  3. Cliquez sur le fichier pour le télécharger sur votre poste local.

Utiliser le transfert depuis Windows (session RDP)

Dès l’ouverture de la session, l’Explorateur Windows monte automatiquement un lecteur réseau baptisé Reemo, accessible via \\tsclient\Reemo. Vous le retrouvez à plusieurs endroits :

  • Dans l’arborescence « Ce PC », sous Périphériques et lecteurs réseau (une lettre de lecteur libre est attribuée automatiquement, généralement Z:).

  • Dans la barre d’adresse de l’Explorateur ou dans Exécuter… (Win+R).

  • Dans les boîtes de dialogue Ouvrir… / Enregistrer sous… de toutes les applications Windows.

Déposer un fichier vers le navigateur

Trois méthodes équivalentes :

  1. Glisser-déposer vers \\tsclient\Reemo.

  2. Copier-coller : Ctrl+C sur la source, Ctrl+V dans \\tsclient\Reemo.

  3. Enregistrer sous… en sélectionnant Reemo (\\tsclient) comme destination.

Le fichier apparaît en temps réel dans le panneau Transfer du navigateur.

Récupérer un fichier depuis le navigateur

  1. Ouvrez \\tsclient\Reemo dans l’Explorateur Windows.

  2. Le fichier déposé via le panneau Transfer est immédiatement disponible.

  3. Double-cliquez pour l’ouvrir, ou copiez-le vers un emplacement Windows (C:\Users\<vous>\Documents\…) pour le conserver après la session.

Warning

\\tsclient\Reemo est éphémère. Le drive est attaché à la session RDP courante. À sa fermeture, le drive disparaît côté Windows. Pour conserver un fichier, copiez-le vers le disque local Windows (C:\…) ou téléchargez-le via le navigateur Reemo avant de fermer.

Résumé — qui voit quoi ?

Action

Dépose côté

Apparaît côté

Persiste après la session ?

Upload dans le panneau Reemo (navigateur)

Navigateur opérateur

\\tsclient\Reemo (Windows)

Non

Glisser-déposer dans \\tsclient\Reemo (Windows)

Session RDP Windows

Panneau Transfer (navigateur)

Non

Copie vers C:\Users\...\Documents (Windows)

Disque dur Windows distant

Oui (persisté côté Windows)

Téléchargement depuis le panneau Reemo

Poste local opérateur

Oui (persisté côté poste local)

Le dossier de transfert côté bastion n’est qu’un pivot : il n’a pas vocation à conserver des fichiers entre sessions. À la fin de la session, copiez ce qui doit être conservé vers Windows (C:\…) ou téléchargez-le via le navigateur.

Sécurité du transfert

  • Périmètre minimal : seul le dossier de transfert est exposé. Le reste du système de fichiers du conteneur reste inaccessible depuis Windows.

  • Protection path-traversal : toute tentative d’accès en dehors du dossier de transfert est bloquée avec un refus d’accès.

  • Audit complet : chaque opération de fichier (création, lecture, écriture, suppression) est journalisée avec la direction, le chemin et la taille en octets.

Changelog - RDP Bastion Image

v1.0.0 (2026-07-08)

First public release of the RDP Bastion Reemo image: a hardened Remote Desktop gateway that opens an RDP session to a target Windows machine on the user’s behalf and delivers it through a Reemo browser session.

Added

  • Remote Desktop in the browser. Reach a Windows server, workstation or published application through a Reemo browser session. The bastion opens the RDP connection on the user’s behalf — nothing to install, no credentials handed to the user, and no RDP port exposed to the network.

  • Published application or full desktop. A session can launch a single published Windows application (RemoteApp) instead of the entire desktop, for tightly scoped access to just the tool an operator needs.

  • Secure file transfer. When enabled, a network drive named Reemo appears automatically in Windows Explorer. Files dropped into it — or into the browser’s transfer panel — move between the remote desktop and the browser in real time, with no client, no SCP and no manual mount. Only a single dedicated folder is exposed.

  • Bidirectional text clipboard. Optional copy and paste between the local device and the remote desktop, disabled by default and enabled per deployment.

  • Dynamic resolution. The remote desktop resizes to match the browser window as it changes, so the Windows session always fills the available space.

  • Centralized credential management. Optional integration with the Reemo credential portal: target credentials are resolved at session start over a mutually authenticated channel and kept in memory only — never written to disk. A direct password mode is also available.

  • Network Level Authentication. Connections use NLA (CredSSP) by default, matching the security posture expected by modern Windows servers.

  • Unified audit logging across all subsystems, with per-line Reemo user attribution. Connections, disconnections, keystrokes, clipboard activity, file transfers and denied access are all recorded, making it straightforward to correlate events with a specific session.

Versions - RDP Bastion Image

Images published on registry.reemo.io/reemosbrdp. Each build exposes these pullable tags:

  • Latest (:latest) – the latest published release

  • Release (:vX.Y.Z) – always tracks the latest build of this version

  • Build (:vX.Y.Z-N) – a specific, frozen weekly build

  • Image (:<id>) – immutable reference to this exact build

Example: docker pull registry.reemo.io/reemosbrdp:vX.Y.Z-N

v1.0.0-2 (2026-07-08)

Release

v1.0.0

Build

v1.0.0-2

Image

6ba09deba770

Digest

sha256:6ba09deba770e9959512503833be35f646a0ccbe08524ab34a7122ef1e6fb279

Applications

reemo-rdp/v1.0.0

Reemo Agent

2.5.10

OS

Debian GNU/Linux 13 (trixie)

Size

208.28 MB

Patched CVEs

none

v1.0.0-1 (2026-07-08)

Release

v1.0.0

Build

v1.0.0-1

Image

8abec5eaa3d4

Digest

sha256:8abec5eaa3d47a0b03e9a170c95d4b481adbc0634236419ad57da7cb6b40276f

Applications

reemo-rdp/v1.0.0

Reemo Agent

2.5.10

OS

Debian GNU/Linux 13 (trixie)

Size

208.28 MB

Patched CVEs

CVE-2025-22921, CVE-2025-70103, CVE-2026-30997, CVE-2026-44235, CVE-2026-44236, CVE-2026-50256, CVE-2026-50257, CVE-2026-50258 (+7)