SSH (Secure Shell): Telnet y FTP seguros Juan David González Cobas Mayo de 2005
0-0
Login remoto El protocolo Telnet suministra una conexión TCP como servicio de terminal virtual, cuya función más corriente es la posibilidad de establecer sesiones (i.e., login o shell remoto). Más propiamente debiéramos hablar de ejecución remota de programas. El mayor peligro inherente al uso de Telnet como shell remoto es que la autenticación (casi siempre por contraseña) está expuesta a escucha por terceras partes, al no blindar criptográficamente la conexión TCP. Es también fácil suplir un servicio Telnet por un troyano. Es decir, sufrimos autenticación débil ausencia de confidencialidad autenticación nula del servidor El objeto inicial del protocolo SSH (Secure Shell) es resolver estas deficiencias, proporcionando además otros servicios adicionales. 1
Transferencia de ficheros FTP El protocolo FTP (File Transfer Protocol) es en la práctica el medio universal de transferencia de ficheros entre hosts, únicamente reemplazado en parte por HTTP. Permite la transferencia de ficheros entre un cliente y un servidor previa autenticación del cliente. También permite sesiones anónimas para recuperación de contenidos en servidores de ficheros. FTP se distingue de otros servicios en que usa dos conexiones TCP para la comunicación control Es la conexión que transporta los comandos FTP y las respuestas del servidor. datos Es la portadora efectiva de los datos que se transfieren. Esto influye en la posibilidad de tunelizar FTP (dificultándola). 2
Autenticación rhosts: rlogin/rsh/rcp Aunque menos utilizada actualmente, existe una serie de programas muy popular en UNIX para la ejecución de procedimientos remotos y la transmisión de ficheros: la serie rsh/rcp/rlogin. Su objeto era proporcionar una forma conveniente de login y transferencia de ficheros entre hosts circunvalando la autenticación por contraseña. Para ello, el usuario definía en su directorio $HOME un fichero .rhosts indicando las direcciones de hosts remotos, y usuarios en ellos, en los que confiaba para hacer login en su nombre. Los hosts “de confianza” podían definirse también globalmente para todo el sistema en /etc/hosts.equiv
3
Ejemplo de fichero .rhosts #### fichero .rhosts en /home/cobas de di015.edv.uniovi.es #### todos estos puede entrar como ’cobas’ en di015 via rlogin #### o copiar ficheros via rcp di011.edv.uniovi.es 156.35.94.1 cobas 156.35.31.1 cobas 156.35.31.1 jdgc
# cualquier usuario de di011 puede entrar # cobas en 156.35.94.1 puede entrar # cobas en 156.35.31.1 puede entrar # jdgc en la misma maquina
No hace falta decir que este mecanismo es seriamente desaconsejable.
4
rsh y rcp Además de rlogin (el equivalente a Telnet), se ofrecían un par de programas para ejecución remota de procedimientos y copia remota de ficheros. Suponiendo que yo sea cobas@di015 $ rsh
[email protected] cat datos.txt >> datos_aqui.txt $ rcp
[email protected]:datos.txt cobas@pinon:datos_alla.txt
funcionarán si di015 y mi identidad en él se encuentran registrados en el fichero .rhosts de cobas de los sitios 156.35.171.71 y pinon, respectivamente.
5
Secure Shell (SSH) SSH es un reemplazo de los programas rlogin, rsh, rcp, escrito por Tatu Ylönen (1996). Los programas ssh y scp presentan una interfaz similar a rsh y rcp, pero envuelta en un protocolo de comunicaciones seguro y mecanismos de autenticación variadísimos y configurables a voluntad. Existen dos versiones del protocolo, llamadas versión 1 y versión 2. La primera posee debilidades conocidas y se recomienda el uso exclusivo de la segunda. Ninguna de ellas es perfecta, sin embargo. En conjunto, SSH proporciona Privacidad por blindaje criptográfico de la conexión TCP Autenticación del cliente por una miríada de mecanismos Autenticación del servidor, idem. Protocolo de transferencia de ficheros (scp/sftp) Creación de túneles por port forwarding Soporte de autenticación por agentes 6
Autenticación del cliente SSH puede autenticar autorizar el acceso al cliente mediante varios métodos rhosts al estilo BSD (basada en host) rhosts con claves públicas de host Clave pública contraseñas (al modo clásico de Telnet, con transferencia cifrada). desafío/respuesta Para aportar conveniencia, SSH soporta el uso de un agente de autenticación.
7
Autenticación por contraseña DH Key Agreement ssh (cliente)
22 sshd (servidor)
Canal SSH criptográficamente protegido OK
/etc/passwd
cuenta de pepe
pepe miclave
8
Autenticación por clave pública RSA 22
DH Key Agreement
sshd (servidor) ssh (cliente)
id_sesion
firma(id_sesion)
Canal SSH criptográficamente protegido OK
.ssh/id_rsa
.ssh/authorized_keys cuenta de pepe
pepe miclave
9
Autenticación por rhosts con clave pública 156.35.69.69 22
DH Key Agreement
sshd (servidor) ssh (cliente)
pepe,156.35.69.69,firma(id_sesion) Canal SSH criptográficamente protegido OK
/etc/ssh/id_rsa
.ssh/known_hosts cuenta de pepe
pepe miclave
10
Autenticación por dos factores 22
DH Key Agreement
sshd (servidor) ssh (cliente)
id_sesion
firma(id_sesion)
Canal SSH criptográficamente protegido OK
.ssh/id_rsa
.ssh/authorized_keys cuenta de pepe
pepe miclave_para_id_dsa
11
Autenticación del servidor En SSH, la autenticación fuerte es recíproca. Cada usuario mantiene un registro de las claves de host con que ha “hablado” hasta el momento. El cliente ssh emite una FUERTE advertencia (puede llegar a abortar la sesión) si percibe un cambio en la clave de host. Esto previene autenticación por contraseña contra un troyano (caza-claves) ataques man-in-the-middle No hay provisión para autenticación del servidor por dos factores.
12
Autenticación del servidor DH Key Agreement
22 sshd (servidor)
ssh (cliente)
firma(session_id) Canal SSH criptográficamente protegido
/etc/ssh/known_hosts
/etc/ssh/host_key .ssh/known_hosts
pepe
13
Transferencia de ficheros Además de un protocolo de autenticación para login remoto que mejora la autenticación rhosts, SSH proporciona un mecanismo de transferencia de ficheros que reemplaza al clásico FTP para transferencias no anónimas mediante el comando scp, cuya sintaxis es semejante a la de rcp. $ scp mi_fichero_de_aqui.txt
infor24.epv.uniovi.es:nombre_alla.txt
La versión 2 de SSH incorpora un comando sftp similar al cliente FTP clásico de línea de comandos. Existen muchos programas sofisticados que implementan transferencia SSH además del clásico FTP: lftp, yafc para Linux, WinSCP y la serie de programas putty para Windows.
14
Agente SSH Para facilitar la autenticación por dos factores durante una misma sesión, SSH nos proporciona un agente de autenticación. Esencialmente, se trata de un proceso que se mantiene vivo a la vez que una sesión de un usuario, y mantiene un caché de claves privadas descifradas. Cada nuevo login remoto se efectúa solicitando la autenticación al agente, sin que el usuario tenga que intervenir una vez más. Es posible incluso que el agente autentifique remotamente, mediante un proceso conocido como agent forwarding.
15
Agente de autenticación 22
DH Key Agreement
sshd (servidor) ssh (cliente)
id_sesion
firma(id_sesion)
Canal SSH criptográficamente protegido OK ssh−agent .ssh/id_rsa
... .ssh/authorized_keys cuenta de pepe .ssh/id_rsa
pepe miclave_para_id_dsa
16
Port forwarding SSH permite realizar port forwarding o reenvío de puertos; en otras palabras, tunelizar conexiones TCP a través de una sesión SSH. Existen dos formas de port forwarding: local y remota. forward local Ejemplo $ ssh -L 6969:frodo.inforg.uniovi.es:netbios di015.edv.uniovi.es
\
forward remoto Otro ejemplo $ ssh -R 7070:smtp.telefonica.net:smtp \ di015.edv.uniovi.es
17
Forward local micasa.telefonica.net
di015.edv.uniovi.es SSHD Server
SSH clnt Sesion SSH
6969
NetBIOS clnt
frodo.inforg.uniovi.es 139 NetBIOS server
18
Forward remoto micasa.telefonica.net
22
di015.edv.uniovi.es SSHD Server
SSH clnt Sesion SSH
7070
Mail clnt
smtp.telefonica.net 25 Mail server
19
Ficheros Fichero
Significado
$HOME/.ssh/id_rsa
Clave privada RSA de un usuario
$HOME/.ssh/id_rsa.pub
Clave pública correspondiente al mismo usuario
$HOME/.ssh/authorized_keys
Lista de claves públicas e identidades que el usuario considera autorizadas para autenticarse como él por clave pública
$HOME/.ssh/known_hosts
Lista de claves públicas de hosts conocidos hasta ahora, utilizadas para autenticación de host remoto.
/etc/ssh/ssh_known_hosts
Misma lista válida para todos los usuarios del sistema.
/etc/ssh/ssh_host_key
Clave del host, para autenticación del mismo ante los usuarios que acceden a él
20