Conexión SSH: Cómo realizar el acceso a un servidor

Por Felipe

Publicado en:

La administración remota de servidores es una necesidad constante en toda organización que gestione infraestructura tecnológica. Ya sea un entorno de desarrollo, pruebas o producción, resulta imprescindible contar con mecanismos que permitan ejecutar operaciones en servidores remotos de forma eficiente, segura y confiable. En este contexto, el protocolo SSH (Secure Shell) se ha convertido en el pilar de la administración de sistemas a través de terminal, dado que proporciona una vía cifrada para el acceso remoto, la ejecución de comandos, la transferencia de archivos y otras funciones críticas.

SSH es utilizado por desarrolladores, administradores de sistemas, personal de soporte, ingenieros DevOps y operadores de infraestructura para múltiples propósitos: gestionar instancias en la nube, mantener servidores físicos o virtuales, automatizar procesos con scripts, monitorear recursos, configurar servicios, entre otros. Comprender el funcionamiento de SSH, dominar su configuración y aplicar buenas prácticas de seguridad es esencial en cualquier entorno técnico actual.

 

SSH: ¿Qué es y para qué sirve?


 

SSH es un protocolo de comunicación segura que opera en el nivel de aplicación y se ejecuta sobre una capa de transporte cifrada, típicamente TCP. Fue diseñado como reemplazo directo de protocolos inseguros como Telnet, FTP y rsh, los cuales transmitían contraseñas y datos en texto plano, exponiendo la infraestructura a riesgos severos.

SSH se diferencia porque ofrece:

  • Autenticación segura de usuarios, ya sea mediante contraseña o claves criptográficas.

  • Cifrado simétrico de la sesión para proteger la confidencialidad.

  • Integridad de los datos mediante algoritmos hash.

  • Ejecución remota de comandos y shell interactiva.

  • Reenvío de puertos locales y remotos (tunneling).

  • Capacidad de montar sistemas de archivos remotos vía SFTP o SCP.

  • Capacidad de encapsular otros protocolos para reforzar su seguridad.

Una sesión SSH inicia con un proceso de negociación criptográfica entre cliente y servidor, donde se intercambian claves públicas, se establece un canal cifrado y luego se verifica la identidad del usuario mediante uno de los métodos de autenticación habilitados.

 

Requisitos para establecer una conexión SSH


 

Antes de iniciar cualquier conexión SSH es necesario validar los siguientes aspectos, tanto en el equipo cliente como en el servidor de destino:

1. Presencia de un servidor SSH

El equipo al que se quiere acceder debe tener instalado y en ejecución el servidor SSH. En la mayoría de distribuciones Linux modernas (Ubuntu, Debian, CentOS, AlmaLinux, Fedora, etc.), este servicio se llama sshd. Puede instalarse con los siguientes comandos:

Debian/Ubuntu:

sudo apt update
sudo apt install openssh-server

RHEL/CentOS/AlmaLinux:

sudo dnf install openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd

2. Puerto abierto en el firewall

SSH escucha por defecto en el puerto TCP 22. Si el servidor tiene reglas de firewall activas (como ufw, firewalld o iptables), este puerto debe estar permitido:

sudo ufw allow 22/tcp

O bien, en firewalld:

sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --reload

3. IP pública o nombre de dominio resoluble

El servidor debe contar con una dirección IP válida y accesible desde el cliente, o bien un nombre de dominio correctamente resuelto por DNS. Este dato se utiliza para identificar el destino en el comando de conexión.

4. Usuario habilitado

Es necesario conocer el nombre de usuario válido en el sistema remoto. Esto puede ser root o cualquier otro usuario con permisos suficientes. En ambientes profesionales se desactiva el acceso por root y se trabaja con usuarios comunes que luego elevan privilegios mediante sudo.

 

Clientes SSH: desde qué sistemas operativos puedo conectarme


 

SSH es multiplataforma. Todos los sistemas operativos modernos permiten establecer sesiones SSH, aunque con distintas herramientas.

 

Linux y macOS

Ambos sistemas operativos cuentan con el comando ssh integrado en su terminal. El acceso se realiza con:

ssh usuario@direccion_ip

Por ejemplo:

ssh root@192.168.1.50

Si el puerto ha sido modificado:

ssh -p 2222 usuario@dominio.com

 

Windows

Desde Windows 10 en adelante, PowerShell incorpora el cliente SSH por defecto. También existen herramientas como:

  • PuTTY: cliente SSH gráfico muy utilizado.

  • MobaXterm: cliente SSH avanzado con múltiples funciones.

  • Termius: multiplataforma, con sincronización de perfiles y llaves.

  • VS Code Remote SSH: extensión para desarrollo remoto desde Visual Studio Code.

Para establecer conexión desde PowerShell:

ssh usuario@192.168.1.50

Con PuTTY:

  1. Abre PuTTY.

  2. Especifica la IP o dominio y el puerto.

  3. Selecciona el tipo de conexión como SSH.

  4. Guarda el perfil si se desea.

  5. Haz clic en Open y autentícate.

 

Métodos de autenticación SSH


 

SSH permite validar la identidad del usuario de forma segura mediante dos mecanismos principales:

 

Autenticación por contraseña

Al establecer la conexión, el servidor solicita una contraseña al usuario. Este método es funcional pero poco seguro, ya que:

  • Es vulnerable a ataques de fuerza bruta.

  • Requiere ingreso manual, dificultando la automatización.

  • Si el servidor permite acceso al usuario root con contraseña, el riesgo es mayor.

Se recomienda deshabilitar esta opción una vez configurado el acceso con llaves.

 

Autenticación con llaves públicas

Más segura y escalable. El cliente genera un par de llaves criptográficas (pública y privada). La pública se copia al servidor, y la privada queda almacenada en el cliente. El servidor permite acceso solo si el cliente presenta una clave privada que coincide con alguna clave pública autorizada.

Cómo generar un par de claves

ssh-keygen -t rsa -b 4096 -C "mi_correo@dominio.com"

El sistema generará dos archivos:

  • ~/.ssh/id_rsa (clave privada)

  • ~/.ssh/id_rsa.pub (clave pública)

Cómo copiar la clave pública al servidor

Automáticamente:

ssh-copy-id usuario@servidor

O manualmente:

cat ~/.ssh/id_rsa.pub | ssh usuario@servidor "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Luego, podrás conectarte sin ingresar contraseña (salvo que protejas la clave privada con passphrase, algo muy recomendable).

 

Archivo de configuración local: ~/.ssh/config

Permite simplificar conexiones frecuentes:

Host produccion
HostName 198.51.100.10
User devops
Port 2222
IdentityFile ~/.ssh/id_rsa

Con esta configuración puedes conectarte simplemente con:

ssh produccion

También se puede usar para establecer túneles, reenviar claves, restringir comandos y configurar ProxyJump o bastion hosts.

 

Seguridad en servidores SSH

A medida que un servidor se expone a Internet, aumenta el riesgo de intentos de intrusión. Para proteger un servidor SSH es recomendable:

  1. Cambiar el puerto por defecto para evitar bots automatizados.

  2. Deshabilitar el acceso como root: usar PermitRootLogin no.

  3. Deshabilitar la autenticación por contraseña si se usan llaves.

  4. Usar firewall para limitar el acceso SSH solo desde IPs autorizadas.

  5. Instalar Fail2Ban para detectar intentos fallidos de conexión y bloquear IPs maliciosas.

  6. Auditar los accesos revisando el archivo de logs /var/log/auth.log o /var/log/secure.

  7. Rotar periódicamente las claves privadas si se sospecha de filtración.

  8. Evitar llaves sin passphrase o protegerlas con un agente SSH.

 

Automatización de tareas remotas con SSH

SSH es ampliamente utilizado para ejecutar tareas remotas de forma automatizada, lo que permite:

  • Ejecutar comandos a distancia:

    ssh usuario@servidor "uptime && df -h && free -m"
  • Ejecutar scripts remotos:

    ssh usuario@servidor 'bash -s' < script.sh
  • Transferir archivos con scp:

    scp archivo.txt usuario@servidor:/ruta
  • Sincronizar directorios con rsync:

    rsync -avz carpeta/ usuario@servidor:/destino
     

Túneles SSH y reenvío de puertos

SSH permite crear túneles seguros entre cliente y servidor, lo cual es útil para acceder a servicios restringidos:

 

Túnel local (acceder a una base de datos interna):

ssh -L 3307:localhost:3306 usuario@servidor

Túnel remoto (acceder a una web local desde el servidor):

ssh -R 8080:localhost:80 usuario@servidor

Túnel dinámico (proxy SOCKS):

ssh -D 1080 usuario@servidor

Luego puedes configurar tu navegador para navegar por ese proxy, ocultando tu IP.

 

Solución de problemas comunes

Error Causa probable Solución
Permission denied Usuario incorrecto, clave mal configurada, permisos inválidos Verificar authorized_keys y permisos de .ssh
Connection refused SSH no instalado o puerto incorrecto Verificar que sshd esté corriendo
No route to host IP inalcanzable, firewall bloquea la conexión Probar con ping o traceroute
Host key verification failed Clave del servidor cambió Borrar línea correspondiente en ~/.ssh/known_hosts

 

Conceptos fundamentales para automatizar tareas con SSH

La automatización de tareas remotas sobre SSH parte de tres condiciones básicas que deben cumplirse:

1. Acceso sin contraseña mediante llaves públicas

Una vez que el servidor destino tiene configurada una clave pública del cliente en su archivo ~/.ssh/authorized_keys, es posible ejecutar comandos sin necesidad de ingresar una contraseña manualmente.

Esto permite que scripts automatizados —ya sea desde otro servidor o desde una computadora de administración— puedan conectarse al servidor remoto sin intervención humana.

2. Disponibilidad del servicio SSH en el servidor

Debe estar activo y escuchando en un puerto abierto. Si se cambia el puerto por defecto (22) por razones de seguridad, esta información debe estar incluida en los scripts que realizan la conexión.

3. Scripts con comandos remotos estructurados

Toda la lógica de automatización puede residir en scripts de Bash, Python, PHP, Perl o cualquier lenguaje capaz de invocar procesos del sistema. Estos scripts deben diseñarse para manejar errores, validar resultados y registrar sus acciones.

 

Ejecución de comandos remotos por SSH desde un script

Forma básica:

ssh usuario@servidor 'comando'

Ejemplo:

ssh root@192.168.1.100 'df -h'

Este comando retorna el resultado del uso de disco del servidor remoto.

Ejecución de múltiples comandos encadenados:

ssh usuario@servidor 'comando1 && comando2 && comando3'

Ejemplo:

ssh root@servidor 'apt update && apt upgrade -y && systemctl restart apache2'

Esto actualiza los paquetes y reinicia Apache en un solo paso.

Captura del resultado en el cliente:

SALIDA=$(ssh usuario@servidor 'hostname')
echo "El nombre del servidor remoto es: $SALIDA"

Puedes utilizar esta técnica para tomar decisiones en tiempo real en función de lo que devuelve el servidor.

 

Automatización de ejecución de scripts remotos

Existen dos formas de ejecutar scripts ubicados en el cliente sobre el servidor remoto:

1. Ejecutar un script remoto ya presente en el servidor

ssh usuario@servidor 'bash /ruta/script.sh'

Este método requiere que el script haya sido copiado previamente.

2. Enviar un script temporal desde el cliente y ejecutarlo

ssh usuario@servidor 'bash -s' < script_local.sh

Este comando toma el contenido del archivo local y lo ejecuta como entrada estándar (stdin) en el servidor.

Este método es ideal para tareas puntuales y evita dejar archivos residuales en el servidor remoto.

 

Automatización de transferencias de archivos con SCP y Rsync

Automatizar tareas muchas veces implica subir archivos al servidor, respaldar información remota o sincronizar contenido entre nodos.

Subir un archivo con scp:

scp archivo.txt usuario@servidor:/ruta/destino/

Descargar archivos:

scp usuario@servidor:/ruta/logs.tar.gz /local/destino/

Sincronizar carpetas con rsync:

rsync -avz --delete /local/datos/ usuario@servidor:/remoto/datos/

El flag --delete elimina archivos en el destino que ya no existen en origen, útil para sincronizaciones completas.

 

Uso de cronjobs para programar tareas automáticas

Una vez que se tiene acceso sin contraseña, cualquier script puede ser agendado para su ejecución periódica mediante cron.

Abrir el cron del usuario:

crontab -e

Programar una ejecución cada día a las 02:00 AM:

0 2 * * * /ruta/miscript.sh >> /var/log/miscript.log 2>&1

Este cron puede invocar SSH directamente si lo que se desea es automatizar procesos en otros servidores:

0 4 * * * ssh usuario@servidor 'sh /ruta/tarea.sh' >> /var/log/tareas_remotas.log 2>&1

 

Seguridad en automatizaciones con SSH

Aunque SSH ofrece cifrado y autenticación segura, la automatización sin control puede generar problemas de seguridad. A continuación, algunas recomendaciones para proteger los entornos automatizados:

Usar usuarios limitados

Nunca utilizar root si no es necesario. Crear un usuario dedicado para tareas automáticas con acceso restringido y llaves específicas.

Limitar comandos mediante authorized_keys

Es posible restringir las acciones que puede ejecutar una llave específica desde el archivo ~/.ssh/authorized_keys:

command="/scripts/solo_este.sh",no-agent-forwarding,no-pty ssh-rsa AAAAB3...

Esto garantiza que esa llave solo podrá ejecutar ese script.

Usar ssh-agent para llaves con passphrase

Si la clave privada tiene passphrase, ssh-agent permite almacenarla en memoria y usarla durante la sesión del script:

eval $(ssh-agent)
ssh-add ~/.ssh/id_rsa

Esto es útil cuando se lanzan scripts desde Jenkins, GitLab CI o cronjobs en estaciones locales.

Rotación de claves

Establecer una política para renovar claves SSH periódicamente, especialmente si se automatizan tareas críticas.

Casos de uso reales

1. Mantenimiento de servidores nocturno

Un script ejecutado desde una máquina de administración puede realizar lo siguiente en 10 servidores distintos cada noche:

  • Vaciar logs antiguos.

  • Reiniciar servicios que consumen mucha RAM.

  • Verificar si existen procesos colgados.

  • Enviar por correo un informe consolidado de ejecución.

2. Sincronización de contenido web entre servidores de staging y producción

Cada vez que el equipo de desarrollo sube cambios al repositorio, se ejecuta un script que:

  • Valida los cambios en staging.

  • Si los tests pasan, hace un rsync al servidor de producción.

  • Reinicia el servicio de PHP-FPM para aplicar cambios.

3. Backup automatizado y replicación fuera del sitio

Un cronjob en un servidor remoto:

  • Comprime la base de datos MySQL.

  • La sube a otro servidor mediante scp.

  • Elimina respaldos antiguos con más de 7 días.

 

Alternativas y herramientas complementarias

Aunque SSH es el estándar, existen otras herramientas que lo utilizan o lo extienden:

Ansible

Permite orquestar tareas en múltiples servidores simultáneamente, usando SSH como medio de transporte. Se puede definir una inventory con IPs y usuarios, y luego aplicar “playbooks” YAML que ejecutan acciones idempotentes.

Git + SSH

Ideal para despliegue automatizado. Puedes configurar hooks post-push que ejecuten acciones vía SSH una vez se actualiza un repositorio.

Autossh

Reinicia automáticamente conexiones SSH caídas, útil para túneles persistentes entre servidores.