Posts Tagged ‘RSA’

¿Qué son las claves públicas?

Wikipedianetworking

En criptografía, se denomina una infraestructura de clave pública a una combinación de hardware, software y procedimientos de seguridad que permiten la ejecución con garantías de operaciones criptográficas como el cifrado, la firma digital o el no rechazo de transacciones electrónicas. Para un correcto funcionamiento es necesario que intervengan las siguientes partes:

  • Un usuario iniciador de la operación.
  • Sistemas servidores que dan ocurrencia de la operación y garantizan la validez de los certificados implicados en la operación.
  • Un destinatario de los datos cifrados/firmados/enviados garantizados por parte del usuario iniciador de la operación.

¿Qué objetivo nos marcamos?

El propósito de usar la autentificación mediante claves públicas es sacar el mayor partido posible a SSH mediante el uso de clave privada y pública. De forma que al compartir esta última con el servidor, podamos identificarnos automáticamente, sin necesidad de utilizar el esquema clásico de usuario y contraseña, al que estamos acostumbrados.

¿Qué algoritmos de cifrado usar?

SSH permite usar los algoritmos RSA y DSA, pero… ¿cuál de ellos nos conviene más?

  • RSA – Es un algoritmo asimétrico cifrador de bloques, que utiliza una clave pública, la cual se distribuye y otra privada, guardada en secreto por su propietario.Su funcionamiento reside en el uso de expresiones exponenciales dentro de la aritmética modular. Obteniendo una completa seguridad, debido a que aún no se conocen formas óptimas de factorizar  un número grande en sus factores primos utilizando ordenadores personales.El RSA se basa en dos problemas matemáticos: el problema de factorizar números grandes y el problema RSA. El descifrado completo de un texto cifrado con RSA es computacionalmente intratable.
    Por otro lado la factorización de números grandes proponen métodos para longitudes de 600-700 bits de longitud. Y generalmente, las claves RSA usan entre 1024-2048 bits.
  • DSA – (Digital Signature Algorithm o Algoritmo Estándar de Firmado) es el algoritmo de firmado digital incluido en el DSS (Digital Signature Standard o Estándar de Firmas Digitales) del NIST Norteamericano. Está basado en el problema de los logaritmos discretos y únicamente puede emplearse para las firmas digitales. A diferencia del RSA, que puede emplearse también para encriptar.La elección de este algoritmo como estándar de firmado generó multitud de críticas puesto que perdía bastante flexibilidad respecto al RSA.

La diferencia entre ambos reside en los tiempos obtenidos para la generación, firmado y comprobación de las claves públicas. Usando este benchmark (podéis usar cualquier IDE con la última versión del JDK) se obtuvieron los siguientes tiempos:

Algoritmo

Generación de llaves * 1(ms.)

Firmado * 100 (ms.)

Verificación*100(ms.)

RSA 512 544.61 915 160
RSA 1024 1120.46 4188 263
DSA 512 6.62 634 988
DSA 1024 17.87 1775 3397

El algoritmo DSA es más rápido para generar la firma que para verificarla, al contrario de lo que sucede con RSA. Por lo que para realizar la autentificación en nuestro servidor SSH usaremos este último.

Además, si comparamos el tamaño de las llaves generadas por ambos algoritmos, comprobaremos cómo las utilizadas por RSA son superiores a las de DSA.

Dicho esto, usaremos RSA.

Configuración del servidor

Comprobamos si el equipo donde tenemos instalado sshd tiene activada la versión 2 del protocolo SSH y que esté habilitada la opción para utilizar claves RSA. Para ello buscamos las siguientes directivas en el fichero /etc/ssh/sshd_config:

Protocol 2
RSAAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

Para cada usuario que vaya a conectarse, debe existir el directorio /home/usuario/.ssh y en él el archivo authorized_keys. En caso de no ser así deberemos crearlo de forma manual y posteriormente iniciar el servidor.

cd ~
mkdir .ssh
touch .ssh/authorized_keys
sudo /etc/init.d/sshd start

Generación de los pares de claves RSA

Como antes comentamos, SSH nos permite generar indistintamente claves RSA o DSA (en nuestro caso usaremos la mencionada en primer lugar), creándose para ambas una clave pública y una clave privada.

Dichas claves, pueden generarse en el propio servidor, en el ordenador cliente, o en cualquier otra máquina.

Al final sólo la clave pública debe aparecer en el fichero .ssh/authorized_keys del servidor al que queremos conectarnos.

El usuario interesado en generar el par de claves usará ssh-keygen. En el proceso, se nos pedirá introducir un passphrase, lo que viene a ser una contraseña para poder generar unas claves más fuertes y seguras.

En nuestro caso, vamos a usarla y a explicar posteriormente como indicarle al sistema que sólo nos la pida una vez por sesión, y no cada vez que nos autentifiquemos en el sistema.

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/sebas/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/sebas/.ssh/id_rsa.
Your public key has been saved in /home/sebas/.ssh/id_rsa.pub.
The key fingerprint is:
63:de:92:6d:00:fa:d9:17:55:45:ce:bc:25:42:8b:4c sebas@TheWorkstation
The key's randomart image is:
+--[ RSA 2048]----+
| E . .oo|
| o o o + |
| . o + . =|
| . . . . .o|
| . S . . |
| . = * . |
| o = = |
| + |
| |
+-----------------+

El anagrama que produce esta versión de ssh-keygen, se denomina randomart y se trata de una representación visual de la huella

Notebookcheck- AMD ATI Mobility Radeon HD 4570_1245224146636

digital de nuestra clave, para que sea más legible para el ojo humano y para dispositivos ópticos.

Si lo deseas, puedes usar la herramienta visprint que a través de técnicas de fractales, te permitirá obtener otro tipo de randomart.

Instalación de clave pública y protección de la clave privada

Para validar todo este proceso es necesario colocar nuestra clave pública en el servidor donde tenemos pensado autentificarnos.

Existen varias posibilidades de hacerlo, una de ellas es por ejemplo hacer uso del siguiente comando (Cliente):

[usuario1@localhost usuario1]$ ssh usuario @host_remoto \'cat >> .ssh/authorized_keys' < .ssh/id_dsa.pub

Con este comando añadimos directamente la clave al fichero authorized_keys del servidor remoto de forma automática, ahorrándonos así un poco de trabajo.

También podemos usar (Cliente):

$ ssh-copy-id usuario_remoto@host_remoto

Pero ya que estamos haciendo todo con paso firme y decidido, continuemos haciendo las cosas con buen pie. Así que vamos a usar el comando scp, que trae incluido OpenSSH para hacer una transacción de ficheros entre el cliente y el servidor remoto de la forma más segura posible. Así que usaremos la siguiente orden (Cliente)

$ cd ~/.ssh
$ scp id_rsa.pub usuario@host_remoto/

Recuerda que la clave pública debe ser incluída en el fichero ~/.ssh/authorized_keys de cada máquina donde queramos usar dicha autentificación.

Ahora que ya tenemos la clave pública en el servidor, falta añadirla al fichero authorized_keys de éste (algo que comentamos anteriormente que se podría conseguir de forma directa utilizando el primer comando) (Servidor).

$ cd ~/.ssh
$ cat id_rsa.pub >> authorized_keys
$ shred -v  --remove id_rsa.pub

Conclusión

Si has realizado correctamente todos los pasos que se han ido indicando, ahora podrás conectarte a tu servidor SSH (Si no tienes uno, visita ésta entrada donde te explicamos cómo montar uno) sin necesidad de identificarte, tan sólo haciendo uso de las claves RSA que has generado.

También puedes incrementar un poco la seguridad modificando las siguientes directivas de tu fichero de configuración sshd_config:

PasswordAuthentication no
PermitRootLogin no

Con las que impedirás la conexión como administrador y la autentificación mediante password para los usuarios.