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):
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):
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:
- Crea el directorio
.ssh
en el home del nuevo usuario (y asegura sus permisos). Como root (o vía sudo): - Añade tu clave pública a
authorized_keys
: Si tienes el texto de la clave a mano, añádela manualmente, por ejemplo:
(Reemplaza la cadena ssh-rsa con tu clave real, toda en una línea.) O abre el archivo consudo nano /home/vscodeuser/.ssh/authorized_keys
y pega la clave. - Corrige permisos y propiedad:
authorized_keys
debe tener permisos 600 y ser propiedad del usuario. SSH lo ignorará de lo contrario. Tu servidor ahora permite quevscodeuser
inicie sesión con una clave. Esto replica lo que hacessh-copy-id
: crea~/.ssh
, añade la clave, corrige permisos. Sissh-copy-id
está disponible localmente, ejecuta:
# En tu máquina local:
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 devscodeuser
ydrwx------
(700)./home/vscodeuser/.ssh/authorized_keys
debe ser propiedad devscodeuser
y-rw-------
(600). Verifica:
Deberías ver algo como:
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):
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:
-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_rsa
– clave privada (mantén secreta).~/.ssh/id_rsa.pub
– clave pública (copia al servidor). Si es una clave nueva, vuelve al Paso 2 y añadeid_rsa.pub
al servidor. Luego prueba:
(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:
- Crea el archivo de unidad:
- 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.
- Recarga systemd y habilita:
Verifica el estado: - Habilita lingering (para que el servicio sobreviva a cierres de sesión/reinicios):
Ahora vscodeuser
puede controlar el servicio:
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:
- Compilar tu proyecto.
- Copiar archivos actualizados al servidor de forma segura (rsync sobre claves SSH).
- 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.
Comentario