Conexión a un servidor Linux remoto mediante SSH

LinuxBeginner
Practicar Ahora

Introducción

En esta práctica de laboratorio, adquirirás las habilidades esenciales para conectarte y gestionar un servidor Linux remoto utilizando el protocolo Secure Shell (SSH). Comenzarás preparando el entorno remoto, lo que implica la instalación y configuración del paquete del servidor OpenSSH. Una vez que te asegures de que el servidor esté listo para aceptar conexiones, aprenderás a obtener su dirección IP, un paso fundamental para establecer una conexión desde una máquina cliente.

Con el servidor configurado, practicarás los dos métodos principales de interacción remota a través de SSH. En primer lugar, establecerás una sesión de shell totalmente interactiva, lo que te otorgará acceso completo a la línea de comandos de la máquina remota. En segundo lugar, aprenderás a ejecutar un comando específico y único en el servidor remoto sin necesidad de iniciar una sesión interactiva completa, una técnica sumamente eficaz para tareas de automatización y creación de scripts.

Esta es una Práctica Guiada, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y ganar experiencia práctica. Los datos históricos muestran que esta es una práctica de nivel principiante con una tasa de finalización del 99%. Ha recibido una tasa de valoraciones positivas del 99% por parte de los alumnos.

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 sobre 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 descargando 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 sea no interactiva.

sudo apt-get install -y openssh-server

Una vez finalizado el comando, deberías ver una salida que confirma 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 tras la instalación. Puedes verificar su estado utilizando el comando systemctl, que es una herramienta para controlar el sistema systemd y el administrador de servicios.

Comprueba 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 volver al símbolo del sistema.

¡Excelente! El servidor OpenSSH ya está instalado y funcionando en tu sistema. En el siguiente paso, crearás un nuevo usuario para la demostración de SSH, 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 utilizando 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 introduzcas y confirmes una contraseña para el nuevo usuario. Para esta práctica, utiliza 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 consultando 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 ha sido creada con un directorio personal 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 se haya creado el directorio personal del usuario. Ten en cuenta que necesitas privilegios de sudo para acceder al directorio personal de otro usuario:

sudo ls -la /home/sshuser

La salida debería mostrar el contenido del directorio personal 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 personal tiene permisos restringidos (drwxr-x---), lo que significa que solo el propietario (sshuser) y los usuarios del mismo grupo pueden acceder a él. Por eso 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 esta práctica, estás trabajando en una única máquina virtual que actuará tanto de servidor SSH como de 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 propia máquina local.

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

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

ip addr

La salida listará todas las interfaces de red, como lo (la interfaz de loopback), eth0 (la interfaz Ethernet principal) y posiblemente docker0 (la interfaz de puente de Docker). Debes buscar la entrada inet bajo tu interfaz de red principal, que suele ser 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 podrías ver una interfaz docker0 si Docker está instalado en el sistema.

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

hostname -I

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

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, utilizará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, utilizará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 físicamente frente a él.

Para conectarte, utiliza el comando ssh seguido del nombre de usuario y la dirección del servidor, con el formato ssh <usuario>@<nombre_host_o_ip>. Dado que te vas a conectar al servidor que se ejecuta en tu propia máquina (localhost) como el usuario sshuser, utilizará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 de la clave pública del servidor y te pedirá que confirmes su autenticidad. Esta es una medida de seguridad para evitar ataques de tipo "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.

Tras confirmar la clave del host, se te pedirá la contraseña del usuario sshuser en el servidor remoto. Introduce la contraseña password123 que configuraste al crear el usuario.

sshuser@127.0.0.1's password:

Una vez que introduzcas 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 prompt puede cambiar para indicar que te encuentras 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 personal en la máquina remota.

/home/sshuser

Para cerrar la sesión interactiva de SSH y volver 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 volverá tu símbolo del sistema original.

logout
Connection to 127.0.0.1 closed.

Has establecido y cerrado con éxito una sesión interactiva de SSH.

Ejecutar un comando único de forma remota a través de SSH

En este paso, aprenderás a ejecutar un único comando en un servidor remoto sin necesidad de iniciar una sesión interactiva completa. Esta es una característica potente de SSH, muy utilizada en scripts y para la automatización, ya que permite obtener información rápidamente o realizar una tarea en una máquina remota y desconectarse inmediatamente después.

La sintaxis para esto consiste simplemente en 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.

Intentemos ejecutar 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) igual que antes. Después de introducirla, 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, vamos a listar el contenido del directorio raíz (/) en el servidor remoto usando ls -l /.

ssh sshuser@127.0.0.1 "ls -l /"

De nuevo, introduce la contraseña password123 cuando se te solicite. La salida será un listado detallado 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 gestionar 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 esta práctica de laboratorio, has aprendido los pasos fundamentales para habilitar y utilizar Secure Shell (SSH) en la gestión de servidores remotos. Comenzaste preparando el servidor Linux remoto, lo que incluyó la actualización del índice del repositorio de paquetes mediante sudo apt-get update y la posterior instalación del 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 posee privilegios de sudo pero carece de una contraseña para las conexiones SSH. Verificaste la creación del usuario y confirmaste que el directorio personal se estableció correctamente.

Con el servidor y la cuenta de usuario listos, aprendiste a obtener la dirección IP del servidor, una información crucial para que cualquier cliente inicie una conexión. Por último, practicaste las dos formas principales de utilizar SSH: estableciendo una sesión de línea de comandos completa e interactiva para trabajar directamente en el servidor remoto, y ejecutando un único comando remoto no interactivo, lo cual resulta sumamente eficiente para tareas de automatización y scripting.