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 manualmentemediante 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