Escritorio Remoto XRDP en Linux

XRDP permite conectarse a servidores Linux usando el protocolo RDP (Remote Desktop Protocol) estándar de Windows, lo que significa que puedes acceder al escritorio gráfico de Linux directamente desde el cliente RDP nativo de Windows sin instalar software adicional en el cliente. Es la solución más práctica para administradores que necesitan acceso gráfico a servidores Linux desde máquinas Windows. Esta guía cubre la instalación de XRDP con XFCE en Ubuntu/Debian y CentOS/Rocky, incluyendo hardening de seguridad.

Requisitos Previos

  • Servidor Linux con acceso a Internet (Ubuntu 22.04/Debian 12 o CentOS 9/Rocky 9)
  • Mínimo 2 GB de RAM (4 GB recomendado para experiencia fluida)
  • Al menos 10 GB de espacio en disco
  • Puerto 3389 disponible (puede cambiarse para mayor seguridad)
  • Cliente RDP: Conexión a Escritorio Remoto en Windows, Remmina en Linux, Microsoft Remote Desktop en macOS

Instalación del Entorno de Escritorio

XRDP necesita un entorno de escritorio instalado para mostrar la sesión gráfica. XFCE es la opción más ligera:

# Ubuntu 22.04 / Debian 12 - Instalar XFCE (ligero y compatible con XRDP)
apt-get update
apt-get install -y xfce4 xfce4-goodies xorgxrdp dbus-x11

# Alternativamente, instalar GNOME (más pesado pero más completo)
# apt-get install -y ubuntu-desktop gnome-shell

# CentOS 9 / Rocky Linux 9 - Instalar XFCE
dnf groupinstall -y "Xfce"
dnf install -y xrdp xorgxrdp

# Verificar que el servidor X puede iniciarse
# (en un servidor sin pantalla, usar Xvfb o virtual display)

Instalación de XRDP

# Ubuntu/Debian
apt-get install -y xrdp

# CentOS/Rocky Linux
dnf install -y epel-release
dnf install -y xrdp

# Añadir el usuario xrdp al grupo ssl-cert para acceso a certificados TLS
adduser xrdp ssl-cert  # Ubuntu/Debian
usermod -aG ssl-cert xrdp  # Alternativa

# Habilitar e iniciar XRDP
systemctl enable --now xrdp
systemctl enable --now xrdp-sesman

# Verificar el estado
systemctl status xrdp
systemctl status xrdp-sesman

# Verificar que el puerto 3389 está escuchando
ss -tlnp | grep 3389

Configuración de XRDP

Configura XRDP para usar XFCE como entorno de escritorio:

# Crear el archivo .xsession en el directorio home de cada usuario
# (esto indica qué entorno de escritorio lanzar al conectar)
cat > /etc/skel/.xsession << 'EOF'
#!/bin/bash
# Iniciar XFCE como sesión de escritorio para XRDP
export XDG_CURRENT_DESKTOP=XFCE
exec startxfce4
EOF
chmod +x /etc/skel/.xsession

# Para el usuario actual y usuarios existentes
cp /etc/skel/.xsession ~/.xsession
chmod +x ~/.xsession

# Para usuarios específicos
for USER_HOME in /home/*/; do
    USER=$(basename "$USER_HOME")
    cat > "$USER_HOME/.xsession" << 'EOF'
#!/bin/bash
export XDG_CURRENT_DESKTOP=XFCE
exec startxfce4
EOF
    chmod +x "$USER_HOME/.xsession"
    chown "$USER:$USER" "$USER_HOME/.xsession"
done

Configuración principal de XRDP en /etc/xrdp/xrdp.ini:

# Hacer copia de seguridad de la configuración original
cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.original

# Configuración de producción de XRDP
cat > /etc/xrdp/xrdp.ini << 'EOF'
[globals]
; Puerto de escucha (cambiar a un puerto no estándar mejora la seguridad)
port=3389

; Protocolo de seguridad: tls, rdp, negotiate
security_layer=tls

; Certificado TLS para el servidor
certificate=/etc/xrdp/cert.pem
key_file=/etc/xrdp/key.pem

; Nivel de cifrado: low(1), medium(2), high(3)
crypt_level=high

; Número máximo de conexiones simultáneas
max_bpp=32
xserverbpp=24

; Configuración de la pantalla
bitmap_compression=true
use_compression=yes

; IP de escucha (0.0.0.0 para todas las interfaces)
address=0.0.0.0

; Habilitar logging
log_level=INFO
log_file=/var/log/xrdp.log
syslog_level=WARNING

; Configuración de sesión
autorun=
tcp_send_buffer_bytes=32768
tcp_recv_buffer_bytes=32768

[Xorg]
; Configuración del servidor X para sesiones de escritorio
name=Xorg
lib=libxup.so
username=ask
password=ask
ip=127.0.0.1
port=-1
code=20
EOF

# Generar certificado TLS auto-firmado para XRDP
openssl req -x509 -newkey rsa:4096 -keyout /etc/xrdp/key.pem \
  -out /etc/xrdp/cert.pem -days 3650 -nodes \
  -subj "/CN=$(hostname)" \
  -addext "subjectAltName=DNS:$(hostname),IP:$(hostname -I | awk '{print $1}')"

chown xrdp:xrdp /etc/xrdp/key.pem /etc/xrdp/cert.pem
chmod 640 /etc/xrdp/key.pem

systemctl restart xrdp

Gestión de Sesiones

XRDP crea una nueva sesión X por cada conexión RDP. Para retomar una sesión existente, usa la opción "reconnect to existing session":

# Ver las sesiones activas de XRDP
ss -tnp | grep xrdp
ls /tmp/.xrdp/

# Configurar el script de sesión para gestionar sesiones activas
# En /etc/xrdp/sesman.ini, configurar la política de reconexión
grep -A5 "\[Sessions\]" /etc/xrdp/sesman.ini

# Matar una sesión específica
# Listar procesos de sesión
ps aux | grep Xorg

# Configurar límite de tiempo de sesión inactiva
cat >> /etc/xrdp/sesman.ini << 'EOF'

[Security]
AllowRootLogin=false
MaxLoginRetry=3
TerminalServerUsers=tsusers  # Solo usuarios de este grupo pueden conectar
EOF

# Crear el grupo de usuarios de acceso remoto
groupadd tsusers
# Añadir usuarios al grupo
usermod -aG tsusers nombre_usuario

Redirección de Audio

# Instalar el módulo de audio para XRDP
apt-get install -y xrdp-pulseaudio-installer  # Ubuntu
pulseaudio-module-xrdp                         # Nombre alternativo del paquete

# CentOS/Rocky
dnf install -y xrdp-sesman

# Compilar e instalar el módulo de audio si no está disponible como paquete
apt-get install -y git make gcc libpulse-dev

git clone https://github.com/neutrinolabs/pulseaudio-module-xrdp.git /tmp/pa-xrdp
cd /tmp/pa-xrdp
./bootstrap && ./configure PULSE_DIR=/usr/src/pulseaudio-$(pulseaudio --version | awk '{print $2}')
make && make install

# Verificar que el módulo se instaló
ls /usr/lib/pulse-*/modules/ | grep xrdp

Hardening de Seguridad

# 1. Cambiar el puerto por defecto (reduce el escaneo automatizado)
sed -i 's/^port=3389/port=33890/' /etc/xrdp/xrdp.ini

# 2. Permitir solo usuarios específicos en el firewall
# Ubuntu (UFW)
ufw allow from 10.0.0.0/8 to any port 33890 proto tcp
ufw deny 33890/tcp  # Denegar desde cualquier otra IP

# CentOS/Rocky (firewalld)
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port protocol="tcp" port="33890" accept' --permanent
firewall-cmd --reload

# 3. Deshabilitar el login de root
sed -i 's/AllowRootLogin=true/AllowRootLogin=false/' /etc/xrdp/sesman.ini

# 4. Limitar el número de intentos de login (fail2ban para XRDP)
apt-get install -y fail2ban

cat > /etc/fail2ban/jail.d/xrdp.conf << 'EOF'
[xrdp]
enabled  = true
port     = 33890
filter   = xrdp
logpath  = /var/log/xrdp-sesman.log
maxretry = 3
bantime  = 3600
findtime = 600
EOF

cat > /etc/fail2ban/filter.d/xrdp.conf << 'EOF'
[Definition]
failregex = sesman_auth_user: user <\S+> login failed
ignoreregex =
EOF

systemctl enable --now fail2ban
fail2ban-client status xrdp

# 5. Usar VPN o SSH tunnel en lugar de exponer XRDP directamente
# Configurar túnel SSH para XRDP (sin exponer el puerto 3389/TCP al exterior)
# En el cliente (Windows PowerShell o OpenSSH):
# ssh -L 3389:localhost:33890 [email protected] -N
# Luego conectar RDP a localhost:3389

# 6. Configurar autenticación de dos factores
# (usando PAM con Google Authenticator o similar)
apt-get install -y libpam-google-authenticator

# En /etc/pam.d/xrdp-sesman, añadir:
# auth required pam_google_authenticator.so nullok

Solución de Problemas

# Ver logs de XRDP en tiempo real
tail -f /var/log/xrdp.log
tail -f /var/log/xrdp-sesman.log

# Error "Authentication failed" al conectar
# Verificar que el usuario existe y puede hacer login
id nombre_usuario
passwd nombre_usuario  # Restablecer contraseña si es necesario

# El escritorio aparece en negro o no se carga
# Verificar que .xsession está correcto
cat ~/.xsession
# Verificar permisos
chmod +x ~/.xsession

# Prueba de escritorio desde el servidor (en una sesión SSH):
DISPLAY=:10 xfce4-session  # Probar si XFCE arranca

# Error de certificado TLS en el cliente RDP
# El cliente RDP mostrará advertencia con certificados auto-firmados
# Aceptar la advertencia o instalar el certificado en el cliente

# Sesión muy lenta o con alto consumo de red
# Reducir la calidad del color en el cliente RDP:
# En Windows: Conexión a Escritorio Remoto > Mostrar Opciones > Pantalla > Color: Color de alta densidad (16 bits)

# Verificar la carga del sistema durante sesiones XRDP
ps aux | grep Xorg | grep -v grep
# Cada sesión inicia un proceso Xorg separado

# Reiniciar XRDP sin afectar las sesiones activas
systemctl reload xrdp

Conclusión

XRDP proporciona una solución de escritorio remoto para servidores Linux compatible con el protocolo RDP estándar de Windows, eliminando la necesidad de clientes especializados y aprovechando la infraestructura RDP existente en entornos Windows. Con XFCE como entorno de escritorio, el consumo de recursos es mínimo mientras se ofrece una experiencia gráfica completa, y la combinación con tunnel SSH o VPN garantiza un acceso seguro sin exponer el puerto RDP directamente a Internet.