Conectarse a un servidor Linux remoto mediante SSH

LinuxBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderás las habilidades esenciales para conectarte y administrar un servidor Linux remoto utilizando el protocolo Secure Shell (SSH). Comenzarás configurando el entorno remoto, lo que implica instalar y configurar el paquete del servidor OpenSSH. Una vez que el servidor esté listo para aceptar conexiones, aprenderás a obtener su dirección IP, un paso crucial para establecer una conexión desde una máquina cliente.

Una vez configurado el servidor, practicarás dos métodos principales de interacción remota mediante SSH. Primero, establecerás una sesión de shell totalmente interactiva, lo que te dará acceso completo a la línea de comandos de la máquina remota. En segundo lugar, aprenderás a ejecutar un comando específico en el servidor remoto sin iniciar una sesión interactiva completa, una técnica altamente efectiva para tareas de scripting y automatización.

Instalar y configurar el servidor OpenSSH

En este paso, instalarás el paquete del servidor OpenSSH, que permite que tu sistema acepte conexiones SSH entrantes. SSH, o Secure Shell, es un protocolo de red criptográfico para operar servicios de red de forma segura a través de una red no segura. El paquete openssh-server contiene los componentes principales para alojar un servidor SSH.

Primero, es una buena práctica actualizar la lista de paquetes de tu sistema para asegurarte de obtener la versión más reciente del software. El usuario labex tiene privilegios de sudo, los cuales son necesarios para la gestión de paquetes a nivel de sistema.

Ejecuta el siguiente comando para actualizar el índice de paquetes:

sudo apt-get update

Verás una salida similar a la siguiente, que indica que las listas de paquetes se están obteniendo de los repositorios:

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:3 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
...
Fetched 1,845 kB in 2s (1,040 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up-to-date.

Ahora, puedes instalar el paquete openssh-server usando apt-get. La bandera -y responde automáticamente "sí" a cualquier solicitud, haciendo que la instalación no sea interactiva.

sudo apt-get install -y openssh-server

En algunos entornos de LabEx, Ubuntu puede mostrar un cuadro de diálogo de reinicio de servicio durante la instalación. Si eso sucede, no reinicies vncserver, ya que hacerlo puede desconectar el escritorio del navegador y dejar la página en gris. Utiliza una de estas opciones seguras en su lugar:

  • Presiona Tab para seleccionar <Cancel>, luego presiona Enter.
  • O presiona Space para desmarcar la selección de vncserver, luego selecciona <Ok>.

Si el escritorio del navegador aún se vuelve gris, actualiza la página de LabEx para volver a conectarte a la sesión y continuar con el laboratorio.

Una vez que el comando finalice, deberías ver una salida confirmando la instalación y configuración de openssh-server y sus dependencias:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  ncurses-term openssh-sftp-server ssh-import-id
...
Setting up openssh-server (1:8.9p1-3ubuntu0.1) ...
...
Creating SSH2 ECDSA key; this may take some time ...
Creating SSH2 ED25519 key; this may take some time ...
...

El servicio del servidor OpenSSH, llamado sshd, debería iniciarse automáticamente después de la instalación. Puedes verificar su estado usando el comando systemctl, que es una herramienta para controlar el gestor de servicios y sistemas systemd.

Verifica el estado del servicio SSH:

sudo systemctl status ssh

La salida debería mostrar que el servicio está active (running). Esto confirma que el servidor SSH está listo para aceptar conexiones.

● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-10-30 10:30:00 UTC; 5s ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 1234 (sshd)
      Tasks: 1 (limit: 4617)
     Memory: 1.2M
        CPU: 8ms
     CGroup: /system.slice/ssh.service
             └─1234 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

...

Presiona la tecla q en tu teclado para salir de la vista de estado y regresar al símbolo del sistema.

¡Excelente! El servidor OpenSSH ya está instalado y ejecutándose en tu sistema. En el siguiente paso, crearás un nuevo usuario para la demostración de SSH, y luego aprenderás a encontrar la dirección IP del servidor y a conectarte a él.

Crear un nuevo usuario para la demostración de SSH

En este paso, crearás una nueva cuenta de usuario que se utilizará para las conexiones SSH. Dado que el usuario predeterminado labex tiene privilegios de sudo pero no conocemos su contraseña para la autenticación SSH, necesitamos crear un usuario dedicado con una contraseña conocida para esta demostración.

Primero, crea un nuevo usuario llamado sshuser usando el comando adduser. Este comando creará la cuenta de usuario y te pedirá que configures una contraseña y otros detalles.

sudo adduser sshuser

Se te pedirá que ingreses y confirmes una contraseña para el nuevo usuario. Para este laboratorio, usa password123 como contraseña. También se te pedirá información adicional como nombre completo, número de habitación, etc., pero puedes presionar Enter para omitir estos campos.

Adding user `sshuser' ...
Adding new group `sshuser' (1001) ...
Adding new user `sshuser' (1001) with group `sshuser' ...
Creating home directory `/home/sshuser' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for sshuser
Enter the new value, or press ENTER for the default
 Full Name []:
 Room Number []:
 Work Phone []:
 Home Phone []:
 Other []:
Is the information correct? [Y/n] Y

Ahora verifica que el usuario se haya creado correctamente comprobando el archivo /etc/passwd:

grep sshuser /etc/passwd

Deberías ver una salida similar a:

sshuser:x:1000:1000:,,,:/home/sshuser:/bin/bash

Esto confirma que la cuenta sshuser se ha creado con un directorio de inicio en /home/sshuser y utiliza el shell bash. Los números exactos de UID (ID de usuario) y GID (ID de grupo) pueden variar dependiendo de los usuarios existentes en el sistema.

También puedes verificar que el directorio de inicio del usuario se haya creado. Ten en cuenta que necesitas privilegios de sudo para acceder al directorio de inicio de otro usuario:

sudo ls -la /home/sshuser

La salida debería mostrar el contenido del directorio de inicio del usuario:

total 20
drwxr-x--- 2 sshuser sshuser 4096 Jun 30 09:26 .
drwxr-xr-x 5 root    root    4096 Jun 30 09:26 ..
-rw-r--r-- 1 sshuser sshuser  220 Jun 30 09:26 .bash_logout
-rw-r--r-- 1 sshuser sshuser 3771 Jun 30 09:26 .bashrc
-rw-r--r-- 1 sshuser sshuser  807 Jun 30 09:26 .profile

Observa que el directorio de inicio tiene permisos restringidos (drwxr-x---), lo que significa que solo el propietario (sshuser) y los usuarios en el mismo grupo pueden acceder a él. Es por esto que se requiere sudo para listar su contenido.

¡Perfecto! Ahora tienes una cuenta de usuario sshuser con la contraseña password123 que puedes usar para las conexiones SSH en los siguientes pasos.

Obtener la dirección IP del servidor SSH

En este paso, aprenderás a encontrar la dirección IP de tu servidor SSH. Una dirección IP es una etiqueta numérica única asignada a cada dispositivo conectado a una red informática que utiliza el Protocolo de Internet para la comunicación. Para establecer una conexión SSH, la máquina cliente necesita conocer la dirección IP del servidor al que desea conectarse.

En un escenario típico con dos máquinas separadas, usarías esta dirección IP para conectarte desde el cliente. Sin embargo, para este laboratorio, estás trabajando en una única máquina virtual que actuará tanto como servidor SSH como cliente SSH. Para conectarte al servidor SSH que se ejecuta en tu propia máquina, puedes usar una dirección IP especial, 127.0.0.1, también conocida como localhost. Esta dirección siempre se refiere a la máquina local misma.

Aun así, es una habilidad esencial saber cómo encontrar la dirección IP de red de tu máquina. El comando moderno para esto en Linux es ip.

Para mostrar información sobre todas las interfaces de red en tu sistema, usa el comando ip addr:

ip addr

La salida listará todas las interfaces de red, como lo (la interfaz de bucle local o loopback), eth0 (la interfaz Ethernet principal) y posiblemente docker0 (interfaz de puente de Docker). Estás buscando la entrada inet bajo tu interfaz de red principal, que normalmente es eth0.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:01:82:ae brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.114/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159625sec preferred_lft 1892159625sec
    inet6 fe80::216:3eff:fe01:82ae/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:86:fe:f0:88 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

En el ejemplo anterior, la dirección IP principal para la interfaz eth0 es 172.16.50.114. También puedes ver una interfaz docker0 si Docker está instalado en el sistema.

Un comando más sencillo para mostrar solo las direcciones IP de la máquina es hostname -I.

hostname -I

Este comando imprimirá una lista separada por espacios de las direcciones IP de la máquina.

172.16.50.114 172.17.0.1

La salida muestra múltiples direcciones IP: la IP de la interfaz de red principal (172.16.50.114) y la IP del puente de Docker (172.17.0.1).

Ahora ya sabes cómo encontrar la dirección IP de tu máquina. En el siguiente paso, usarás la dirección localhost (127.0.0.1) para conectarte al servidor SSH que se ejecuta en esta misma máquina.

Establecer una sesión SSH interactiva con el servidor remoto

En este paso, usarás el cliente ssh para establecer una sesión interactiva con el servidor OpenSSH que configuraste. Una sesión interactiva te proporciona un símbolo del sistema en el servidor remoto, lo que te permite ejecutar comandos como si estuvieras conectado físicamente a él.

Para conectarte, usas el comando ssh seguido del nombre de usuario y la dirección del servidor, en el formato ssh <usuario>@<nombre_de_host_o_ip>. Dado que te estás conectando al servidor que se ejecuta en tu propia máquina (localhost) como el usuario sshuser, usarás la dirección IP 127.0.0.1.

Abre una terminal y ejecuta el siguiente comando:

ssh sshuser@127.0.0.1

La primera vez que te conectes a cualquier servidor SSH nuevo, tu cliente SSH mostrará la huella digital (fingerprint) de la clave pública del servidor y te pedirá que confirmes su autenticidad. Esta es una medida de seguridad para evitar ataques de "hombre en el medio" (man-in-the-middle). Debes escribir yes y presionar Enter para continuar.

The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '127.0.0.1' (ED25519) to the list of known hosts.

Después de confirmar la clave del host, se te pedirá la contraseña para el usuario sshuser en el servidor remoto. Ingresa la contraseña password123 que configuraste al crear el usuario.

sshuser@127.0.0.1's password:

Una vez que ingreses la contraseña correcta, habrás iniciado sesión y se te presentará el mensaje de bienvenida del servidor y un nuevo símbolo del sistema. Observa cómo el símbolo del sistema puede cambiar para indicar que estás en el host remoto.

Welcome to Ubuntu 22.04.x LTS (GNU/Linux x.x.x-xx-generic x86_64)

* Documentation:  https://help.ubuntu.com
* Management:     https://landscape.canonical.com
* Support:        https://ubuntu.com/advantage

sshuser@ubuntu:~$

Para confirmar que estás en una sesión remota, puedes ejecutar un comando como pwd para imprimir el directorio de trabajo actual.

pwd

La salida mostrará tu directorio de inicio en la máquina remota.

/home/sshuser

Para cerrar la sesión SSH interactiva y regresar al shell de tu máquina local, simplemente escribe exit y presiona Enter.

exit

Verás un mensaje confirmando que la conexión se ha cerrado y tu símbolo del sistema original volverá a aparecer.

logout
Connection to 127.0.0.1 closed.

Ahora has establecido y cerrado con éxito una sesión SSH interactiva.

Ejecutar un comando único de forma remota mediante SSH

En este paso, aprenderás a ejecutar un solo comando en un servidor remoto sin iniciar una sesión interactiva completa. Esta es una característica poderosa de SSH, ampliamente utilizada en scripts y para la automatización, ya que te permite recuperar información rápidamente o realizar una tarea en una máquina remota y luego desconectarte inmediatamente.

La sintaxis para esto es simplemente añadir el comando que deseas ejecutar al final de tu cadena de conexión ssh habitual. Es una buena práctica encerrar el comando remoto entre comillas para evitar que el shell local lo interprete.

Probemos ejecutando el comando hostname en el servidor remoto. Este comando imprime el nombre de host del sistema.

ssh sshuser@127.0.0.1 "hostname"

Se te pedirá la contraseña (password123) tal como antes. Después de ingresarla, el comando hostname se ejecutará en el servidor remoto, su salida se imprimirá en tu terminal y la conexión SSH se cerrará automáticamente.

sshuser@127.0.0.1's password:
iZrj91w6gb8osv0mra83hdZ

Observa que regresas inmediatamente a tu símbolo del sistema local sin necesidad de escribir exit.

También puedes ejecutar comandos más complejos. Por ejemplo, listemos el contenido del directorio raíz (/) en el servidor remoto usando ls -l /.

ssh sshuser@127.0.0.1 "ls -l /"

Nuevamente, ingresa la contraseña password123 cuando se te solicite. La salida será una lista detallada de los archivos y directorios en el sistema de archivos raíz del servidor remoto.

sshuser@127.0.0.1's password:
total 72
lrwxrwxrwx   1 root root     7 Apr 21  2022 bin -> usr/bin
drwxr-xr-x   4 root root  4096 May 30  2023 boot
drwxr-xr-x  19 root root  4080 Jun 30 09:23 dev
drwxr-xr-x 137 root root 12288 Jun 30 09:26 etc
drwxr-xr-x   5 root root  4096 Jun 30 09:26 home
lrwxrwxrwx   1 root root     7 Apr 21  2022 lib -> usr/lib
lrwxrwxrwx   1 root root     9 Apr 21  2022 lib32 -> usr/lib32
lrwxrwxrwx   1 root root     9 Apr 21  2022 lib64 -> usr/lib64
lrwxrwxrwx   1 root root    10 Apr 21  2022 libx32 -> usr/libx32
drwx------   2 root root 16384 Dec 28  2022 lost+found
drwxr-xr-x   2 root root  4096 Apr 21  2022 media
drwxr-xr-x   2 root root  4096 Apr 21  2022 mnt
drwxr-xr-x   5 root root  4096 Feb 27  2023 opt
dr-xr-xr-x 231 root root     0 Jun 30 09:22 proc
drwx------   8 root root  4096 Jun 30 09:26 root
drwxr-xr-x  35 root root  1060 Jun 30 09:30 run
lrwxrwxrwx   1 root root     8 Apr 21  2022 sbin -> usr/sbin
drwxr-xr-x  10 root root  4096 Feb 18  2023 snap
drwxr-xr-x   2 root root  4096 Apr 21  2022 srv
dr-xr-xr-x  13 root root     0 Jun 30 09:22 sys
drwxrwxrwt  18 root root  4096 Jun 30 09:30 tmp
drwxr-xr-x  14 root root  4096 Apr 21  2022 usr
drwxr-xr-x  13 root root  4096 Apr 21  2022 var

Este método es increíblemente eficiente para administrar múltiples servidores o para integrar operaciones remotas en tus scripts de shell locales. Ahora has aprendido las dos formas principales de usar SSH: para sesiones interactivas y para la ejecución de comandos individuales.

Resumen

En este laboratorio, aprendiste los pasos fundamentales para habilitar y utilizar Secure Shell (SSH) para la administración remota de servidores. Comenzaste preparando el servidor Linux remoto, lo que implicó actualizar el índice del repositorio de paquetes usando sudo apt-get update y luego instalar el paquete openssh-server. Este proceso configuró el sistema para aceptar de forma segura las conexiones SSH entrantes, iniciando automáticamente el servicio sshd.

A continuación, creaste una cuenta de usuario dedicada (sshuser) con una contraseña conocida (password123) para fines de autenticación SSH, ya que el usuario predeterminado labex tiene privilegios de sudo pero carece de una contraseña para las conexiones SSH. Verificaste la creación del usuario y confirmaste que el directorio de inicio se estableció correctamente.

Con el servidor y la cuenta de usuario listos, aprendiste a obtener la dirección IP del servidor, una pieza de información crucial para que cualquier cliente inicie una conexión. Luego practicaste las dos formas principales de usar SSH: establecer una sesión de línea de comandos completa e interactiva para trabajar directamente en el servidor remoto, y ejecutar un comando único y no interactivo de forma remota, lo cual es altamente eficiente para tareas de scripting y automatización.