Despliegue Automatizado de VS Code a Linux: Usuario No Root, Claves SSH y Systemd en la Práctica — Aumenta la Eficiencia y Seguridad

Desplegar manualmente una aplicación en un servidor remoto puede ser tedioso. Al automatizar el proceso, ahorras tiempo, evitas pasos repetitivos y te mantienes enfocado en programar. En esta guía configuraremos un flujo de trabajo donde tareas de Visual Studio Code (VS Code) compilan automáticamente tu app, transfieren archivos de forma segura a un servidor Linux remoto usando autenticación por clave SSH (a través de un usuario no root) y reinician la app con un servicio systemd. Esto no solo agiliza el despliegue sino que también aumenta la seguridad al eliminar inicios de sesión root y SSH basado en contraseñas. Usar un usuario dedicado sin privilegios añade una barrera entre atacantes y tu servidor, y confiar en claves en lugar de contraseñas elimina prácticamente el riesgo de fuerza bruta en SSH. Profundicemos en la configuración paso a paso.

1. Crear un Usuario Dedicado No Root para Despliegue

Desplegar o ejecutar una app como root es mala práctica, así que crearemos un nuevo usuario (ej. vscodeuser) en el servidor remoto para poseer y ejecutar nuestra app. Una cuenta sin privilegios limita el daño si es comprometida y es recomendado en general. Este usuario se usará para inicios de sesión SSH y para ejecutar el servicio de la app. Inicia sesión en el servidor remoto como root (o cualquier administrador con sudo) y añade el nuevo usuario (reemplaza vscodeuser con tu nombre de usuario preferido):

sudo adduser vscodeuser

Esto solicitará una contraseña y detalles del usuario. Elige una contraseña fuerte (aunque cambiaremos a inicio de sesión por clave pronto, SSH no la pedirá). Acepta los valores predeterminados para la información del usuario si lo deseas. Se creará una nueva cuenta y directorio home (ej. /home/vscodeuser).

Opcional: Si quieres que este usuario realice tareas administrativas, añádelo al grupo sudo (Debian/Ubuntu):

sudo usermod -aG sudo vscodeuser

Para un usuario puramente de despliegue, sudo no suele ser necesario. ¿Por qué no root? Todo sistema Unix/Linux tiene una cuenta root, y los atacantes la buscan rutinariamente. Deshabilitar SSH root directo y usar un usuario ordinario significa que un atacante debe comprometer primero una cuenta no privilegiada, luego escalar privilegios — un obstáculo adicional. Deshabilitar completamente los inicios de sesión SSH root y usar una cuenta sin privilegios autenticada por clave es ampliamente considerado como buena práctica.

2. Configurar Autenticación SSH por Clave para el Nuevo Usuario

Ahora habilitaremos la autenticación por clave pública SSH para vscodeuser para iniciar sesión sin contraseñas. Los inicios de sesión por clave no solo son más convenientes (sin solicitudes en nuestra automatización) sino también más seguros, especialmente si se deshabilitan los inicios de sesión por contraseña.

En tu máquina local

Necesitas un par de claves SSH (una clave privada y una pública). Si ya tienes un par que quieras usar, omite generar una nueva clave; de lo contrario, genera una en el paso 4.

En el servidor remoto

Autoriza tu clave pública para el nuevo usuario:

  1. Crea el directorio .ssh en el home del nuevo usuario (y asegura sus permisos). Como root (o vía sudo):
    sudo mkdir -p /home/vscodeuser/.ssh
    sudo chmod 700 /home/vscodeuser/.ssh
    
  2. Añade tu clave pública a authorized_keys: Si tienes el texto de la clave a mano, añádela manualmente, por ejemplo:
    sudo sh -c 'echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLVDBIpdpfePg/...(resto de la clave)...fRjB user@local" > /home/vscodeuser/.ssh/authorized_keys'
    
    (Reemplaza la cadena ssh-rsa con tu clave real, toda en una línea.) O abre el archivo con sudo nano /home/vscodeuser/.ssh/authorized_keys y pega la clave.
  3. Corrige permisos y propiedad:
    sudo chmod 600 /home/vscodeuser/.ssh/authorized_keys
    sudo chown -R vscodeuser:vscodeuser /home/vscodeuser/.ssh
    
    authorized_keys debe tener permisos 600 y ser propiedad del usuario. SSH lo ignorará de lo contrario. Tu servidor ahora permite que vscodeuser inicie sesión con una clave. Esto replica lo que hace ssh-copy-id: crea ~/.ssh, añade la clave, corrige permisos. Si ssh-copy-id está disponible localmente, ejecuta:
# En tu máquina local:
ssh-copy-id vscodeuser@tu_ip_servidor

Solicitará una vez la contraseña del usuario, luego instalará la clave correctamente. Después deberías poder usar SSH sin solicitud de contraseña. Consejo de seguridad: Como vscodeuser es solo por clave, considera deshabilitar la autenticación por contraseña y prohibir inicios de sesión root en /etc/ssh/sshd_config estableciendo PasswordAuthentication no y PermitRootLogin no, luego reinicia SSH. Todo el acceso deberá usar claves, frustrando intentos de fuerza bruta y bloqueando root completamente. Inicia sesión como vscodeuser y usa sudo solo cuando sea necesario.

3. Verificar Permisos y Propiedad de SSH

Verifica dos veces la configuración de SSH — es una fuente frecuente de errores. En el servidor remoto (como root o sudo):

  • /home/vscodeuser/.ssh debe ser propiedad de vscodeuser y drwx------ (700).
  • /home/vscodeuser/.ssh/authorized_keys debe ser propiedad de vscodeuser y -rw------- (600). Verifica:
ls -l /home/vscodeuser/.ssh
ls -l /home/vscodeuser/.ssh/authorized_keys

Deberías ver algo como:

drwx------ 2 vscodeuser vscodeuser 4096 May 24 00:30 .ssh
-rw------- 1 vscodeuser vscodeuser  382 May 24 00:30 authorized_keys

Corrige cualquier problema con chmod y chown como arriba. StrictModes en SSH rechazará permisos laxos. Ahora prueba desde tu máquina local (puede que necesites una clave primero — ver siguiente paso):

ssh vscodeuser@tu_ip_servidor

Deberías iniciar sesión sin solicitud de contraseña. Si se solicita, la autenticación por clave falló — revisa los pasos anteriores.

4. Generar y Usar un Par de Claves SSH Localmente

Si aún no tienes un par de claves en tu equipo de desarrollo, crea uno ahora. La clave privada se queda local (¡guárdala bien!), la clave pública es la que instalaste en el servidor. En tu máquina local:

ssh-keygen -t rsa -b 4096 -C "Clave de Despliegue VSCode"
  • -t rsa -b 4096: Clave RSA, 4096 bits.
  • -C "Clave de Despliegue VSCode": una etiqueta. Acepta la ruta predeterminada (~/.ssh/id_rsa / id_rsa.pub) o elige algo como ~/.ssh/id_vscode_deploy. Ingresa una frase de contraseña para seguridad extra, o presiona Enter para ninguna (pero entonces cualquiera con el archivo podrá usarla). Si estableces una frase, usa un agente SSH para que la automatización funcione sin solicitudes. Ahora tendrás:
  • ~/.ssh/id_rsaclave privada (mantén secreta).
  • ~/.ssh/id_rsa.pubclave pública (copia al servidor). Si es una clave nueva, vuelve al Paso 2 y añade id_rsa.pub al servidor. Luego prueba:
ssh vscodeuser@tu_ip_servidor -i ~/.ssh/id_rsa

(u omite -i si es tu clave predeterminada). Ejemplos de formatos de clave:

  • Pública (id_rsa.pub)
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxqHYEE3XdexSmo5rT01nxOKjP4YOIuC/... demo@local
    
  • Privada (id_rsa)
    -----BEGIN OPENSSH PRIVATE KEY-----
    b3BlbnN...
    -----END OPENSSH PRIVATE KEY-----
    

Añade la clave a tu agente (ssh-add ~/.ssh/id_rsa) para que VS Code pueda usarla sin solicitar. El SSH por clave para vscodeuser ya funciona; es hora de configurar la app bajo ese usuario y automatizar el despliegue.

5. Crear un Servicio Systemd (Servicio de Usuario) para Tu App

En lugar de ejecutar la app manualmente, crea un servicio systemd. Puede iniciar al arranque, reiniciar ante fallos y controlarse con un comando. Haremos un servicio de usuario bajo vscodeuser, sin necesidad de root.

Como vscodeuser en el servidor remoto:

  1. Crea el archivo de unidad:
    mkdir -p ~/.config/systemd/user
    nano ~/.config/systemd/user/miapp.service
    
  2. Define el servicio:
    [Unit]
    Description=Servicio de Mi App
    After=network.target
    [Service]
    ExecStart=/home/vscodeuser/miapp/binario_miapp
    WorkingDirectory=/home/vscodeuser/miapp
    Restart=on-failure
    # No se necesita User=; esto es un servicio de usuario
    [Install]
    WantedBy=default.target
    
    • ExecStart: comando para ejecutar tu app. Ajusta la ruta.
    • WorkingDirectory: (opcional) carpeta de la app.
    • Restart: reinicia ante fallos.
  3. Recarga systemd y habilita:
    systemctl --user daemon-reload
    systemctl --user enable miapp.service --now
    
    Verifica el estado:
    systemctl --user status miapp.service
    
  4. Habilita lingering (para que el servicio sobreviva a cierres de sesión/reinicios):
    sudo loginctl enable-linger vscodeuser
    

Ahora vscodeuser puede controlar el servicio:

systemctl --user restart miapp.service

Lo automatizaremos a continuación.

6. Automatizar Compilación y Despliegue con Tareas de VS Code

Aquí está la magia: configura VS Code para compilar, desplegar y reiniciar con un solo comando o combinación de teclas. El ejecutor de tareas de VS Code puede llamar a herramientas/scripts externos. Abre .vscode/tasks.json en tu espacio de trabajo:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Compilar App",
            "type": "shell",
            "command": "go build -o miapp .",
            "group": { "kind": "build", "isDefault": true },
            "problemMatcher": []
        },
        {
            "label": "Desplegar App",
            "type": "shell",
            "command": "rsync -avz ./miapp vscodeuser@ip-tu-servidor:/home/vscodeuser/miapp/",
            "dependsOn": "Compilar App",
            "problemMatcher": []
        },
        {
            "label": "Reiniciar Servicio App",
            "type": "shell",
            "command": "ssh vscodeuser@ip-tu-servidor 'systemctl --user restart miapp.service'",
            "dependsOn": "Desplegar App",
            "problemMatcher": []
        }
    ]
}

Cómo funciona

  • Compilar App: compila tu proyecto (ejemplo para Go). Ajusta para Node, Java, Rust, etc.
  • Desplegar App: rsync sincroniza el/los artefacto(s) al servidor. Añade --delete si quieres eliminar archivos obsoletos. rsync usará automáticamente tu clave o cualquier agente.
  • Reiniciar Servicio App: SSH al servidor y reinicia systemd. Solo se ejecuta si el despliegue tiene éxito. Ejecuta "Tareas: Ejecutar Tarea" → Reiniciar Servicio App. VS Code encadena Compilar ➝ Desplegar ➝ Reiniciar. Asigna una tecla o usa Ctrl+Mayús+B si Compilar está agrupada. Nota: Las tareas asumen un entorno no interactivo. Con autenticación por clave, no hay solicitudes de contraseña. Si tu clave tiene frase, asegúrate de que un agente la tenga en caché; de lo contrario, las tareas pueden bloquearse esperando entrada.

Resumen

Con esta configuración puedes:

  1. Compilar tu proyecto.
  2. Copiar archivos actualizados al servidor de forma segura (rsync sobre claves SSH).
  3. Reiniciar el servicio de la app en el servidor. Todo con un comando, sin SSH manual, sin contraseñas, sin privilegios root innecesarios. El usuario no root vscodeuser ejecuta su propio servicio, aumentando la seguridad, y el SSH por clave permite que la automatización se ejecute de forma segura mientras elimina ataques de fuerza bruta por contraseña. Es una canalización de despliegue ligera usando herramientas simples y totalmente controladas, y VS Code mantiene todo el flujo dentro de tu editor — conveniente y libre de errores.

Artículos que podrían interesarte

Descubre más contenido interesante

Comentario