domingo, 11 de marzo de 2018

Acceso remoto a otro PC o servidor con el protocolo SSH


Hola amigos, os traigo este artículo para quien quiera y no sepa aún conectarse remotamente desde un ordenador con el Sistema Operativo GNU/Linux a otro ordenador o servidor que tenga instalado también el mismo Sistema Operativo.
La distribución que voy a utilizar es Ubuntu 16.04 LTS, pero es exactamente igual para todas las distribuciones Linux.


El protocolo SSH es el que nos va a permitir realizar la conexión entre los dos ordenadores.
SSH (Secure SHell) traducido del inglés significa intérprete de órdenes seguro, es el nombre de un protocolo y del programa que lo implementa que facilita las comunicaciones seguras entre dos sistemas usando una arquitectura cliente/servidor y que permite a los usuarios conectarse a un host remotamente.
Permite manejar por completo el ordenador o servidor remoto mediante el intérprete de comandos, y también puede ejecutar programas gráficos si tenemos ejecutando un Servidor X (por ejemplo en sistemas Unix y Windows). 
A diferencia de otros protocolos de comunicación remota tales como FTP o Telnet, SSH encripta la sesión de conexión, haciendo imposible a fecha de este artículo, que alguien pueda obtener el traspaso de información entre ambas computadoras.

La distribución Ubuntu ya lleva instalado el programa SSH cliente, pero no el programa servidor.
Deberéis instalar el programa SSH servidor en el equipo remoto al cual os queréis conectar y controlar. En el equipo cliente no hace falta instalarlo.
Para instalar el programa SSH servidor deberemos utilizar el gestor de paquetes Synaptic y buscar openssh-server e instalar, o utilizar el gestor APT mediante consola, escribiendo la siguiente instrucción:

$ sudo apt-get install openssh-server

Se instalarán varios paquetes de poco tamaño. Aquí una imagen de la instalación del programa servidor SSH, instalado en el ordenador que controlaré remotamente:


Si queréis comprobar que tenéis instalado el programa SSH cliente (como digo lo está), buscad en el gestor Synaptic el paquete openssh-client, o en el gestor APT escribid el siguiente comando en el terminal:

$ sudo apt-get install openssh-client

Y os contestará que ya está instalado en su última versión o por el contrario os dirá los paquetes a instalar. Una imagen que demuestra que en mi ordenador remoto está instalado:


La imagen  que muestra que el programa SSH cliente está instalado en mi ordenador cliente:


Una vez ya instalado el programa SSH servidor en el ordenador al cual accederemos, y el programa SSH cliente en el ordenador desde el cual lo controlará, ya podemos realizar una conexión remota.
Yo he hecho la prueba entre dos PCs reales y entre uno real y otro virtual, mediante el programa Virtual Box.

El PC desde el que realizaremos la conexión se le llama cliente y el ordenador al cual nos conectaremos o que controlaremos se le llama servidor.

Deberemos diferenciar dos tipos de conexiones:
  1. Conexión entre dos ordenadores que habitan en una misma Red de Área Local (LAN).
  2. Conexión entre dos ordenadores que se encuentran en distintas redes privadas, o sea, con diferentes puertas de enlace o routers.

Ejemplo de conexión 1 (misma red de área local LAN):

Escribiremos en la consola de los dos ordenadores, el cliente que es el que llevaremos y el servidor que será el que controlaremos, el comando:

$ ifconfig

Con este comando sabremos que IP le ha dado nuestro router a cada uno de los dos ordenadores mediante el protocolo DHCP.

La IP de mi ordenador servidor es 192.168.1.36, como se aprecia en la imagen siguiente:


La IP de mi ordenador cliente es 192.168.1.38, como se puede ver en la siguiente imagen:


Una vez sabida la IP, usaremos la siguiente instrucción para conectarnos con el ordenador servidor y en concreto con nuestro usuario "ubuntico" creado en el citado ordenador:

$ ssh ubuntico@192.168.1.36


Importante lo que viene a continuación:

Inmediatamente después os saldrá un texto diciendo que no puede establecer una autenticidad con el ordenador host.
Básicamente os está diciendo que él no sabe a que ordenador os estáis conectando, espera que vosotros lo sepáis, que lo conozcáis y que estéis seguros.

A continuación os muestra una llave ECDSA fingerprint muy larga. La cuál se encuentra almacenada en un archivo en el ordenador servidor remoto.
Se encuentra en este archivo en el directorio /etc/ssh/ssh_host_ecdsa_key.pub
Para poderla visionar deberéis escribir el siguiente comando en el ordenador servidor remoto:

$ ssh-keygen -l -f ssh_host_ecdsa_key.pub

Os deberá de mostrar la misma llave fingerprint.


Esta llave solo se muestra en la primera conexión entre dos equipos, no se os mostrará mas, es importante que os la guardéis por seguridad, para comprobar si es la misma en el caso de que os salga otra vez en una futura conexión entre los dos mismos equipos y ver que es la misma, para estar seguros de que no estáis recibiendo un ataque del tipo "man in the middle" y se os desvíe la comunicación hacia otro ordenador intermedio y puedan ver todos los datos de ida y venida entre los dos ordenadores

Si os encontráis con esta remota pero posible situación, y comprobáis que los key fingerprint no corresponden, no realicéis la conexión y poneros en contacto con vuestro proveedor de servicios de internet, ya que es posible que tengáis vuestro router intervenido por algún malote. Una imagen de advertencia del protocolo SSH en el caso que detecte diferentes key fingerprint para una misma dirección IP del ordenador servidor:


Pero no os asustéis, la encriptación SSH es segura, el fallo de seguridad puede suceder en los routers o switches públicos de acceso por mucha gente, pero en redes domésticas o de pequeñas empresas privadas esto no suele suceder, ya que en todo momento sabéis quien se conecta a vuestro router, y vosotros sabéis por donde navegáis por internet, a que si? Y si no entráis en servidores proxy públicos, ni en webs de dudosísima reputación, entonces este tipo de ataque no os debería de preocupar, porque no os sucederá.

La imagen anterior de advertencia está echa a drede por mi. Esto ha sucedido porque con anterioridad realicé una conexión SSH a otro ordenador remoto diferente pero con la misma IP 192.168.1.36. Entonces la key fingerprint quedó guardada en mi ordenador cliente asociada a la IP 192.168.1.36. Ahora me he vuelto a conectar a un nuevo ordenador servidor donde el router le ha vuelto a asignar la misma IP 192.168.1.36, se ha generado una nueva key fingerprint y mi ordenador cliente que tenía guardada la anterior key realizada con el otro ordenador servidor pero con la misma IP asignada, las ha cotejado y en efecto las ve diferentes y ya han saltado las alarmas de posible ataque "the man in the middle".

Para solucionar este pequeño mal entendido deberemos borrar la antigua key guardada en nuestro ordenador cliente ejecutando el siguiente comando pero dentro del directorio /home/belinux/.ssh/:

$ cd /home/belinux/.ssh/

$ ssh-keygen -f "/home/belinux/.ssh/known_hosts" -R 192.168.1.36

Una vez advertidos continuamos con la conexión. Después de mostraros la llave os preguntará si os queréis conectar, escribis "yes".


Y por último os pregunta la contraseña del usuario del ordenador servidor remoto para realizar la conexión.

 
Pues bien ya está, ya estáis dentro del otro ordenador, como podéis comprobar el prompt es el del usuario del ordenador remoto y el nombre del equipo es el remoto, ahora mediante los comandos en el terminal podréis actuar con el ordenador remotamente como si estuvierais delante de él.

Para cortar la conexión y salir escribiremos:

$ exit

Y habremos cerrado la conexión (túnel encriptado).


Os preguntaréis, como puedo ejecutar una aplicación con interfaz gráfica remotamente? A veces querremos visualizar un archivo que es una foto por ejemplo y necesitaremos una aplicación de visor de imagenes que es de interfaz gráfica.
Pues deberemos de iniciar una conexión SSH pero con esta variante:

$ ssh -X ubuntico@192.168.1.36


Ahora si ejecutamos el siguiente comando en el terminal:

$ eog /home/ubuntico/Imágenes/tux1.png

La aplicación Visor de imágenes de gnome para ejecutarla en el terminal obedece a este archivo ejecutable "eog" y viene de las iniciales (Eye Of Gnome) que es en realidad como se llama la aplicación.

Así que según el comando anterior pedimos que se ejecute la aplicación eog y que abra la imagen "tux1.png", que se encuentra en el subdirectorio "/Imágenes". Y veremos la imagen que a continuación os muestro:








Esto está muy bien, pero y si quiero copiar o mover archivos entre el ordenador cliente y el servidor? como lo hago? porque con la conexión SSH puedo copiar y mover archivos pero solo en el ordenador conectado o controlado remotamente, no fuera de él.

Si queremos copiar o subir un archivo de nuestro ordenador (cliente) a una carpeta del ordenador remoto (servidor), haremos lo siguiente:

$ scp /home/belinux/archivo.txt ubuntico@192.168.1.36:/home/ubuntico


En el caso anterior damos por hecho que el puerto de comunicaciones del servicio SSH es por defecto el Puerto 22. Mas abajo hablaremos de como cambiar el puerto de comunicaciones de SSH. Si ya hemos cambiado y asignado otro puerto, por ejemplo al puerto de comunicaciones 4560, la instrucción deberá ser la siguiente (la -P en mayúscula en el comando scp):

$ scp -P 4560 /home/belinux/archivo.txt ubuntico@192.168.1.36:/home/ubuntico

Si queremos copiar o bajar un archivo del ordenador remoto (servidor) a nuestro ordenador (cliente) en la carpeta Documentos por ejemplo (Puerto 22), hacemos lo siguiente:
$ scp ubuntico@192.168.1.36:/home/ubuntico/archivo.txt /home/belinux/Documentos

Lo mismo en otro puerto, por ejemplo el 3347:

$ scp -P 3347 ubuntico@192.168.1.36:/home/ubuntico/archivo.txt /home/belinux/Documentos

Si queremos copiar archivos de servidor a servidor, en el caso de que existan 2 ordenadores servidor y vuestro ordenador cliente, y no tengáis que hacer dos pasos: primero copiarlo del servidor1 a vuestro pc, y luego de vuestro pc al servidor2. Para ahorrarnos los dos pasos anteriores utilizaremos este comando en la terminal y copiaremos directamente del servidor1 al servidor2 sin pasar por vuestro pc cliente:

$ scp ubuntico@192.168.1.36:/home/ubuntico/archivo.txt
 usuario2@192.168.1.40:/home/usuario2/
También podemos copiar un directorio entero de mi pc cliente al pc servidor:

$ scp -r /home/belinux/carpeta ubuntico@192.168.1.36:/home/ubuntico

También podemos limitar el ancho de banda para no sobrecargar en demasía al servidor, escribiendo -l número de Kbps:

$ scp -l 300 ubuntico@192.168.1.36:/home/ubuntico/archivo.txt /home/belinux/Documentos

Además deciros que de cara a la seguridad de la conexión, SSH trabaja por defecto en el puerto 22 y eso lo sabe todo el mundo. Y cuando digo todo el mundo es todo el mundo y sobretodo los malotes.
Así que para tener mas seguridad deberíamos cambiar este puerto por otro que queramos y esté libre.
El número de puerto deberemos cambiarlo en el ordenador servidor, (me refiero al ordenador al cual nos conectaremos remotamente), no hace falta cambiarlo en el ordenador cliente (el ordenador desde el cual realizaremos la conexión remota). Pero es ideal cambiar el número de puerto en los dos PC ya que la conexión puede realizarse al revés. No es obligatorio introducir el mismo número de puerto, pero deberéis saberlo sinó no podréis realizar la conexión.
El rango de puertos va del 0 al 65535.
Los puertos del 0 al 1023 reciben el nombre de Puertos bien conocidos, y en sistemas Unix, para enlazar con ellos, es necesario tener acceso root como superusuario. Descartemos este rango.
Los puertos del 1024 al 49151 son los llamados Puertos registrados, y son los de libre utilización. Escogeremos de este rango.
Los puertos del 49152 al 65535 son puertos efímeros, de tipo temporal, y se utilizan sobre todo por los clientes al conectar con el servidor.

Nos queda claro el rango, yo por ejemplo escogeré el puerto 4132.
Deberemos irnos al archivo de configuración de SSH que es /etc/ssh/sshd_config lo abrimos con el editor nano con el comando sudo de superusuario para poder modificarlo:

$ sudo nano /etc/ssh/sshd_config

Buscaremos el texto Port 22, una vez encontrado lo comentaremos escribiendo delante el símbolo de la almohadilla # y en la linea siguiente añadiremos nuestro puerto escribiendo Port 4132, quedaría algo como así:

# What ports, IPs and protocols we listen for
#Port 22
Port 4132
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::


Continuamos mas abajo del documento nos encontraremos con esto:

# Authentication:
LoginGraceTime 120
PermitRootLogin prohibit-password
StrictModes yes

LoginGraceTime 120 es el tiempo de 120 segundos que tenemos para escribir la contraseña cuando vamos a acceder remotamente. Para vuestra seguridad cambiadla y ponedla de 30 o de 40 segundos, tiempo suficiente para que la podáis escribir, en cambio que nadie tenga tiempo de utilizar programas de fuerza bruta para sacar la contraseña.

PermitRootLogin prohibit-password eso deberéis tenerlo configurado así, es para que nadie pueda conectarse vía SSH remotamente como usuario root, ya que todo el mundo sabe que en todo sistema operativo Linux existe el usuario root. Si intentáis esto:

$ ssh -p 4132 root@192.168.1.36

No os dejará escribir la contraseña, queda denegado.


Una vez realizados estos cambios ya podéis guardar el archivo y salir del editor nano.
Ahora deberéis reiniciar el servicio ssh para que surtan efectos los cambios:

$ sudo /etc/init.d/ssh restart

Y la hora de la verdad, vamos a establecer una conexión ssh remota al usuario ubuntico desde un ordenador con el usuario belinux con la siguiente IP con el nuevo puerto (en el comando ssh la p debe ser en minúscula):

$ ssh -p 4132 ubuntico@192.168.1.36

Y esta es la imagen en nuestra terminal de comandos:


Ya estáis dentro del ordenador servidor. Ahora ya podéis trabajar en él remotamente como si estuvierais delante de él. Eso si solamente en modo monitor, a base de escribir comandos en el terminal.

Y ya como he dicho anteriormente, para cerrar la sesión SSH simplemente escribir en el terminal de comandos:

$ exit


Sin nada mas que añadir por ahora, espero os sirva de ayuda este artículo, y nos vemos en los próximos.
Saludos.

11 comentarios:

  1. La verdad muy buen artículo, sin embargo esperaba que describirse como establecer conexión entre dos ordenadores que se encuentren en distintas redes privadas, ¿Tienes otro artículo hablando de eso?

    ResponderEliminar
    Respuestas
    1. Gracias. No lo hice, pero puedo hacerlo. En este caso utilizaría un smartphone con S.O. Android, el cual accedería a internet a través de la operadora y por tanto fuera de mi red LAN, para comunicarme vía ssh con una computadora Linux conectada al router de mi red LAN. En su día quise hacerlo, pero se me olvidó.

      Eliminar
  2. Excelente muchas gracias. Esta muy bien explicado y se entiende bastante. Cuando publicarás el protocolo para conectarse remotamente entre distintas redes privadas? Saludos

    ResponderEliminar
  3. Excelente muchas gracias. Esta muy bien explicado y se entiende bastante. Cuando publicarás el protocolo para conectarse remotamente entre distintas redes privadas? Saludos

    ResponderEliminar
    Respuestas
    1. El protocolo es el mismo (ssh), salvo que la ip de la computadora a la que quieras acceder será la ip pública del router remoto. Y en dicho router remoto debe configurarse que la ip de tu router cliente vaya a la ip privada de la computadora a ser controlada. Como prueba está bien. Pero no es una solución definitiva, ya que las ip públicas de los routers son dinámicas y el ISP las cambia cada cierto tiempo. Así que se perderá la conexión una vez tu ISP te otorgue otra ip. Cuando tenga tiempo crearé un artículo de ejemplo básico, porque es fácil aunque parezca difícil. Saludos y sigue dándole a GNU/Linux

      Eliminar
  4. bro, gracias por el post, pero ando buscando es la conexión distante vía ssh, este es mi Facebook https://www.facebook.com/speed.robert por si haces un post explicando eso

    ResponderEliminar
  5. alguien sabe el comando para saber la ip del ordenador que controla? si por ejemplo me lo han apagado a modo de broma y quiero saber quien ha sido
    Gracias

    ResponderEliminar
  6. Carajo no logro establecer la conexion entre la VM y el ubuntu local >:(

    ResponderEliminar
    Respuestas
    1. En la configuración de red de tu VM utiliza la opción "adaptador puente" en vez de NAT. Y se le asignará un rango de IP privada acorde a tu red. Tal vez sea esa la solución a tu problema. Suerte.

      Eliminar

Gracias por participar en este blog.