Realizar un login remoto o ssh utilizando autenticación por certificado RSA

ssh

… o lo que es lo mismo realizar un login remoto o ssh sin utilizar usuario y contraeña.

Es el caso en el que queremos realizar un login remoto o login por ssh desde un equipo A a un equipo B (o a ‘n’ equipos) y no queremos utilizar el usuario y contraseña cada vez que realizamos el login.

Los pasos son los siguientes:

  • Relizar el login en el equipo A
  • Generar la clave rsa para autenticación
  • Copiar la clave rsa generada en el equipo B
  • Realizar el login en el equipo B utilizando la clave recién generada

Como podemos imaginarnos necesitamos tener cuentas en ambos equipos para poder realizar estos pasos

Generar las claves para autenticación desde el equipo A

El comando ssh-keygen genera las claves de autenticación que podemos utilizar para el protocolo ssh de versiones 1 y 2. En este caso dejamos en blanco la passphrase.

La cuenta de usuario en este equipo se corresponde con user1.

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
/home/user1/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/.ssh/id_rsa.
Your public key has been saved in /home/user1/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:a3xg5xjLeq8t7qYVwcaa/m4wK/K+zn/ugE5GTxW8WHE user1@equipoa
The key's randomart image is:
+---[RSA 2048]----+
...
...
+----[SHA256]-----+

Copiar la clave recién generada en el equipo B desde la cuenta de usuario del equipo A

La cuenta de usuario en el equipo B se corresponde con user2.

$ ssh-copy-id user2@equipob
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user1/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user2@equipob's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'user2@equipob'"
and check to make sure that only the key(s) you wanted were added.

Realizar el login ssh desde el equipo A en el equipo remoto B utilizando la clave recién copiada

$ ssh user2@equipob
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-31-generic x86_64)

A partir de ahora cada vez que realicemos el login en el equipo B no necesitaremos realizar el login ssh con la contraseña.

Anuncios

Creación de una clave pública y privada con OpenSSL

PKI

La clave pública y privada se utiliza en la infraestructuras de clave pública PKI para el cifrado y descrifrado de datos, así como para la firma digital y su verificación.

A la hora de crear una clave pública y privada debemos tener en cuenta los siguientes puntos.

Algoritmos de generación de clave

Los algoritmos más utilizados y soportados son RSA, DSA y ECDSA.

DSA. Conocido como Digital Signature Algorithm. Se encuentra limitado a la generación de claves de 512 bits y 1024 bits.

Se utiliza para la firma digital y verificación de firma.

RSA. Su nombre es debido a sus creadores Ron Rivest, Adi Shamir y Leonard Adleman. Es el más utilizado y soportado ya que no está limitado a 1024 bits, lo que le hace ser más seguro para la firma digital que DSA.

Se utiliza para firma digital, y para cifrar y descifrar datos.

ECDSA. Conocido como Elliptic Curve Digital Signature Algorithm. Es más reciente que el RSA. Es más seguro que el RSA ya que con claves más pequeñas se consigue el mismo nivel de seguridad que claves mas grandes en el RSA. Al tener claves más pequeñas también es mejor algoritmo ya que mejora el redimiendo de las aplicaciones de cifrado, descifrado y firma digital.

Se utiliza para la firma digital y verificación de firma, y para el cifrado y descifrado de datos.

Seguridad de la clave

La seguridad de la clave la marcan dos factores:

Tamaño de la clave. A día de hoy la longitud o tamaño de una clave debe ser como mínimo de 2048 bits. Es la longitud recomendada, ya que tamaños de claves inferiores pueden ser obtenidas a partir de un certificado utilizando fuerza bruta.

Passphrase. Se recomienda que las claves sean protegidas por una contraseña. No obstante si es una clave que va a ser utilizada junto con su certificado en un servidor web o proxy reverso, no es necesario que la utilicemos, ya que cada vez que el servidor es reiniciado, tendríamos que introducir a mano dicha contraseña, lo cual es poco práctico.

A continuación vamos a crear una clave utilizando el algoritmo RSA.

Esta clave la utilizaremos en otros artículos para crear un certificado autofirmado y para crear una petición de firma de un certificado, que sería el que enviaríamos a un CA para que nos lo firme.

Generar clave pública y privada en formato PEM sin contraseña

$ sudo openssl genrsa -out key.pem 2048
Generating RSA private key, 2048 bit long modulus
.....+++
.........................+++

Generar clave pública y privada en formato PEM con contraseña

Siempre que utilicemos la clave openssl nos pedirá la contraseña.

$ sudo openssl genrsa -aes128 -out key.pem 2048
Generating RSA private key, 2048 bit long modulus
...............................................................................+++
..........................+++
Enter pass phrase for key.pem:
Verifying - Enter pass phrase for key.pem:

Clave privada en formato PEM sin contraseña

Al estar en formato PEM podemos ver la clave en cualquier editor de textos. El algoritmo RSA utilizado para la generación de clave viene informado en la cabecera de la clave.

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAwC2rw8Zx2i53ByuwSKH2XgzYmGFwU5UF5nBizsmf27b1iFC2
KqHiDYOiKulX0wrkYn4M8Djw5Io+YEconQzye3tgySYQWbSPDU/s8gQ2248huoAg
ZRq4vQbHH/SQibNd9d9NsnLIK1+tfE2r9Lt0JO4/Ulz4PFF0wu21EqxrXUrbvYFZ
Nfc0r/4vQ5y8XK5RID79m2NehKbHejJEq2abgkVXiqwEPIxy/TkqsRgqRcx6Sc/K
SXnjUqwV3GOvK1YBwE8csQhNOPqP2vUhxEjAzkSM3tLvI//aA2VPsH+nvHjWje1T
MVR1zKCTAvLh/GZ4KphXlY6LAuHbvnIOTJHg6QIDAQABAoIBAGfRRFVCwwamy05o
X5cdR8aPEgNfwBqnCsTuObKUYXOEZyf40jA9u6ypS9X6sKMl4zMB/WNYn2oW9JN2
XY5aDDSA9kwz7+lGDXGXl902QZxiuknSJa34vYwAOVod+GcrKrtEouif8VrdGQ9p
tldDXP8GZdbMup17M6SKXaN02ZtPgbbNPTkweeVQVf399o7YIGfGnijs0SJ08yF9
NY6trH7rTAPf5bG3lbaEd2JuwfHw5hznp0mdimqeU4lW3LHFA3J3g7Myk9bprtp8
PnZdVypNdjRFHLhBhu67WlMgvntWw8dMQvOP7Xv9TLC+1KIAzA0wFsSfS14+AI4x
A8yUWzECgYEA3x76Gv4Rx9TMLMQUlsx1M3o4yDj5VD54bOkIxwH/1kspds1zBRLE
domCcIfrD04U4sX7vu74tTsmWtGlwZQ9Q+NhsdQZKMBWX27+JohqPkrYmmUyBTxE
zP+0yXLpL7MzjW7jzdeOfrXQWx0E73f4uqd8muPIPYXuwm6dSAZ2HdsCgYEA3H9q
FpNtFQDWW1zS/wgeoKSOZPAHr6JB+zB4FRNwlNKD5Mtd5DlVKjGFg9JrdhIpUVzp
6LG7My5lNI0U8YxTKGuOPoEHRX2pusod2PDfXc/yudwWn9KhHM39zLzT+iHu5e2q
M9E0paRJMxUFIkN8TYG/eN07PVZ4wxcSguZmcYsCgYBpQc7RTwyKTfwoHjRsU3Xy
2/TPl/kfYf0ju+e1Il9T889SyWc6fHkMRqCvf59HcBlwReAWWdwgexAEBiUBJnKk
hS9AWgOoctwMV2s0OGSOkHaQl666Q41dfEAITNpu80YdsbNsFwWVByaM5Sq/4cQI
Ih0pYM3FIFrbhJ1ULiAowwKBgQDHqViXOMf9zNRNxrAI34FcVaXbIL7U+0hj/G/A
Jeo72KQ1+TD8CC5mFpGf3FoSgD+JvWjRnJ62qbxa6aWdVEO4xiv3zT6YXkHjMkH0
v6iDelmAkxqpfkEFpEG9sv7/8NoyuhL0+OuDUlA2QUJ01Ecqp+KJv0p1MGgJwEqy
3Y7GIQKBgDjXGqXEFH5KxpulhlKQyaFCT5C2gWz+ZKfzbL6ZnP/PcXlCbBk4hnWg
gTQmxMty0M4f1YntwKMl9I0qv6SRiNAEJEOH0XPOlsASN/U6ekvWAwkHpr+DrNjk
xTBUHfq8vK+A2yQfhzoV7EnCbk/B9vn7Vw4dH0vhMgQG+aJaQn24
-----END RSA PRIVATE KEY-----

Clave privada en formato PEM con contraseña

Igualmente, como tenemos la clave en formato PEM, podemos verla con cualquier editor de textos. Como la clave se ha protegido con contraseña, vamos a ver como antes de la clave, tenemos una serie de metadatos informando del tipo de algoritmo utilizado para proteger la clave. En este caso es AES128.

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,5274591E525CB2302A38501B45059542

yAjd+MiPw6EG+MONq34zczDbRkmepxYqHQRVyZgfsu5oeCJ5VpWoUY/4RCbXOzK/
ZIL6Hivq8oJkWaF0h5cW6SlZeqOFdVlgxAGa547gRLwCMQVwaZEaNt1l8x1PhiSX
waGyKVTv9Ui9ZOlBMlgQWW/iyPFMKIAtgtNQf0S/b0hbA0YsQgW1c+v0jrmeYP58
MWNGkVV07W/Wo6Z4XyaYkXURDLb5Ds4nsqrGk+EubUGSr7MezttGleLo/gPSgMzA
Ueozs2KMSUHYwLR30fv3g64nyg+WXKr8JJwOT2N1Z7g2caDJNq/jDxW4/zTgrYCG
UXZ824hG7uMNh/cscHyJE5s+rkGH9Ix1/27etiE+sz/m/ODrDcZdVl8xy84wx3kf
D0R4feNSja26A+I/yxPh4SC58+wwmZwOLTOrFInZy+uUEOO0t9e423AlJGjAsrox
FxVViuero4TiQaxDw7HPrBI3E9kyco5FLi8O85RP1b6rl/PXcvgPHF04RShbaPTu
/L0RthPVgc7HGwjojPGwZLtcngvVGAnR3ty7btFjYcvJl0KH+jicXyIHl8f5mMTj
8WjCRic/7oKseSBixGFrahYeD51WUwwp85CJgKn/Wv9kjW+cEqowF2MPOpSteRq8
/kLkjjjrWrBmVDqv9w3w4mK+WBEhj73LLy1tpHWWM4i55xQy5RRP1l7pehK3cOiw
54cfxC5tnAnWpryTKbU1S7aCRJBFLsspi51Rd001NHS3CIBC0gVziL15RnqsbNsK
YYa/CU8FnfKUIS8Kf4udO64GUSRFALcoob9p8k3A+QtAp+6VjO5UaHCtSYV5epST
wReuz8jvusZQdra//N3goDFu1SB6U6Ea6lS/z/xxggU8nV6a4Pgo3OGxaAH6cGx3
EAQRndUWqS3i2dQjsgcdE4g736JuQ2cD6NF+OlHpZSnESUjb+M1P6hlr44Jjk1Gm
2rZrNvlDNgiVhe5yCsjJ+1atT2TGX+xJK6EOVm3ReVo+BIiqwHua00Eui3LQpKDX
EyxtCnGXyNZrToOvRm+Fk/RDhljykAzSYUxWHzT6n5cc7dXKFiWscO4Ue48bqw/h
0+HepzB7Kf3yNoP6Yr+1lLijxEbNcqNb+H6sWqzesJFYCw0ugLhs+4qVDIgPfl11
apljLTEKqvcqn/IMguEmPWRsDU/i3thTRrH7jKWOPAvE9taMXXNqjXP/n9WqqJNi
6EH0Mm7ia0lL8QasBrnqyfGN/U9m3m7Q/cSCPuzWG+E+69oitCU2LkyGU1rkzZDO
DlpOAFeYoCsbd4HG9ZCehQGIpKG8oDsRw4GlJxTSGVHyJal0vShPGSghj6VsEdd/
7+9Nofvbau4UHjB46KjgxF65KtZJduPVA9N5dJZ7U4hHt3RHgNonNXBEa1DGgsos
pz9RVujNEq3HX1g9Xt1rK50EyYUpT+K+zeL/uuqWrRhupYFylJCibs0GGeR1iZM1
ZdSvEQy0VkYR1eIp9qmL+c8AbE1fTVpi+C7Sy2ZEoCebj0RNpa5xz5Qcxjtj+VJD
rthAChc+71cYg0nWojvGJ/843Ho5QA2yYzAX8Z/ARgmsL/CiJlY0v4I4KM9nMBmI
-----END RSA PRIVATE KEY-----

Obtención o separación de la clave pública en formato PEM

Si lo necesitamos podemos obtener la clave pública asociada a nuestra clave privada.

$ openssl rsa -in key.pem -pubout -out key.public.pem
writing RSA key

Si editamos la clave pública con un editor de textos, vemos como la cabecera y pie de la clave tiene un formato distinto. En este caso nos indica que se trata de una clave pública.

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwC2rw8Zx2i53ByuwSKH2
XgzYmGFwU5UF5nBizsmf27b1iFC2KqHiDYOiKulX0wrkYn4M8Djw5Io+YEconQzy
e3tgySYQWbSPDU/s8gQ2248huoAgZRq4vQbHH/SQibNd9d9NsnLIK1+tfE2r9Lt0
JO4/Ulz4PFF0wu21EqxrXUrbvYFZNfc0r/4vQ5y8XK5RID79m2NehKbHejJEq2ab
gkVXiqwEPIxy/TkqsRgqRcx6Sc/KSXnjUqwV3GOvK1YBwE8csQhNOPqP2vUhxEjA
zkSM3tLvI//aA2VPsH+nvHjWje1TMVR1zKCTAvLh/GZ4KphXlY6LAuHbvnIOTJHg
6QIDAQAB
-----END PUBLIC KEY-----