Laboratorio seguridad SSH y llaves

Sitio: Facultad de Ingeniería U.Na.M.
Curso: Redes II - IC421
Libro: Laboratorio seguridad SSH y llaves
Imprimido por: Invitado
Día: miércoles, 4 de diciembre de 2024, 23:21

1. Introduccion

Como se vio anteriormente uno de los metodos para asegurar la información, ya sea su integridad, privacidad y autenticidad es el empleo de llaves de seguridad. Las mismas serán abordadas desde el punto de vista pŕactico.

Para ellos utilizaremos los paquetes openssh-server y gnupg para realizar la practica

En windows tenemos GPG4WIN y para SSH debemos activarlo (esto lo haremos más adelante)

2. Cifrar y descifrar documentos

Cada clave pública y privada tiene un papel específico en el cifrado y descifrado de documentos. Se puede pensar en una clave pública como en una caja fuerte de seguridad. Cuando un remitente cifra un documento usando una clave pública, ese documento se pone en la caja fuerte, la caja se cierra, y el bloqueo de la combinación de ésta se gira varias veces. La parte correspondiente a la clave privada, esto es, el destinatario, es la combinación que puede volver a abrir la caja y retirar el documento. Dicho de otro modo, sólo la persona que posee la clave privada puede recuperar un documento cifrado usando la clave pública asociada al cifrado.

3. Creacion de llaves

Para la creacion de un par de llaves empleamos el comando

gpg --gen-key o gpg --full-generate-key

en el caso del segundo se nos abrirá un asistente en donde podemos elegir ciertas cosas como el tamaño de la llave, tipo de cifrado, etc. En ambos casos debemos escribir un ID para identificar la llave.

Una vez generada las llaves, podemos ver las que tenemos instaladas:

gpg --list-keys 

4. Compartiendo la llave

Para poder compartir la llave debemos realizar la exportación de la misma a un archivo (cabe aclarar que la única llave que se exporta es la publica). Para ello debemos saber el ID (o parte del mismo que elegimos y corremos el siguiente comando) Si no cambiamos el ID por defecto, este sera nuestro correo electrónico.

gpg --output llave.gpg --export ID_elegido

Luego en la PC que queremos utilizar la llave debemos realizar al importación, y para poder utilizarla debemos firmarla como verdadera(la firma se realiza mediante la llave privada del usuario que importa).

gpg --import llave.gpg

verificamos que se haya importado

gpg --list-keys

Una vez que la clave haya sido importada, es necesario validarla. GnuPG usa un potente y flexible modelo de confianza que no requiere que el usuario dé validez personalmente a cada clave que importe. Sin embargo, algunas claves pueden necesitar que el usuario les dé validez de forma personal. Una clave se valida verificando la huella digital de la clave, y firmando dicha clave para certificar su validez. La huella digital se puede ver con la opción de la línea de órdenes --fingerprint, pero para certificar la clave hay que editarla.

javier:~$ gpg --edit-key arancha@nav.es

pub  1024D/B63E132C  created: 1999-09-24 expires: never      trust: -/q
sub  1024g/581A915F  created: 1999-09-24 expires: never
(1)  Aranzazu (A.G.deZ.) <arancha@nav.es>

Command> fpr
pub  1024D/B63E132C 1999-09-24 Aranzazu (A.G.deZ.) <arancha@nav.es>
             Fingerprint: 4203 82E2 448C BD30 A36A  9644 0612 8A0F B63E 132C

La huella digital de una clave se verifica con el propietario de la clave. Esto puede hacerse en persona o por teléfono, o por medio de otras maneras, siempre y cuando el usuario pueda garantizar que la persona con la que se está comunicando sea el auténtico propietario de la clave. Si la huella digital que se obtiene por medio del propietario es la misma que la que se obtiene de la clave, entonces se puede estar seguro de que se está en posesión de una copia correcta de la clave.

Después de comprobar la huella digital ya se puede firmar la clave con el fin de validarla. Debido a que la verificación es un punto débil en criptografía de clave pública, es aconsejable ser cuidadoso en extremo y siempre comprobar la huella digital de una clave con la que nos dé el propietario antes de firmar dicha clave.

Command> sign

NOTA: Para poder firmar la llave importada, primero tenemos que tener una llave maestra
del usuario generada previamente, por lo que si es la primera vez que vamos a utilizar
las llaves, debemos crear una llave en la segunda PC
.
Nota: en el caso de que estemos utilizando una PC del laboratorio y ya haya una llave maestra creada, debemos eliminar esta vieja para poder firmar con la llave nueva Cuando nos pregunta si estamos seguros de firmar con la llave, tiene que figurar nuestra informacion
pub 1024D/B63E132C created: 1999-09-24 expires: never trust: -/q Fingerprint: 4203 82E2 448C BD30 A36A 9644 0612 8A0F B63E 132C Aranzazu (A.G.deZ.) <arancha@nav.es> Are you really sure that you want to sign this key with your key: "Javier (Paramo S.L.) <javier@casa.es>" Really sign? y You need a passphrase to unlock the secret key for user: "Javier (Paramo S.L.) <javier@casa.es>" 1024-bit DSA key, ID D58711B7, created 1999-09-24 Enter passphrase:

Una vez firmada, el usuario puede comprobar la clave para obtener un listado de las firmas que lleva y para ver la firma que le acaba de añadir. Cada identificador de usuario tendrá una o más autofirmas, así como una firma por cada usuario que haya validado la clave en cuestión.

Command> check

uid  Aranzazu (A.G.deZ.) <arancha@nav.es>
sig!       B63E132C 1999-09-24   [self-signature]
sig!       D58711B7 1999-09-24   Javier (Paramo S.L.) <javier@casa.es>
 

5. Cifrado y descifrado de documentos

Cada clave pública y privada tiene un papel específico en el cifrado y descifrado de documentos. Se puede pensar en una clave pública como en una caja fuerte de seguridad. Cuando un remitente cifra un documento usando una clave pública, ese documento se pone en la caja fuerte, la caja se cierra, y el bloqueo de la combinación de ésta se gira varias veces. La parte correspondiente a la clave privada, esto es, el destinatario, es la combinación que puede volver a abrir la caja y retirar el documento. Dicho de otro modo, sólo la persona que posee la clave privada puede recuperar un documento cifrado usando la clave pública asociada al cifrado.

Lo que hará usuario 1 es cifrar un documento con la llave pública de usuario2, luego este documento solo podrá ser descifrado por usuario2 que es el que tiene la llave maestra (llave privada que fue generada junto a la pública en el punto 3 del laboratorio)

Para cifrar un documento se usa la opción --encrypt. El usuario debe tener las claves públicas de los pretendidos destinatarios. El programa espera recibir como entrada el nombre del documento que se desea cifrar o, si éste se omite, una entrada típica. El resultado cifrado se coloca en la salida típica o donde se haya especificado mediante la opción --output. El documento se comprime como medida adicional de seguridad, aparte de cifrarlo.

javier:~$ gpg --output doc.gpg --encrypt --recipient arancha@nav.es doc

La opción --recipient se usa una vez para cada destinatario, y lleva un argumento extra que especifica la clave pública con la que será cifrado el documento. El documento cifrado sólo puede ser descifrado por alguien con una clave privada que complemente uno de las claves públicas de los destinatarios. El usuario, en este caso el remitente, no podrá descifrar un documento cifrado por sí mismo a menos que haya incluido su propia clave pública en la lista de destinatarios.

Para descifrar un mensaje se usa la opción --decrypt. Para ello es necesario poseer la clave privada para la que el mensaje ha sido cifrado. De igual modo que en el proceso de cifrado, el documento a descifrar es la entrada, y el resultado descifrado la salida.

arancha% gpg --output doc --decrypt doc.gpg

You need a passphrase to unlock the secret key for
user: "Aranzazu (A.G.deZ.) <arancha@nav.es>"
1024-bit ELG-E key, ID 581A915F, created 1999-09-24 (main key ID B63E132C)

Enter passphrase: 

6. conexion simple por ssh

Veremos ahora como conectar un servidor remoto con uno local de forma segura mediante el protocolo SSH. Realizaremos la conexion y luego haremos el intercambio de llaves.


Como vimos en la pŕactica simplemente para realizar una conexion por SSH corremos el comando

ssh username@IP_del_Servidor_de_SSH

Cabe aclarar que la conexion establecida mediante el protocolo es del tipo cifrada, NO ASI EL ACCESO.

El acceso a SSH es inseguro, ya que al emplear una clave la misma puede ser obtenida mediante fuerza bruta.

Veremos ahora un ejemplo con los programas y linea de comando,

Nota: Para cerrar luego una sesión ssh podemos hacerlo mediante CTRL+D


En Windows

En Windows mediante Putty


Tambien podemos hacerlo instalando SSH desde PowerShell:

Para instalar ejecutamos PowerShell como administrador, luego con el ssiguiente comando:

    
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0


Para iniciar el servicio:


Start-Service sshd


Para verificar que esta corriendo normalmente:


    Get-Service sshd


En Linux

En linux debemos asegurarnos que este corriendo el servicio, sino tenemos instalado el paquete lo instalamos

7. Creacion de una llave

Vamos a trabajar en la creación de una llave en este caso para realizar una conexion SSH entre cliente/servidor.

Utilizando el comando ssh-keygen

Para ellos simplemente podemos correr el comando, o pasando algunos parametros, en este caso:

-t rsa -> Especificamos que la llave sea encriptada mediante RSA.

-f llave -> nombre del archivo en que se creará la llave. (si no lo especificamos, luego se nos preguntará)

nota: al correr el comando podemos ingresar una frase de contraseña (esta frase se nos pedira luego para una mayor seguridad para obtener la llave)

Esto creará dos archivos en el ordenador con las llaves generadas. llave.pub(Llave publica) y llave (Llave privada)

Si vemos el contenido de una de estas llaves es ilegible para un usuario.

una forma de respaldar fisicamente es generar un codigo QR 40 con los datos de la llave y luego imprimirlo. Este sitio por ejemplo puede generarlo.

8. compartiendo la llave

Una vez generada las llaves. Como vimos la llave publica debe ser conocida en el servidor y debemos compartirla por un medio seguro.

La llave puede ser instalada manualmente en el archivo de configuraciones de openssh en el servidor

Directorio linux:              /home/usuario/.ssh/authorized_keys

Directorio Windows:      /usuarios/nombreusuario/.ssh/


En linux:

El método que utilizaremos es mediante el comando ssh-copy-id, luego de correr el comando, se nos pedirá la contraseña de acceso al servidor. Este comando copia nuestra llave en el servidor. por lo que usuario@host corresponde al servidor remoto

ssh-copy-id -i llave_publica.pub usuario@host



En Windows:

En el caso que utilicemos windows, no tendremos la función copy-id, para ello debemos copiar la llave manualmente
mediante el siguiente comando copiaremos la llave al servidor, debemos tener presente el directorio de destino si es un servidor linux o windows.

    type $env:USERPROFILE\.ssh\id_rsa.pub | ssh {IP-ADDRESS-SERVER} "cat >> .ssh/authorized_keys"

Si tenemos acceso fisico al srvidor Podemos comprobar el directorio si se ha copiado la llave:


Luego podemos probar realizar la conexion con el servidor mediante ssh.


Alternativa SCP


Podemos realizar la copia también mediante el comando: scp tanto en Windows como en Linux y luego mover la llave al directorio nombrado mas arriba, si pudo realizar con el comando previo, la opción de scp seria una buena alternativa para el punto 4 en servidores remotos.

Copia desde servidor Remoto a local:

    scp  user@server:/path/to/remote/file /path/to/local/file

Copia de Local a servidor Remoto:

    scp /path/to/local/file user@server:/path/to/remote/file

Mediante -P podemos especificar el puerto , si es que no utilizamos el puerto por defecto 22

9. prueba conexion con llave cifrada

Ahora que tenemos instalada la llave en nuestro servidor, vamos a aumentar la seguridad de la conexion deshabilitando el acceso por contraseña, para asi poder ingresar unicamente con la llave que generamos.

Para ello debemos modificar el archivo de configuración de ssh

sudo nano /etc/ssh/sshd_config

buscar la linea:

 #PasswordAuthentication yes

descomentarla y denegar las contraseñas.

PasswordAuthentication no

podriamos tambien denegar el acceso como usuario Root si quisiesemos.

PermitRootLogin no

Una vez modificado, reiniciamos el servicio ssh en el sistema:

sudo systemctl restart sshd

Si probamos ahora debemos obtener una denegación al intentar ingresar.

probar bien esta parte


Ahora para poder ingresar mediante la llave debemos correr el comando:

ssh usuario@host -i llave

10. cambio de puerto

para mayor seguridad podemos modificar el puerto que utiliza por defecto SSH para hacerlo aún mas seguro, de modo que algún atacante no conozca nuestro puerto SSH.

Para ellos abrimos el archivo de configuración del servidor SSH. y editamos la línea puerto:

/etc/ssh/sshd_config

Podemos ver en la IANA, si el puerto que elegimos esta reservado para algo especial

Luego será necesario reiniciar el servicio. y verificar reglas de firewall dentro del sistema para ver si se encuentra habilitado.

para conectarnos luego al puerto modificado debemos incluir la línea " -p XXXX" en la conexión. siendo XXX el puerto elegido