Servicio SSH en Linux
En este apartado veremos el funcionamiento y propiedades que posee el servicio ssh en Linux. El mismo, ha reemplazado al viejo servicio de telnet ya que este ofrece una mayor seguridad. A su vez, dentro de este servicio veremos un poco de criptografía, como es el caso del cifrado simétrico, asimétrico y funciones HASH.
Table of Contents
ToggleOpenSSH
Linux viene con OpenSSH , una implementación libre del protocolo SSH. Este protocolo permite la conexión cifrada entre hosts. A su vez, esta conexión cifrada permite realizar muchas cosas útiles tales como encapsular conexiones X11 y a puertos TCP/IP arbitrarios, trabajar de forma remota de forma remota y compartir archivos de forma segura, entro otras..
Veamos el paquete de instalación
¿Cómo funciona este servicio?
Su función es garantizar que haya una conexión segura entre el host y el servidor remoto, garantizando la transferencia de datos sin ninguna pérdida de información. El servicio ssh en Linux escucha en uno o más puertos TCP para proporcionar conexiones cifradas (El puerto 22 por defecto). Con lo que cada cliente tiene una clave específica de host, usadas para identificarlo. Cuando un cliente se conecta, el servidor responde con su clave pública . Luego, el cliente compara esa clave con su base de datos para verificar que no ha cambiado.
La protección entre una sesión y otra futura es proporcionada por medio de una clave compartida mediante el método criptográfico Diffie-Hellman o mejor cónocido como Cifrado Asimétrico (Claves Públicas y Privadas). El resto de la sesión se cifra usando Cifrado Simétrico (Claves Públicas). De esta forma un usuario puede configurar, modificar archivos e incluso trabajar en el desarrollo de una página web.
Una analogía de clave pública puede nuestra dirección de correo, y en cuanto a clave privada, podríamos decir que es nuestra contraseña.
Archivo de Configuración
Una vez instalado el servicio ssh en Linux, podemos encontrar el directorio /etc/ssh donde se encuentran las configuraciones junto con las claves públicas y privadas.
El archivo /etc/ssh/sshd_config contiene los parámetros necesarios para la configuración del servidor y la seguridad de este. Por ejemplo, si tecleamos # less /etc/ssh/sshd.config veremos lo siguiente:
Opciones del archivo /sshd_config
OPCIONES | DESCRIPCIÓN |
HostKey | Clave privada del host. |
AuhorizedKeysFile | Especifica la ruta relativa al directorio de inicio del usuario del archivo, con claves públicas autorizadas para acceder al host. |
ChallengeResponseAuthentication | Especifica si está habilitada la autenticación mediante “desafío-respuesta”. |
GSSAPICleanupCredentials | Especifica si luego de terminar la sesión se destruyen las credenciales usadas. |
X11Forwarding | Especifica si el redireccionamiento de X11 por ssh está permitido. Existe el riesgo de que el servidor de gráfico del cliente ssh pueda quedar expuesto a ataques cuando reenvíe solicitudes. Deshabilitar el redireccionamiento X11 no impide que el cliente lo obtenga solicitándolo explícitamente. |
Subsystem | Especifica un servicio externo. |
AcceptEnv | Declara las variables que el cliente podrá copiar al entorno de la sessión. |
UsePAM | Habilita la interfaz PAM. Si está como “yes” activará la autenticación usando “desafío respuesta” y autenticación por contraseña además del procesamiento de cuenta y sesión para todos los tipos de autenticación. Esto permite usar autenticación por contraseña o por “desafío-respuesta”. Por lo tanto UsePAM evita tener que activar PasswordAuthenticaction o ChallengeResponseAuthenticaction. |
GSSAPIAuthentication | Especifica si está habilitada la autenticación usando API’s GSS las cuales se usa para implementar distintos mecanismos criptográficos. |
PasswordAuthentication | Especifica si está habilitada la autenticación usando contraseña. |
SyslogFacility | Subsistema usado por el servicio rsyslogd. |
Opciones de Seguridad
A continuación, veremos las opciones y descripción dentro del archivo /etc/sshd_config dentro del servicio ssh en Linux.
OPCIÓN | DESCRIPCIÓN |
Port | Se puede especificar uno o más puertos en el que ssh estará escuchando. |
Protocols | El único protocolo que tiene que estar habilitado es el 2 |
PermitRootLogin | Permite la conexión como usuario root |
MaxAuthTries | Es la cantidad de veces que un cliente podrá realizar intentos para conectarse. |
GatewayPorts | Es para habilitar el acceso a todas las interfaces cuando se realiza un redireccionamiento por ssh. |
AllowTcpForwarding | Es para permitir el redireccionamiento de conexiones a puertos TCP por ssh. De igual forma, si los clientes tienen acceso a la shell pueden usar sus propias redirecciones. |
StrictModes | Si se activa esta opción el servidor no admitirá conexiones cuando los permisos del directorio y archivos del usuario sean laxos o sus propietarios no sean los lógicos. |
LoginGraceTime | Es el tiempo que espera el servidor hasta que un cliente logra conectarse exitosamente. |
Claves de Host
Al instalar openssh, este generará varios pares de claves como se puede ver a continuación:
# ls -l /etc/ssh/ssh*key*
Los archivos que terminan en “_key” corresponden a claves privadas, mientras que los que terminan con “.pub” son claves públicas.
El nombre del archivo indica el algoritmo utilizado para las claves, como se puede ver el caso de ecdsa, ed25519, rsa. Algunas también usan el algoritmo DSA, generando entonces un par de archivos: ssh_host_dsa_key y ssh_host_dsa_key.pub .
Los algoritmos de cifrado se pueden ver con el siguiente comando:
# ssh –Q key
Cliente SSH:
Como habíamos mencionado, el cliente de OpenSSH es un reemplazo más seguro y con mayor rendimiento que telnet. Su archivo de configuración está en /etc/ssh/ssh_config. Por ejemplo:
Conexión Cliente-Servidor
Bien, supongamos que tenemos una máquina con el usuario “tiner” (como servidor) cuya dirección IP es la 10.10.10.1 y, otro usuario con privilegios como “root” (como cliente) desde su máquina. Ambos se encuentran en la misma red. Por tanto, en el caso de querer conectarnos a la máquina de «tiner», debemos tener en cuenta la siguiente sintaxis:
# ssh ususario@DireccionDeHost
Veamos el siguiente ejemplo:
A través del comando #ip a podemos comprobar que estamos dentro del servidor desde nuestro host.
También se puede usar el siguiente comando para la misma función # ssh –l usuario Dirección_De_Host.
El puerto por defecto que usa ssh es el 22, sin embargo este suele cambiarse por razones de seguridad. Por ejemplo, en el caso que se haya configurado el archivo /etc/ssh/sshd_config para cambiar del puerto 22 al puerto 83, usaríamos el siguiente comando:
# ssh –p 83 ususario@DirecciónDeHost
Cabe mencionar que al loguearnos por primera vez nos aparecerá un mensaje como este:
# ssh [email protected]
The authenticity of host ‘10.10.10.1 (10.10.10.1)’ can’t be established.
ECDSA key fingerprint is SHA256:u7OCYgfWu7eN9E9TQtmwzbPeAUKMJbeTdwluiLPhlK.
Are you sure you want to continue connecting (yes/no)?
Ante esta última pregunta, respondemos con “yes” y luego nos pedirá el password para loguearnos dentro del servidor. Muy importante: Desde el servidor esa huella dactilar o fingerprint de la clave se podría comprobar ejecutando el siguiente comando (notar como debe coincidir el algoritmo usado):
# ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key
Intercambio de archivos entre hosts
Supongamos que en el servidor tenemos el archivo /home/tiner/server.txt y nosotros, desde nuesto host como root, queremos pasarnos dicho archivo a nuestro directorio /root.
Para esto usaremos el comando scp. Veamos la siguiente sintaxis:
# scp usuario@DirecciónDeHost:/ruta/del/archivo /ruta/del/destino
Observemos la siguiente imagen
Opciones avanzadas con SSH
El cliente ssh permite autenticarse usando una clave pública en lugar de usar un nombre de usuario y contraseña. A veces, acordarnos de la contraseña de todos nuestros programas es muy difícil. Entonces, ssh permite pasarle un certificado público de nuestro host al servidor. De esta forma podemos entrar y autenticarnos sin tipiar la contraseña. Para realizar la autencticación con clave pública, debemos aplicar los siguientes pasos:
1) Generación de par de claves
# ssh-keygen
Aquí se nos pedirá una contraseña especial (passphrase) para cifrar la clave privada. Al final del este paso obtendremos una clave privada y una clave pública para nuestro usuario. Este paso solamente será necesario hacerlo la primera vez. Nos aparecerá algo como lo siguiente:
2) Ejecución del agente de autenticación de OpenSSH
# exec ssh-agent bash
Este comando reemplazará la shell actual por una shell bash con el agente de autenticación ejecutándose. Dicho proceso creará dos variables: SSH_AGENT_PID y SSH_AUTH_SOCK. La primera variable posee el PID del agente y la segunda la ruta al archivo de socket para conectarse con el agente.
3) Agregar la clave al agente
# ssh-add
Este paso descifra la clave privada y la agrega al llavero.
4) Copiar el archivo al servidor ssh
# ssh-copy-id server.example.com
Este comando copia nuestra clave pública de usuario y la agrega al archivo ~/.ssh/authorided_keys del servidor ssh.
5) Conectar por clave pública
# ssh server.example.com
Finalmente podremos conectarnos sin contraseña.
Túneles SSH
Un túnel SSH es una forma segura de navegar en la web SSH. Se utiliza para crear una conexión cifrada entre un ordenador local (el host local) y un ordenador remoto. El uso de esta red virtual permite eludir ciertas restricciones de acceso. Por ejemplo, si estamos en una cafetería de un aeropuerto podemos ser susceptibles a ciertos ataques informáticos como “Man in the Middle” o “Envenenamiento ARP” entre otros… Como así también estar en un país que no se permite el acceso a ciertas paginas web. Una función muy importante dentro del servicio ssh en Linux.
¿Cómo funcionan los túneles SSH?
Primeros veamos esto con un ejemplo:
Usamos túneles (no solo en carreteras, sino también como caños o tubos) para ciertos trabajos, cuyo fin es transportar algo desde un punto de origen hacia un punto de destino. Por ejemplo, podemos usar una manguera para transportar agua, un caño para transportar gas o un tubo para transportar petróleo. Por lo tanto, sea lo que sea que transportemos, no podemos ver el contenido del túnel por fuera. En el caso de los túneles SSH el concepto no es muy diferente. Pues el contenido del túnel que vamos a usar, serían los protocolos (como por ejemplo HTTP o FTP, entre otros) y en cuanto a no poder ver dichos elementos nos referimos a la capacidad de cifrar la información para que los mensajes viajen encriptados, y así, mejorar la integridad y seguridad de los mismos.
Dichos túneles permiten realizar lo siguiente:
- Realizar acceso a aplicaciones con interfaz gráfica de manera remota (conexiones X11).
- Redireccionar conexiones TCP para conectarse de manera más segura a servicios que de antemano no tienen cifrado.
- Redireccionar conexiones TCP para pasar a través de firewalls.
Tipos de Túneles
Túnel de reenvío de puerto local
Se usa en general para asegurar una conexión sin cifrar:
# ssh -N -f -L 2222:localhost:80 192.168.1.15
-N No ejecuta comandos
– f Envía ssh al segundo plano
-L Reenvía el puerto del cliente ssh a un puerto del servidor. En este caso la conexión se redirige desde el puerto al puerto 80 de localhost remoto (este último tiene el servidor ssh y el servicio al que se quiere acceder)
Túnel de reenvío de puerto remoto
Se usa en general para acceder a un puerto bloqueado por un firewall. Es decir, se realiza la conexión desde el host que posee el servicio1194 (openvpn) el cual está bloqueado por el firewall.
# ssh -N -f -R 2222:localhost:1194 ejemplo.com
-R Reenvía el puerto del servidor ssh a un puerto del cliente. En este caso la conexión se redirige del puerto 2222 al puerto 1194 de localhost (este último tiene el servidor ssh en lado del cliente del servicio al cual se desea acceder). Entonces para acceder a la VPN con el túnel establecido, el cliente podrá acceder conectándose a localhost:2222 desde la notebook.
Túnel de reenvío X11
Se usa para abrir aplicaciones gráficas de manera remota.
# ssh -X apps.ejemplo.com
Una vez logueado podrá abrir alguna aplicación cliente de X11 instalada en el servidor ssh.
Subservicio SFTP
OpenSSH proporciona un subservicio llamado sftp (secure file transfer program) muy útil dentro del servicio ssh en Linux. El mismo, sirve como servidor ftp del lado servidor y como cliente ftp desde el lado del cliente. El programa sftp posee los comandos similares a otros cliente ftp, y además permite retomar transferencias. Lo importante aquí es que usa el canal cifrado de openssh, agregando asi, mayor seguridad a la transferencia de archivos. Podemos ver el binario y paquete de la siguiente manera:
En el caso de distribuciones como Red Hat o Centos, podemos encontrar el paquete con el siguiente comando : # file /usr/libexec/openssh/sftp-server
Veamos algunas funciones:
Acceder por sftp a un servidor OpenSSH
# sftp [email protected]
Acceder por sftp a un servidor OpenSSH por un puerto distinto al predeterminado
# sftp -o Port=1004 [email protected]