¿Te pierdes entre tantos temas? 📚✨ Descubre todo lo que ofrece este blog en un solo vistazo [👉 Ver índice completo]
El servidor de shell seguro o SSH nos va a permitir comunicar dos ordenadores (cliente y host) de forma segura ya que desde el primer momento las comunicaciones viajan encriptadas. Primero, el servicio SSH comprueba que el servidor remoto es quien dice ser (para prevenir los ataques de man in the middle) y segundo, como ya hemos dicho, encripta las comunicaciones entre el host local y el remoto.
SSH consta de dos partes. Un servidor SSH funcionando en el host remoto, escuchando conexiones entrantes en el puerto 22, y un cliente SSH en el sistema local para comunicarnos con el servidor remoto.
Instalación del cliente y del servidor SSH.
Para instalar el servidor y el cliente de SSH debemos ejecutar el comando:
sudo apt-get install ssh
Los archivos de configuración se encuentran en:
- Para el cliente en /etc/ssh/ssh_config
- Para el servidor en /etc/ssh/sshd_config. (el servicio funciona sin tener que modificar nada de este fichero, la mayoria de las líneas están comentadas)
Consejo: si no tienes un servidor remoto al que conectarte pero quieres probar estos ejemplos, asegúrate de que este paquete este instalado en tu sistema y usa localhost como nombre del host remoto.
Arranque y parada manual del servidor SSH
El servidor SSh dispone de un script de arranque y parada que está en la carpeta /etc/init.d
Los comandos en función de lo que queramos hacer son:
- sudo service ssh start //para arrancar manualmente el servicio
- sudo servide ssh stop //para parar manualmente el servicio
- sudo service ssh restart // reiniciar el servidor ssh
¡¡RECUERDA!! Cada vez que se modifica un fichero de configuración del servicio hay que reinicializar el servicio.
Conexión al servidor mediante SSH.
Para conectar desde un PC cliente al servidor mediante ssh, debemos ejecutar el comando ssh seguido del nombre ó dirección IP del servidor. La conexión se realizará con el
mismo nombre de usuario que estemos utilizando en el PC cliente. Ejemplo, supongamos que desde mi pc windows quiero conectarme a un pc cuya ip es 192.168.1.119 y a una sesión del usuario "alumno". Aunque se puede hacer desde el Powershell de Windows también puedes utilizar un programa muy popular para realizar conexiones ssh que es
puTTY. (El mismo comando se utiliza en Linux)
La primera vez que se intenta la conexión, se muestra un mensaje indicando que la autenticidad del
host remoto no puede ser establecida. Es porque el programa cliente nunca ha visto al host remoto
antes. Para aceptar las credenciales del host remoto, introduce “yes” cuando te pregunte. Una vez
que se establece la conexión, el usuario/a es preguntado/a por su contraseña.
UN MOMENTO, me he dado cuenta que mi usuario en Windows no es el mismo que el usuario a cuya sesión quiero entrar en el host. Así que tengo que repetir el proceso pero indicando que usuario se va a conectar en la máquina y en que host o ip.
Como ves es posible conectarse a sistemas remotos usando un nombre de usuario diferente al del host cliente. Solo tienes que usar:
ssh nombre_usuario@ip_servidor
La sesión en el shell remoto continua hasta que introduzcas el comando exit en el promt del shell remoto, cerrando así la conexión remota.
Restringir el acceso SSH
Podemos restringir el acceso al servidor por usuarios/grupos o por máquinas.
- Por usuarios/grupos. Para evitar que todos los usuarios (o grupos) de la máquina servidor estén acesibles por SSH tendremos que editar como root el archivo /etc/ssh/sshd_config (en el servidor) y añadir uno de estos dos parámetros:
a) el parámetros AllowUsers (o AllowGroups para permitir por grupos) y a continuación los usuarios que deseamos que se puedan conectar remotamente via SSH. Por ejemplo en mi equipo remoto voy a permitir solo a los usuarios "alumno" y "pedrín" conectarse por ssh.
b) O el parámetro DenyUsers (o el parámetro DenyGroups para los grupos) y a continuación los usuarios o grupos que NO permitimos su conexión. Por ejemplo:
DenyUsers alvaro manuela
- Por equipo. También podemos restringir el acceso dependiendo de las IP de los equipos que intentan acceder a nuestro servidor. Si queremos solo permitir el acceso a uno o varios equipos(en el servidor) tendremos modificar los siguientes ficheros:
➢/etc/hosts.allow donde, permitimos el acceso a los equipos por IP, de la siguiente manera por ejemplo:
sshd: 180.180.1.0/15 190.168.1.119
➢/etc/hosts.deny donde denegamos acceso a todos los equipos
sshd: ALL
Si queremos denegar el acceso a algún equipo basta con añadir la línea correspondiente al fichero /etc/hosts.deny, por ejemplo
sshd:180.180.1.24 180.180.1.67
Para saber que usuarios están conectados al servidor podemos usar en este el comando "who"
Como ves tengo al usuario "alumno" conectado directamente en el servidor en una sesión de usuario, y también al usuario alumno conectado desde otro ordenador (ip 192.168.1.74)
Servicios adicionales.
El paquete SSH no solo nos proporciona conexión remota, sino que proporciona otros servicios como:
- Ejecutar un comando en el servidor sin entrar en el prompt (en la terminal) de este.
El comando ssh se puede utilizar para ejecutar un comando en una máquina remota sin acceder al indicador de comandos (prompt). La sintaxis es:
ssh IP comando
Por ejemplo, si quieres entrar en el servidor como "alumno" y se quiere ejecutar el comando ls –al en el directorio de entrada de "alumno" en la máquina 192.168.1.119(servidor), hay que escribir el siguiente:
Es posible usar esta técnica de muchas formas interesantes, como en este ejemplo en el que realizamos un ls en el sistema remoto y redirigimos la salida a un archivos en el sistema local:
Fíjate que se usan comillas simples en el comando anterior. Esto es porque no queremos que se produzca la expansión del nombre en la máquina local; en su lugar, queremos que se realice en el sistema remoto. Igualmente, si hubiéramos querido redirigir la salida a un archivo de la máquina remota, podríamos haber colocado el operador de redirección y el nombre de archivo dentro de las comillas simples:
ssh alumno@192.168.1.119 'ls -al > listado.txt'
Copia remota de archivos.
1) También disponemos de el comando scp que nos permite copiar, haciendo uso del túnel encriptado de SSH, archivos desde y hacia el servidor remoto desde el cliente.
Para copiar un archivo desde nuestro PC (cliente) al servidor (la carpeta de destino debe existir en el servidor):
scp nombreDelFichero usuario@IP:donde_se_quiere_copiar
Para copiar un archivo desde el servidor a nuestro PC:
scp usuario@IP:nombreDelFichero donsequierecopiar
El punto indica que el archivo se copie al directorio actual.
2) El segundo programa para copiado de archivos SSH es sftp, el cual, como su nombre indica, es
un sustituto seguro del programa ftp. En lugar de transmitir todo en texto plano, como hace el programa ftp, usa un túnel SSH encriptado.
sftp tiene una ventaja importante sobre el ftp convencional ya que no requiere un servidor FTP
corriendo en el host remoto. Sólo requiere el servidor SSH. Esto significa que cualquier máquina
remota que pueda conectar con el cliente SSH puede también ser usada como un servidor como-
FTP. Aquí hay una sesión de ejemplo:
Consejo: El protocolo SFTP es soportado por la mayoría de los gestores gráficos de archivos que
encontramos en las distribuciones Linux. Tanto si usamos Nautilus (GNOME) como Konqueror
(KDE) o thunar, podemos introducir una URI comenzando por sftp:// en la barra de direcciones y operar con archivos almacenados en un sistema remoto que esté ejecutando un servidor SSH.
Em mi caso por ejemplo sftp://alumno@192.168.1.119
Configurar el cliente (en Linux) para que el servidor no nos pida contraseña al conectar.
Puedes configurar una autenticación con claves SSH para evitar tener que ingresar la contraseña cada vez. Aquí te explico cómo hacerlo de forma sencilla y segura:
Generar un par de claves SSH (si no tienes una):
En tu máquina local, abre una terminal y ejecuta:
ssh-keygen -t rsa -b 4096
Presiona Enter para aceptar la ubicación predeterminada (~/.ssh/id_rsa) y, si quieres, configura una contraseña para la clave (o déjala vacía para no usar una).
Copiar la clave pública al servidor:
Usa el comando ssh-copy-id para enviar tu clave pública al servidor:
ssh-copy-id usuario@direccion_del_servidor
Te pedirá la contraseña del usuario del servidor una última vez. Esto copiará tu clave pública al archivo ~/.ssh/authorized_keys en el servidor.
Conectarte sin contraseña:
Ahora, al hacer ssh usuario@direccion_del_servidor, deberías conectarte directamente sin que te pida la contraseña.
(Opcional) Verificar y ajustar permisos:
Asegúrate de que los permisos de los archivos en el servidor sean correctos:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Esto garantiza que solo el usuario adecuado pueda leer los archivos.
Sincronizando Archivos y Directorios.
Una estrategia eficiente para respaldar sistemas es sincronizar directorios locales con otros ubicados en dispositivos de almacenamiento extraíbles o servidores remotos. Por ejemplo, puedes tener una versión local de un sitio web en desarrollo y sincronizarla periódicamente con la versión en producción en un servidor remoto.
En sistemas Unix/Linux, la herramienta ideal para esta tarea es rsync. Este programa permite sincronizar directorios tanto locales como remotos utilizando el protocolo remote-update, que detecta rápidamente las diferencias entre archivos y solo copia lo necesario.
Uso básico de rsync:
rsync [opciones] origen destino
donde origen y destino puede ser uno de los siguientes:
- Un archivo o directorio local.
- Un archivo o directorio remoto [usuario@]host:ruta
- Un servidor rsync remoto especificado con una URI de rsync://[usuario@]host[:puerto]/ruta
Para empezar vamos a ver como sincronizar un directorio local (en mi caso Curso) que nos interese con otro directorio local también (Backup en mi caso).
Mientras el comando se ejecuta, veremos una lista de los archivos y directorios que se están copiando. Al final vemos el mensaje que os he puesto en la imagen superior, indicando la cantidad de copia tramitada. Si ejecutamos, de nuevo el comando podemos ver lo siguiente:
En esta segunda ejecución no hay listado de archivos. Esto es porque rsync detectó que no había ningún archivo o directorio nuevo en el directorio de origen y por tanto no necesitaba copiar nada. Si, por ejemplo en el directorio de origen, añadimos un nuevo archivo y volvemos a ejecutar el comando:
vemos que rsync detectó el cambio y copió solo el archivo actualizado.
Usando rsync a través de la red.
Podemos usar rsync para realizar copias de seguridad a través de la red. La copia remota puede hacerse de la siguiente forma.
Con otro sistema que tenga rsync instalado, a través de SSH. Imagina que en tu red local tienes un pc con mucho espacio en el disco duro y quieres realizar una copia de seguridad usando el disco de este pc. Asumiendo que el directorio de este pc tiene un directorio llamado Backup voy a realizar una copia de mi carpeta local Curso a este Pc remoto.
$ rsync -av --delete -rsh=ssh ./Curso alumno@192.168.1.119:/home/alumno/Backup
Las opciones que hemos utilizado son:
-a: Modo archivo. Es una combinación de varias opciones (-rlptgoD) que aseguran que los archivos se transfieran de forma recursiva, se conserven los enlaces simbólicos, se mantengan los permisos, se preserven las fechas de modificación, se conserven los grupos y propietarios, y se recreen los archivos de dispositivo y especiales.
-v: Salida detallada. Esto te mostrará los archivos que se están transfiriendo y otra información.
--delete: Esta opción le dice a rsync que elimine los archivos en el directorio de destino que no existen en el directorio de origen. Úsala con precaución, ya que puede llevar a la pérdida de datos si no se usa correctamente.
--rsh=ssh: Esto especifica que rsync debe usar ssh como su shell remoto para la comunicación entre los dos equipos. Esta es la forma estándar y más segura de usar rsync a través de una red.
No hay comentarios:
Publicar un comentario