SSH y utilización
SSH (Secure Shell): Explicación y Funcionamiento
SSH (Secure Shell) es un protocolo de red que permite la administración segura y la comunicación entre dos sistemas informáticos, generalmente un cliente y un servidor. SSH se utiliza principalmente para acceder de forma remota a sistemas, gestionar servidores, transferir archivos y ejecutar comandos en una máquina remota a través de un canal cifrado. Fue diseñado para reemplazar protocolos inseguros como Telnet, que transmiten datos (incluyendo contraseñas) sin cifrar, lo que los hace vulnerables a ataques como la interceptación de paquetes (sniffing).
Características principales de SSH
- Cifrado: Asegura que los datos transmitidos entre el cliente y el servidor estén protegidos de accesos no autorizados.
- Autenticación:
- Basada en contraseñas.
- Basada en claves públicas y privadas (más segura).
- Integridad de datos: Garantiza que los datos no sean alterados durante la transmisión.
- Redirección de puertos (túneles SSH): Permite crear túneles seguros para redirigir tráfico desde aplicaciones específicas.
- Transparencia: Funciona a través de cualquier red TCP/IP.
- Compatibilidad multiplataforma: Disponible en Linux, macOS, Windows (con herramientas como OpenSSH o PuTTY).
Cómo funciona SSH
- Establecimiento de la conexión:
- El cliente inicia una conexión al servidor SSH en un puerto específico (por defecto, el puerto 22).
- El servidor envía su clave pública al cliente.
- El cliente valida la autenticidad del servidor (generalmente usando un archivo conocido como
known_hosts).
- Cifrado de la comunicación:
- Se establece una clave de sesión usando algoritmos de intercambio de claves como Diffie-Hellman.
- Toda la comunicación posterior entre el cliente y el servidor se cifra con esta clave.
- Autenticación del cliente:
- El cliente se autentica con el servidor usando una contraseña o un par de claves (clave pública y privada).
- En el caso de las claves, la clave privada nunca se transmite; se utiliza para firmar criptográficamente un desafío enviado por el servidor.
- Interacción segura:
- Una vez autenticado, el cliente puede ejecutar comandos, transferir archivos o establecer túneles cifrados.
Comandos relacionados con SSH
Conexión y autenticación
ssh- Conecta a un servidor remoto.
- Ejemplo:
1 2
ssh usuario@servidor.com ssh -p 2222 usuario@servidor.com # Conecta usando un puerto diferente.
ssh-keygen- Genera un par de claves pública y privada para autenticación.
- Ejemplo:
1
ssh-keygen -t rsa -b 4096 -C "tu_email@example.com"
ssh-copy-id- Copia la clave pública al servidor remoto para habilitar el acceso sin contraseña.
- Ejemplo:
1
ssh-copy-id usuario@servidor.com
Transferencia de archivos
scp(Secure Copy Protocol)- Copia archivos entre el cliente y el servidor de forma segura.
- Ejemplo:
1 2
scp archivo.txt usuario@servidor.com:/ruta/remota/ scp usuario@servidor.com:/ruta/remota/archivo.txt /ruta/local/
rsync- Sincroniza archivos y directorios de forma eficiente y segura (usa SSH).
- Ejemplo:
1
rsync -avz archivo.txt usuario@servidor.com:/ruta/remota/
Túneles y redirección de puertos
- Túnel SSH (Redirección de puertos locales):
- Redirige tráfico local a través de SSH.
- Ejemplo:
1 2
ssh -L 8080:localhost:80 usuario@servidor.com # Accede a localhost:8080 en el cliente para llegar al puerto 80 en el servidor.
- Redirección de puertos remotos:
- Permite que un puerto remoto redirija tráfico al cliente.
- Ejemplo:
1
ssh -R 8080:localhost:80 usuario@servidor.com
- Túnel dinámico (SOCKS Proxy):
- Crea un proxy para enrutar tráfico de aplicaciones como navegadores web.
- Ejemplo:
1
ssh -D 1080 usuario@servidor.com
Gestión de conexiones
ssh-add- Agrega una clave privada al agente SSH.
- Ejemplo:
1
ssh-add ~/.ssh/id_rsa
ssh-agent- Inicia un proceso que almacena claves para autenticación.
- Ejemplo:
1
eval "$(ssh-agent -s)"
ssh-config- Configura opciones predeterminadas para conexiones SSH.
- Archivo:
~/.ssh/config.
Ejemplo de configuración:1 2 3 4 5
Host mi-servidor HostName servidor.com User usuario Port 2222 IdentityFile ~/.ssh/id_rsaAhora puedes conectarte simplemente con:
1
ssh mi-servidor
Otras utilidades
sftp- Cliente para transferir archivos de forma interactiva.
- Ejemplo:
1
sftp usuario@servidor.com
sshfs- Monta un sistema de archivos remoto a través de SSH.
- Ejemplo:
1
sshfs usuario@servidor.com:/ruta/remota /ruta/local
screenotmux(para sesiones persistentes):- Mantén sesiones SSH activas incluso si se interrumpe la conexión.
- Ejemplo:
1 2
screen ssh usuario@servidor.com
Ventajas de SSH
- Seguridad robusta con cifrado.
- Facilidad de uso para tareas administrativas remotas.
- Flexibilidad en la transferencia de archivos y redirección de puertos.
- Compatibilidad con múltiples herramientas (como Git, Ansible, etc.).
Conclusión
SSH es una herramienta esencial para administrar sistemas de manera remota y segura. Su versatilidad y su amplio ecosistema de comandos y herramientas lo convierten en un estándar en la administración de sistemas y redes.
Para hacer que PuTTY no te pida la contraseña al conectarte a un servicio SSH, puedes configurar autenticación basada en claves SSH. Esto elimina la necesidad de ingresar una contraseña cada vez que te conectas al servidor. Aquí están los pasos detallados:
1. Generar un par de claves SSH con PuTTYgen
- Abre PuTTYgen (se instala junto con PuTTY o se puede descargar por separado).
- En PuTTYgen:
- Haz clic en Generate.
- Mueve el ratón en el área designada para generar entropía.
- Una vez generada la clave:
- Copia el contenido del campo Public key for pasting into OpenSSH authorized_keys file.
- Guarda la clave privada con el botón Save private key. Puedes asignar una frase de seguridad para mayor protección, aunque no es obligatoria.
- Opcionalmente, guarda la clave pública con el botón Save public key.
2. Configurar la clave pública en el servidor
- Conéctate al servidor SSH con tus credenciales habituales.
- Asegúrate de que exista el directorio
.sshen tu carpeta de usuario:1 2
mkdir -p ~/.ssh chmod 700 ~/.ssh
- Edita el archivo
authorized_keysen el servidor para incluir la clave pública:1
nano ~/.ssh/authorized_keys
- Pega el contenido de la clave pública copiada desde PuTTYgen en este archivo. Asegúrate de que toda la clave esté en una sola línea.
- Guarda y cierra el archivo.
- Establece los permisos correctos:
1
chmod 600 ~/.ssh/authorized_keys
3. Configurar PuTTY para usar la clave privada
- Abre PuTTY.
- Ve a Connection > SSH > Auth en el panel de configuración de PuTTY.
- En la sección Private key file for authentication, haz clic en Browse y selecciona la clave privada que generaste con PuTTYgen.
- Regresa a la sección Session, introduce la dirección IP o nombre de host del servidor y guarda la configuración:
- Escribe un nombre en Saved Sessions y haz clic en Save.
4. Probar la conexión
- Abre PuTTY y carga la sesión guardada.
- Conéctate al servidor.
- Si todo está configurado correctamente, no se te pedirá una contraseña y accederás directamente.
Notas importantes
- Asegúrate de que el servidor SSH esté configurado para aceptar autenticación basada en claves. Revisa la configuración del archivo
/etc/ssh/sshd_configen el servidor y verifica que las siguientes líneas estén habilitadas:1 2
PubkeyAuthentication yes PasswordAuthentication yes
Luego reinicia el servicio SSH:
1
sudo systemctl restart sshd - Si cambiaste el puerto por defecto (22), recuerda especificarlo en PuTTY.
Conclusión
Este método usa claves SSH para autenticación, eliminando la necesidad de ingresar contraseñas. Es más seguro que el uso de contraseñas porque las claves privadas permanecen en tu dispositivo y no se transmiten por la red.
Explicación del comando rsync
rsync es una poderosa herramienta de sincronización y copia de archivos en sistemas Linux y Unix. Se utiliza para transferir y sincronizar archivos y directorios entre sistemas locales y remotos de manera eficiente. Lo hace comparando los archivos origen y destino, copiando solo las diferencias para ahorrar ancho de banda y tiempo.
Características principales de rsync
- Eficiencia en la transferencia:
- Utiliza un algoritmo delta que copia solo las partes del archivo que han cambiado.
- Versatilidad:
- Puede usarse para sincronización local (entre carpetas del mismo sistema) o remota (a través de SSH o daemon
rsync).
- Puede usarse para sincronización local (entre carpetas del mismo sistema) o remota (a través de SSH o daemon
- Compresión:
- Ofrece la opción de comprimir los datos durante la transferencia para ahorrar ancho de banda.
- Preservación de atributos:
- Puede preservar permisos, propietarios, marcas de tiempo, enlaces simbólicos y dispositivos.
- Seguridad:
- Se integra con SSH para transferencias seguras.
Sintaxis general
1
rsync [opciones] fuente destino
- fuente: Archivos o directorios a copiar.
- destino: Lugar donde se copiarán los archivos (puede ser local o remoto).
Ejemplos de uso
1. Copia local de un archivo/directorio
1
rsync -av /origen/ /destino/
-a: Modo archivo (preserva permisos, propietarios, enlaces, etc.).-v: Modo detallado (muestra el progreso).
2. Sincronización remota usando SSH
1
rsync -avz -e ssh /origen/ usuario@servidor:/ruta/destino/
-z: Comprime los datos durante la transferencia.-e ssh: Usa SSH como transporte.
3. Eliminar archivos en el destino que ya no existen en el origen
1
rsync -av --delete /origen/ /destino/
--delete: Elimina archivos del destino que no están en el origen.
4. Sincronizar solo archivos modificados o más recientes
1
rsync -u /origen/ /destino/
-u: Copia solo los archivos que son más nuevos en el origen.
5. Mostrar progreso durante la transferencia
1
rsync -av --progress /origen/ /destino/
--progress: Muestra el estado de cada archivo mientras se transfiere.
6. Excluyendo archivos o directorios específicos
1
rsync -av --exclude '*.log' /origen/ /destino/
--exclude: Omite archivos o directorios que coincidan con el patrón.
7. Transferencia directa entre dos servidores remotos
1
rsync -av -e ssh usuario1@servidor1:/ruta/origen/ usuario2@servidor2:/ruta/destino/
Este comando copia archivos entre dos servidores sin necesidad de descargarlos al sistema local.
Opciones comunes
| Opción | Descripción |
|——————–|———————————————————————————————–|
| -a | Activa el modo archivo (preserva permisos, propietarios, marcas de tiempo, enlaces, etc.). |
| -v | Muestra información detallada sobre el proceso. |
| -z | Comprime los datos durante la transferencia. |
| -r | Copia directorios de forma recursiva. |
| --delete | Elimina archivos en el destino que no están en el origen. |
| --progress | Muestra el progreso de la copia. |
| -e ssh | Especifica el uso de SSH como protocolo de transporte. |
| --exclude | Excluye archivos o directorios que coincidan con un patrón. |
¿Cuándo usar rsync?
- Copia de seguridad:
- Realiza copias de respaldo incrementales, copiando solo los cambios desde la última copia.
- Sincronización remota:
- Mantén sincronizados sistemas remotos de forma rápida y eficiente.
- Migración de datos:
- Transfiere datos entre servidores o sistemas locales con mínimos tiempos de inactividad.
Conclusión
rsync es una herramienta imprescindible para administradores de sistemas y desarrolladores gracias a su eficiencia, flexibilidad y capacidad para manejar grandes volúmenes de datos de forma segura y rápida. Con su soporte para conexiones SSH y opciones avanzadas como la compresión y la exclusión de patrones, rsync sobresale como la solución ideal para tareas de copia y sincronización.
Ejercicios prácticos de SSH
1. Conexión remota básica con SSH
- Conéctate a un servidor remoto utilizando SSH.
- Supongamos que el servidor remoto tiene la dirección IP
192.168.1.10y el usuario esuser.
1
ssh user@192.168.1.10
Objetivo:
- Verificar si puedes conectarte y explorar el sistema remoto.
2. Conexión con un puerto personalizado
- Configura SSH para conectarte a un servidor que escucha en un puerto diferente al predeterminado (22). Usa el puerto
2022.
1
ssh -p 2022 user@192.168.1.10
Objetivo:
- Verificar la capacidad de manejar configuraciones no estándar.
3. Copiar claves públicas para una conexión sin contraseña
- Usa el comando
ssh-copy-idpara copiar tu clave pública al servidor y configurar el inicio de sesión sin contraseña.
1
ssh-copy-id user@192.168.1.10
Objetivo:
- Configurar un sistema seguro y cómodo para la autenticación sin necesidad de ingresar contraseñas.
4. Crear un túnel SSH
- Redirige un puerto local al puerto de un servidor remoto (por ejemplo, para acceder a un servidor web que corre en el puerto 8080).
1
ssh -L 8080:localhost:8080 user@192.168.1.10
Objetivo:
- Practicar el uso de túneles para aplicaciones específicas como bases de datos o servidores web.
5. Usar scp para transferir archivos
- Transfiere un archivo local (
/home/user/archivo.txt) a un servidor remoto en la carpeta/home/user/.
1
scp /home/user/archivo.txt user@192.168.1.10:/home/user/
Objetivo:
- Comprender cómo usar
scppara transferencias rápidas de archivos.
Ejercicios prácticos de rsync
1. Sincronización básica de archivos locales
- Sincroniza el contenido del directorio
/home/user/backupcon el directorio/home/user/backup_sync.
1
rsync -av /home/user/backup/ /home/user/backup_sync/
Objetivo:
- Aprender a copiar y sincronizar directorios en el mismo sistema.
2. Transferencia de archivos remotos
- Usa
rsyncpara copiar el contenido del directorio/home/user/proyectoa un servidor remoto.
1
rsync -av /home/user/proyecto/ user@192.168.1.10:/home/user/proyecto_remoto/
Objetivo:
- Dominar la transferencia eficiente de datos a sistemas remotos.
3. Eliminar archivos obsoletos en el destino
- Sincroniza un directorio remoto con el local y elimina en el remoto los archivos que no estén presentes en el local.
1
rsync -av --delete /home/user/proyecto/ user@192.168.1.10:/home/user/proyecto_remoto/
Objetivo:
- Practicar la sincronización completa, asegurando que ambos lados estén idénticos.
4. Excluir archivos específicos
- Sincroniza el directorio
/home/user/proyectoexcluyendo los archivos.log.
1
rsync -av --exclude='*.log' /home/user/proyecto/ user@192.168.1.10:/home/user/proyecto_remoto/
Objetivo:
- Aprender a excluir ciertos tipos de archivos durante la sincronización.
5. Comprimir datos durante la transferencia
- Usa
rsynccon compresión para transferir datos al servidor remoto.
1
rsync -avz /home/user/proyecto/ user@192.168.1.10:/home/user/proyecto_remoto/
Objetivo:
- Reducir el tiempo de transferencia al comprimir los datos.
6. Sincronización inversa desde un servidor remoto
- Copia el contenido de un directorio remoto al local.
1
rsync -av user@192.168.1.10:/home/user/proyecto_remoto/ /home/user/proyecto/
Objetivo:
- Practicar la descarga de datos remotos y mantenerlos sincronizados.
Ejercicio combinado de SSH y rsync
1. Automatización de copias de seguridad remotas
- Crea un script en Bash para sincronizar el directorio
/home/user/backupcon un servidor remoto a través de SSH usandorsync.
Ejemplo de script:
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# Variables
LOCAL_DIR="/home/user/backup/"
REMOTE_USER="user"
REMOTE_HOST="192.168.1.10"
REMOTE_DIR="/home/user/backup_remoto/"
# Comando rsync
rsync -avz --delete -e ssh "$LOCAL_DIR" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR"
echo "Copia de seguridad completada."
Objetivo:
- Practicar la integración de
rsyncy SSH en tareas automatizadas.
Estos ejercicios te permitirán aprender, aplicar y combinar las funcionalidades de SSH y rsync para la administración de sistemas, la transferencia segura de datos y la automatización de tareas.
¿Qué es crontab?
crontab es una herramienta en sistemas Unix/Linux que permite programar la ejecución de tareas automáticamente en momentos específicos. Estas tareas, conocidas como cron jobs, son especialmente útiles para automatizar tareas de mantenimiento, copias de seguridad, actualizaciones o cualquier script que necesite ejecutarse de forma periódica.
Funcionamiento de crontab
-
Demonio
cron: Es el servicio que se ejecuta en segundo plano y se encarga de leer los archivoscrontabpara ejecutar las tareas en el momento programado. -
Archivo
crontab: Es un archivo de texto que contiene las tareas programadas, cada una en una línea con un formato específico. -
Formato básico de una línea
crontab:1
* * * * * comando
Cada asterisco representa un campo temporal:
- Minuto (0-59)
- Hora (0-23)
- Día del mes (1-31)
- Mes (1-12 o abreviaturas como jan, feb)
- Día de la semana (0-7, donde 0 y 7 son domingo, o abreviaturas como mon, tue)
El comando especifica lo que se ejecutará en el momento indicado por esos campos.
Ejemplo de configuración crontab
- Ejecutar un script cada día a las 3:00 AM:
1
0 3 * * * /home/usuario/backup.sh
- Ejecutar cada 5 minutos:
1
*/5 * * * * /home/usuario/monitoreo.sh
- Ejecutar un comando solo los lunes a las 8:00 AM:
1
0 8 * * 1 /home/usuario/limpieza.sh
- Ejecutar en días específicos (15 de enero a las 12:00 PM):
1
0 12 15 1 * /home/usuario/facturacion.sh
Gestión de crontab
Comandos básicos:
- Editar las tareas del usuario actual:
1
crontab -e - Listar las tareas programadas:
1
crontab -l - Eliminar todas las tareas del usuario actual:
1
crontab -r - Editar las tareas de otro usuario (requiere permisos root):
1
sudo crontab -u usuario -e
Especificadores especiales en crontab
En lugar de usar asteriscos y números, puedes emplear los siguientes especificadores:
@reboot: Ejecuta el comando una vez al reiniciar el sistema.@hourly: Ejecuta el comando cada hora.@daily: Ejecuta el comando una vez al día (a las 12:00 AM).@weekly: Ejecuta el comando una vez a la semana (el domingo a las 12:00 AM).@monthly: Ejecuta el comando una vez al mes (el primer día a las 12:00 AM).@yearlyo@annually: Ejecuta el comando una vez al año (el 1 de enero a las 12:00 AM).
Ejemplo:
1
@daily /home/usuario/limpiar_logs.sh
Redirección de salida en crontab
Cuando una tarea se ejecuta, su salida (si la tiene) se envía al correo del usuario. Puedes redirigir esta salida para evitar recibir correos o para guardar logs:
- Ignorar la salida:
1
*/10 * * * * /home/usuario/actualizar.sh > /dev/null 2>&1
- Guardar en un archivo de log:
1
0 0 * * * /home/usuario/copia.sh >> /var/log/copia.log 2>&1
Comprobación de logs de cron
Los registros de las tareas programadas se almacenan en el archivo de logs del sistema. Puedes verificar si las tareas se ejecutaron correctamente:
- En Ubuntu/Debian:
1
sudo grep CRON /var/log/syslog - En CentOS/Red Hat:
1
sudo grep CRON /var/log/cron
Errores comunes en crontab
- Falta de PATH completo:
- Solución: Usa rutas absolutas para comandos y archivos.
1
0 2 * * * /usr/bin/python3 /home/usuario/script.py
- Solución: Usa rutas absolutas para comandos y archivos.
- Permisos incorrectos:
- Asegúrate de que el script tenga permisos de ejecución (
chmod +x script.sh).
- Asegúrate de que el script tenga permisos de ejecución (
- Variables de entorno faltantes:
- Puedes configurar variables de entorno en la parte superior del archivo
crontab.1
PATH=/usr/local/bin:/usr/bin:/bin
- Puedes configurar variables de entorno en la parte superior del archivo
Ejercicio práctico
-
Programa un script para ejecutar un respaldo todos los días a las 2:30 AM y guardar un registro en
/var/log/respaldo.log.Solución:
1
30 2 * * * /home/usuario/respaldo.sh >> /var/log/respaldo.log 2>&1
Con esta guía puedes aprovechar todo el potencial de crontab para automatizar tareas en tu sistema. 🚀
