Preparando LPIC-1 110.3 Asegurando datos mediante cifrado

Aqui veremos lo mas importante de este topico.

1- Introduccion
2- Utilizando Secure Shell (SSH)
2-1 Comandos
2-2 Instalacion
2-3 Archivos de Configuracion
2-4 Primeras Conexiones
2-5 Teoria Llaves asimetricas
2-6 Creando Llaves asimetricas
2-7 Creando Tuneles
3-0 Teoria GPG
3-1 Uso GPG
3-2 Uso de GPG con Gmail

Introduccion

Vamos a ver un poco como funciona el servicio OpenSSh que viene de los desarroladores de OpenBSD.
Este servicio utiliza lo que se llama cifrado asimetrico (llave publica y privada) con diferentes algoritmos(RSA, DSA,etc) que van a realizar la encriptacion.[2]

Utilizando Secure Shell (SSH)

SSH, tambien conocido como Shell segura es un reemplazo de telnet y otros comandos (rsh,rlogin,rcp ).
Principalmente se usa ssh para poder establecer conexiones remotas encriptadas. Sin embargo se utiliza tambien para copiar archivos,
crear tuneles con diferentes procotolos y puertos.
SSH es un modelo cliente/servidor en donde el demonio sshd es el servidor y ssh y scp son los comandos clientes.
Los clientes se conectan al servidor (sshd) , se establece una sesion encriptada que para eso necesitamos una autentificacion entre ambas partes (intercambio de llaves) y luego nos da el prompt de login.

Comandos

El comando ssh puede ser usado para conectarme remotamente a otros equipos o para conectarme localmente a mi equipo.Podriamos decir que es un uso similar al de rlogin,rsh,telnet.
El comando scp nos va a servir para poder copiar archivos y directorios desde o hacia un servidor remoto, funcionando este como el rcp.
Tambien se puede hacer forwarding con ssh (autentificacion con X y forwarding). Tambien se puede arrancar una X cliente desde una maquina remota y el protocolo X Window System sera encriptado para que sus paquetes viajen por la red.[3]

Instalacion

Aca vamos a consultar si ya lo tenemos instalado.

root@debian:~# dpkg -l |grep -i openssh
ii  openssh-blacklist                  0.4.1                       list of default blacklisted OpenSSH RSA and DSA keys
ii  openssh-client                     1:5.5p1-6                   secure shell (SSH) client, for secure access to remote machines
ii  openssh-server                     1:5.5p1-6                   secure shell (SSH) server, for secure access from remote machines
root@debian:~#

Como ven tenemos instalado todo ya, si lo quisieramos instalar basta con hacer aptitude install NombrePaquete.
No se olviden que para poder hacer que se conecten al equipo necesitan el openssh-server.
Luego de instalar el openssh-server les va a generar las claves.

Archivos de Configuracion

Vamos a ver donde se situan los archivos de configuracion del cliente y del servidor.

Aca tenemos el directorio en gral.
root@debian:~# ls -ld /etc/ssh/
drwxr-xr-x 2 root root 4096 Feb  8 23:59 /etc/ssh/
root@debian:~#

Aca tenemos todos los archivos que contiene:

root@debian:~# ls -l /etc/ssh/
total 152
-rw-r--r-- 1 root root 125749 Dec 26 13:12 moduli
-rw-r--r-- 1 root root   1669 Dec 26 13:12 ssh_config
-rw-r--r-- 1 root root   2453 Feb  8 23:59 sshd_config
-rw------- 1 root root    668 Feb  8 23:59 ssh_host_dsa_key
-rw-r--r-- 1 root root    601 Feb  8 23:59 ssh_host_dsa_key.pub
-rw------- 1 root root   1675 Feb  8 23:59 ssh_host_rsa_key
-rw-r--r-- 1 root root    393 Feb  8 23:59 ssh_host_rsa_key.pub
root@debian:~#

Como ven tienen las llaves que genero con el algoritmo dsa y rsa tanto publicas ocmo privadas.

root@debian:/etc/ssh# file ssh_host_rsa_key
ssh_host_rsa_key: PEM RSA private key
root@debian:/etc/ssh# file ssh_host_rsa_key.pub
ssh_host_rsa_key.pub: ASCII text, with very long lines
root@debian:/etc/ssh#

Luego el archivo de configuracion del cliente es el siguiente :

root@debian:/etc/ssh# ls -l ssh_config
-rw-r--r-- 1 root root 1669 Dec 26 13:12 ssh_config
root@debian:/etc/ssh#

Un archivo tipico ..

root@debian:~# cat /etc/ssh/ssh_config  |grep -v "#"

Host *
    SendEnv LANG LC_*
    HashKnownHosts yes
    GSSAPIAuthentication yes
    GSSAPIDelegateCredentials no
root@debian:~#

El archivo de configuracion del servidor es el siguiente:

root@debian:/etc/ssh# ls -l sshd_config
-rw-r--r-- 1 root root 2453 Feb  8 23:59 sshd_config
root@debian:/etc/ssh#

Un archivo tipico :

root@debian:~# cat /etc/ssh/sshd_config  |grep -v "#"

Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
UsePrivilegeSeparation yes

KeyRegenerationInterval 3600
ServerKeyBits 768

SyslogFacility AUTH
LogLevel INFO

LoginGraceTime 120
PermitRootLogin yes
StrictModes yes

RSAAuthentication yes
PubkeyAuthentication yes

IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no

PermitEmptyPasswords no

ChallengeResponseAuthentication no

X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes

AcceptEnv LANG LC_*

Subsystem sftp /usr/lib/openssh/sftp-server

UsePAM yes
root@debian:~#

Aca en este archivo vamos a mencionar alguna de las cosas mas importantes como por ejemplo.
Port para especificar el puerto
Protocol la version del ssh
PermitRootLogin para permitir que se loguen como root.
PubkeyAuthentication Permite autentificacion de llaves publicas.
# For this to work you will also need host keys in /etc/ssh_known_hosts
# (for protocol version 2)
HostbasedAuthentication para que los usuarios puedan utilizar las llaves guardas bien conocidas o no.
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication Creo que el comentario de arriba lo dice todo.
X11Forwarding Para poder realizar forwardeo de grafica.

Primeras Conexiones

Cuando nos conectemos por primera vez a un equipo remoto va a pasar lo siguiente.

Equipo Remoto : 192.168.100.136

[rino@oc7287280510 ~]$ uname -a
Linux oc7287280510.ibm.com 2.6.35.10-74.fc14.x86_64 #1 SMP Thu Dec 23 16:04:50 UTC 2010 x86_64 x86_64 x86_64 GNU/Linux
[rino@oc7287280510 ~]$
[rino@oc7287280510 ~]$ ssh -l root 192.168.100.136
The authenticity of host '192.168.100.136 (192.168.100.136)' can't be established.
RSA key fingerprint is 7f:91:5b:59:fb:3e:2d:9a:74:5f:41:7d:4a:36:98:9b.
Are you sure you want to continue connecting (yes/no)? 

Como ven ahi se va a realizar el intercambio de llaves.. Ponemos yes.

Warning: Permanently added '192.168.100.136' (RSA) to the list of known hosts.
root@192.168.100.136's password:
Y como vemos ya tenemos para poner la password
Linux debian 2.6.32-5-686 #1 SMP Wed Jan 12 04:01:41 UTC 2011 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Feb 14 15:54:53 2011 from 192.168.100.1
root@debian:~#
root@debian:~# uname -a
Linux debian 2.6.32-5-686 #1 SMP Wed Jan 12 04:01:41 UTC 2011 i686 GNU/Linux
root@debian:~#
Ahora como ven estamos logueado en el equipo remoto.

Ahora volvamos al equipo local.

[rino@oc7287280510 ~]$ pwd && ls -ld .ssh
/home/rino
drwx------. 2 rino rino 4096 Feb 14 18:51 .ssh
[rino@oc7287280510 ~]$

Como ven se creo un directorio que se llama .ssh en el home directory del usuario el cual contiene estos archivos.

[rino@oc7287280510 ~]$ pwd && ls -l .ssh
/home/rino
total 104
-rw-------. 1 rino rino  1002 Aug 25 21:58 authorized_keys
-rw-rw-r--. 1 rino rino    62 Jul 22  2010 config.ssh
-rw-------. 1 rino rino   672 May  2  2010 id_dsa
-rw-r--r--. 1 rino rino   607 May  2  2010 id_dsa.pub
-rw-r--r--  1 rino rino 77941 Feb 14 18:52 known_hosts
-rw-------. 1 rino rino  1743 Jul 22  2010 rino
-rw-r--r--. 1 rino rino   399 Jul 22  2010 rino.pub
[rino@oc7287280510 ~]$

El archivo que nos creo fue el known_hosts que es el que contiene todas las llaves publicas de los servidores remotos que me quiero conectar.
Los demas archivos que figuran son porque en mi caso tengo mis llaves (publicas y privadas) que genere yo para poder conectarme a los equipos remotos sin necesidad de poner ninguna clave.. Eso lo vamos a ver mas adelante.

Si se fijan pueden buscar en el archivo mencionado anteriormente si esta la llave.

[rino@oc7287280510 .ssh]$ cat known_hosts |grep -i "192.168.100.136"
192.168.100.136 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvwJeIutxTZiydnLX+mOGenaYj5g2AKTpztQGFV4pSZxJLe9G0gsnrqZb2Amfe7ibaKqRMCy8OAPJfXJGmOyRVOHvqHnxeDifdXI9u81+qkBQRmuqV+6niqx1BxjWov7LnsiVmEnQDj3rlVe8t3WW5tOujdBTster29ECH0XfaiJdbzEF4xq0wdm0CknGwGha5DkkdWmoXlQh4fXrxsjHyIYSe5MpsIiaFsxp29M7ecxIaGcXct6twS0rABBD/pKrvrg6GMx2CUHaJC3AuoHajlxo7PoaHCv/c1pWZMlKNP4uSon+RH7ficNZ1MXiHsudm6O5gOEZFtTTdLzytxcPj
[rino@oc7287280510 .ssh]$

Si la borran (eso de arriba es toda una linea) , la proxima vez que se conectan a ese equipo le va a pedir devuelta que confirmen el intercambio de llaves.
Para conectarnos a un servidor remoto la sintaxis basica es asi.

ssh -l usuario ip/fqdn
ssh usuario@fqdn
Ejemplo:
ssh -l pepe 192.168.1.1
ssh -l pepe@mipc.com

Teoria llaves asimetricas

Una breve introduccion:

Breve introducción a la criptografía
En general, se pueden utilizar dos métodos de cifrado: simétrica y asimétrica.
El cifrado Simétrico es más rápido pero menos seguro, y el cifrado asimétrico es más lento pero más seguro.
En un medio ambiente con clave simétrica, ambas partes utilizan la misma clave para cifrar y descifrar mensajes.
Con las claves asimétricas, una clave pública y una clave privada se utilizan, y esta es la técnica importante que es utilizada para SSH.
Si las claves asimétricas son utilizadas, cada usuario tiene su propia clave pública / clave privada, y cada equipo necesita un par de ellas. De estas claves, la clave privada debe ser protegida en todo momento: si la clave privada se ve comprometida, la identidad del propietario de la clave privada se pone en peligro.
En resumen, el robo de usuarios de la clave privada es como el robo de identidad de un usuarios. Por lo tanto, una clave privada se almacena normalmente en un lugar muy seguro donde nadie más que su propietario puede acceder a él, por regla general se graba ~./ssh. La clave pública, por el contrario, está disponible a todo el mundo.
La clave Pública / Privada se utiliza generalmente para tres propósitos: encriptación, autenticación y no rechazo.
Para enviar un mensaje cifrado, el remitente cifra el mensaje con la clave pública del receptor que puede descifrar con la clave privada correspondiente. Este escenario requiere que, antes de el envío de un mensaje cifrado, usted tenga la clave pública de la persona que desea enviar el mensaje.
Las otras opciones son para utilizar las claves públicas y privadas para la autenticación o para probar que un mensaje no ha cambiado desde su creación. Este método se conoce como el no repudio. En el ejemplo de la autenticación, la clave privada se utiliza para generar una señal de token codificada. Si este token se puede descifrar con la clave pública de la persona que quiere autentificarse, esto demuestra que realmente está tratando con la persona adecuada, y el acceso puede ser concedido.
Sin embargo, esta técnica requiere que la clave pública sea copiada al host antes de que la autentificacion ocurra.

Utilizando modelo llave Publica/Privada en un ambiente con SSH.

Cuando la autenticación basada en claves se utiliza SSH , debe asegurarse de que, para todos los usuarios que necesitan utilizar esta tecnología, la clave pública está disponible en los equipos que se quieran acceder . Al entrar, el usuario crea una solicitud de autenticación en donde se utiliza la firma de la clave privada del usuario . Esta solicitud de autenticación se corresponde con la clave pública del mismo usuario en el equipo en el que el usuario desea ser autenticado. Si coincide, el usuario tiene permiso de acceso; Si no es así, el acceso de usuario se le niega.
La clave Pública / privada de autenticación está habilitada por defecto en todas las principales distribuciones de Linux.
Los pasos siguientes proporcionan un resumen de lo que sucede cuando un usuario intenta establecer una sesión SSH con un host:

1. Si la autenticación de clave pública está habilitada (por defecto), SSH comprueba el directorio en el directorio home del usuario para comprobar si una clave privada está presente.
2. Si una clave privada se encuentra, SSH crea un paquete con algunos datos en ella (token), cifra el paquete con la clave privada, y lo envía al host. La clave pública se envía también con este paquete.
3. El anfitrión ahora comprueba si un archivo con el nombre authorized_key en el home directory del usuario. Si no es así, el usuario no puede ser autenticado con sus llaves.
Si el archivo no existe y la clave pública es una clave permitida (y también es idéntica a la clave que ha sido seleccionada en el host), el host utiliza esta clave para comprobar la firma.
4. Si la firma se verifica, el usuario tiene acceso. Si la firma no puede ser verificada, el anfitrión le pide al usuario una contraseña en su lugar.

Todo esto suena bastante complicado, pero no lo es realmente. Todo sucede de forma transparente, si ha sido correctamente configurado. Además, lesto representa apenas un retraso significativo al establecer una conexión. Normalmente se requieren no más de un segundo.

Creacion llaves asimetricas

Vamos a realizar los pasos para crear nuestro juego de llaves y lograr que no tengamos que poner ninguna clave al conectarnos en un equipo remoto.[6]

Tenemos nuestro equipo ServidorA que va a ser nuestro equipo de trabajo

[rino@servidorA .ssh]$ hostname
servidorA
[rino@servidorA .ssh]$

Tenemos nuestro equipo ServidorB que va a ser el equipo donde nos vamos a conectar remotamente.

root@servidorB:~# hostname
servidorB
root@servidorB:~#

Paso 1 –> Crear llave publica y privada usando el comando ssh-key-gen en el servidor local

[test@servidorA ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa):
Created directory '/home/test/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/test/.ssh/id_rsa.
Your public key has been saved in /home/test/.ssh/id_rsa.pub.
The key fingerprint is:
9d:45:29:e0:78:47:c3:85:0b:9e:ef:b2:59:26:aa:82 test@servidorA
The key's randomart image is:
+--[ RSA 2048]----+
|        .oooo.   |
|       o..+o.    |
|      ..oo.o.    |
|       .oo.o     |
|        S.o      |
|          .      |
| .      ..o      |
|E .    ..=.      |
|   .... oo       |
+-----------------+
[test@servidorA ~]$

Paso 2 –> Copiar la llave publica en el servidor remoto utilizando ssh-copy-id

[test@servidorA ~]$ ssh-copy-id -i .ssh/id_rsa.pub rino@192.168.100.136
The authenticity of host '192.168.100.136 (192.168.100.136)' can't be established.
RSA key fingerprint is 7f:91:5b:59:fb:3e:2d:9a:74:5f:41:7d:4a:36:98:9b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.136' (RSA) to the list of known hosts.
rino@192.168.100.136's password:
[test@servidorA ~]$

Acuerdense que tienen que tener un usuario en el equipo remoto.
Esto va hacer un append de nuestra llave publica en el archivo remoto .ssh/authorized_key del servidor destino.

Paso 3 —> Autentificarse en el equipo remoto sin poner ningun password.

[test@servidorA ~]$ ssh rino@192.168.100.136
Linux debian 2.6.32-5-686 #1 SMP Wed Jan 12 04:01:41 UTC 2011 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Feb 14 19:43:11 2011 from 192.168.100.1
rino@servidorB:~$

Como ven no utilizamos ninguna password.

Ahora vamos a ver como utilizar ssh-add y ssh-agent.
Estos comandos nos van a servir para poder administrar nuestras llaves que se cargan cuando se inicia nuestra sesion. Imaginense que alguien se adueña de nuestras llaves como no la protegimos con una clave cualquiera se puede pasar por nosotros es por eso que necesitamos configurarle una clave.

[test@servidorA ~]$ ssh-keygen -p -t rsa
Enter file in which the key is (/home/test/.ssh/id_rsa):
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.
[test@servidorA ~]$

Ahora ya tenemos una clave para nuestras llaves.

[test@servidorA ~]$ ssh rino@192.168.100.136
Enter passphrase for key '/home/test/.ssh/id_rsa':
Linux debian 2.6.32-5-686 #1 SMP Wed Jan 12 04:01:41 UTC 2011 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Feb 14 19:57:21 2011 from 192.168.100.1
rino@servidorB:~$

Ahora como ven antes de hacer algo me pide que autentifique con la clave de las llaves.. Ya si alguien quiere usar mis llaves no puede..

La idea es que no tenga que poner siempre esa clave y eso lo vamos a lograr con ssh-add y ssh-agent.

[test@oc7287280510 ~]$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-JtWDS10101/agent.10101; export SSH_AUTH_SOCK;
SSH_AGENT_PID=10102; export SSH_AGENT_PID;
echo Agent pid 10102;
[test@oc7287280510 ~]$

*. Esos comandos que tiro por lineas lo tendriamos que copiar y pegar para que los ejecute la shell, pero seria muy engorroso asi que vamos a realizarlo de la siguiente manera.*
*. Tengan en cuenta que les va a pedir su passphrase.*

Entonces vamos a realizar otros pasos:

[test@oc7287280510 ~]$ eval `ssh-agent`
Agent pid 10194
[test@oc7287280510 ~]$

Aca entra en juego el ssh-ad para que agreguemos nuestra llave en memoria. Nos va a pedir nuestra clave de la llave.

[test@oc7287280510 ~]$ ssh-add
Enter passphrase for /home/test/.ssh/id_rsa:
Identity added: /home/test/.ssh/id_rsa (/home/test/.ssh/id_rsa)
[test@oc7287280510 ~]$

Ahora intentamos loguearnos al servidor remoto.

[test@oc7287280510 ~]$ ssh rino@192.168.100.136
Linux debian 2.6.32-5-686 #1 SMP Wed Jan 12 04:01:41 UTC 2011 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Feb 14 20:02:54 2011 from 192.168.100.1
rino@servidorB:~$

Como ven ya nos logueamos sin necesidad de poner ninguna clave. (ni la del usuario ni la de nuestra llave).
Lo unico malo de esto es que no es una buena idea ponerlo en .bashrc o .bash_profile , menos en /etc/profile.. Lo ideal seria en alguno de los scripts de inicio de nuestra sesion grafica para que cuando iniciemos la grafica nos pida que pongamos la password y ya queda nuestra llave cargada [7][8][9] porque sino solo quedaria la llave con la clave cargada unicamente en la shell donde lo ejecutamos en cambio si lo hacemos no bien entramos en nuestra sesion grafica ya queda definida de forma global.

Creando Tuneles

Sintaxis

ssh -R|L port:host:host_port [user@]hostname [command]

Cuando la opción principal es-L, ssh redirige el tráfico desde el puerto local (port) al puerto de la máquina remota(host:host_port)
Cuando un programa se conecta al puerto host local, la conexión se transmite al lado remoto.
Una aplicación muy útil para esto es que transmita los puertos locales al servidor de correo de su empresa para que pueda enviar correo electrónico como si estuviera en la oficina. Todo lo que tienes que hacer es configurar el cliente de correo electrónico para conectar con el puerto correcto en el servidor local. Mas adelante veremos un ejemplo.
Cuando se utiliza-R, ocurre lo contrario. El puerto (port) de la interfaz de host local de la máquina remota se une al equipo local, y las conexiones que le serán enviadas a la máquina local dada por el host: host_port.

Ejemplo
Acceda a login.example.com. Entonces, redireccione las conexiones hacia localhost puerto 2525 al puerto 25 en mail.example.com, que seguramente va a rechazar la retransmisión para usted. La razón es porque la unión con el puerto 2525 tiene que ser creada por root en el puerto 25:
$ ssh-L 2525: mail.example.com: 25 login.example.com
En el sentido de que podemos forwardear estos puertos y otros para crear un tunel cifrado de datos en ambas partes.
Otros ejemplos y teoria [14][15]
La idea es que generemos un tunel (comunicacion) entre dos puntos ya sea de un lado o del otro para poder tener nuestros datos cifrados.
Igualmente recomiendo ver las paginas mencionadas para estar mas a fin con el concepto aca solamente se meniciona la sintaxis.

Veamos un ejemplo mas.

Supongamos que querramos enviar un mail con telnet utilizando un servidor de correo externo en este caso mail.restauradordeleyes.com.ar

[rino@oc7287280510 ~]$ telnet mail.restauradordeleyes.com.ar 25
Trying 38.108.125.71...
Connected to mail.restauradordeleyes.com.ar.
Escape character is '^]'.
220 wiki.itrestauracion.com.ar ESMTP Sendmail 8.13.8/8.13.8; Tue, 15 Feb 2011 21:37:57 +0300
helo mail.restauradordeleyes.com.ar
250 wiki.itrestauracion.com.ar Hello cpe-200-115-224-64.telecentro-reversos.com.ar [200.115.224.64] (may be forged), pleased to meet you
mail from: rino@restauradordeleyes.com.ar
250 2.1.0 rino@restauradordeleyes.com.ar... Sender ok
rcpt to: villadalmine@gmail.com
550 5.7.1 villadalmine@gmail.com... Relaying denied. IP name possibly forged [200.115.224.64]

Como ven nos rechaza porque esta bien configurado no nos permite hacer relay por lo cual necesitamos si o si crear un tunel hacia el mail server.

Entonces antes que nada creamos el tunel.

[rino@oc7287280510 ~]$ ssh -L 2525:localhost:25 root@mail.restauradordeleyes.com.ar
bienvenido a mi sistema %a. Tu IP esta siendo guardada para mayor seguridad
root@mail.restauradordeleyes.com.ar's password:
Last login: Tue Feb 15 21:33:40 2011 from 200.115.224.64
[root@villadalmine ~]#

Como ven lo redireccionamos al puerto 2525 pero si queriamos hacerlo sobre el puerto 25 de nuestra maquina tenemos que tener cuidado que no este corriendo un smtp en ese puerto y lo vamos a tener que abrir como root.

Ahora vamos a ver como si nos deja enviar un mail.

[root@oc7287280510 ~]# telnet localhost 2525
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 wiki.itrestauracion.com.ar ESMTP VersionZZ XXXX; Tue, 15 Feb 2011 21:42:33 +0300
helo mail.restauradordeleyes.com.ar
250 wiki.itrestauracion.com.ar Hello localhost.localdomain [127.0.0.1], pleased to meet you
mail from:rino@restauradordeleyes.com.ar
250 2.1.0 rino@restauradordeleyes.com.ar... Sender ok
rcpt to: villadalmine@gmail.com
250 2.1.5 villadalmine@gmail.com... Recipient ok
data
354 Enter mail, end with "." on a line by itself
HOla este es un mail de prueba
.
250 2.0.0 p1FIgXUA015400 Message accepted for delivery
quit
221 2.0.0 wiki.itrestauracion.com.ar closing connection
Connection closed by foreign host.
[root@oc7287280510 ~]#

Y como ven ahora si nos dejo enviar un mail :) .

Ejemplo con tunel reverso.

En el equipo B tenemos corriendo apache con una pagina pero este host esta nateado detras de una red privada como hariamos para mostrarle la pagina a nuestro cliente remoto que tiene linux ??
Facil primero le tenemos que pedir que nos habilite el puerto 22 y que deje corriendo ssh con un usuario que el nos provee asi luego vamos conectarnos a la pc de el para que despues se abra el tunel y el pueda poner en su navegador locahost:8080 y vea la pagina que tenemos en nuestro servidor privado.

Abrimos el tunel del lado del equipo que esta corriendo apache para conectarnos al equipo del cliente.
root@servidorB:~# ssh -R 8080:localhost:80 rino@192.168.1.102
The authenticity of host ’192.168.1.102 (192.168.1.102)’ can’t be established.
RSA key fingerprint is 3a:c4:01:ea:36:0c:26:91:dc:78:5b:7b:b0:e7:6b:72.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ’192.168.1.102′ (RSA) to the list of known hosts.
rino@192.168.1.102′s password:
Last login: Thu Jan 27 17:29:41 2011
[rino@oc7287280510 ~]$

Ahora telefoneamos al cliente y le decimos que pruebe poner en le navegador localhost:8080

El cliente va a tipear en una terminal o en un navegador lo siguiente.

Si es una terminal –> lynx localhost:8080 y esto le va a devolver..

            It works! Usted esta viendo la pagina de mi web privada

   This is the default web page for this server.

   The web server software is running but no content has been added, yet.
Commands: Use arrow keys to move, '?' for help, 'q' to quit, '<-' to go back.
  Arrow keys: Up and Down to move.  Right to follow a link; Left to go back.
 H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list 

Asi entonces abrimos un tunel reverso.. y escapamos al firewal interno porque viaja todo por otro puerto..

Teoria GPG[17]

Historia

GPG inicialmente fue desarrollado por Werner Koch. La versión 1.0.0 fue lanzada el 7 de septiembre de 1999. El ministerio de Economía y Tecnología del Gobierno Alemán financió la documentación y la versión a Microsoft Windows en el año 2000.

Usos de GPG

GPG es estable, calificado como un software para el uso en producción y es comúnmente incluido en los sistemas operativos como FreeBSD, OpenBSD, NetBSD y últimamente con todas las distribuciones GNU/Linux.

Aunque básicamente el programa tiene una interfaz textual, actualmente hay varias aplicaciones gráficas que utilizan recursos de GPG. Por ejemplo, ha sido integrado dentro de Kmail y Evolution, también hay un plugin llamado Enigmail que se integra con Mozilla y Thunderbird que trabajan en Windows, GNU/Linux y otros sistemas operativos. Debido a que los plugins no forman parte del mecanismo de GPG y no están especificados en los estándares OpenPGP, ni sus respectivos desarrolladores están vinculados con los proyectos de plugins, se podría pensar que las ventajas de seguridad de GPG puedan estar comprometidas o incluso perdiendo su efectividad como resultado de esta falta de coordinación y apoyo, pero al ser las herramientas de código abierto o scripts interpretados (como en el caso de los plugins en Thunderbird), se garantiza un funcionamiento fiable con la herramienta GPG.

GPG también puede ser compilado en otras plataformas como Mac OS X y Windows. En Mac OS X hay portada una aplicación libre llamada MacGPG, que ha sido adaptada para usar el ambiente del usuario y sus definiciones de clases nativas. La compilación cruzada no es un ejercicio trivial, por lo menos en parte debido a que las provisiones de seguridad cambian con el sistema operativo y su adaptación a menudo se vuelve difícil, pero los compiladores de alta calidad deben producir ejecutables que interactúen correctamente con otras implementaciones GPG.

Como trabaja GPG

GPG cifra los mensajes usando pares de claves individuales asimétricas generadas por los usuarios. Las claves públicas pueden ser compartidas con otros usuarios de muchas maneras, un ejemplo de ello es depositándolas en los servidores de claves. Siempre deben ser compartidas cuidadosamente para prevenir falsas identidades por la corrupción de las claves públicas. También es posible añadir una firma digital criptográfica a un mensaje, de esta manera la totalidad del mensaje y el remitente pueden ser verificados en caso de que se desconfíe de una correspondencia en particular.

GPG no usa algoritmos de software que están restringidos por patentes, entre estos se encuentra el algoritmo de cifrado IDEA que está presente en PGP casi desde sus inicios. En su lugar usa una serie de algoritmos no patentados como ElGamal, CAST5, Triple DES (3DES), AES y Blowfish. También es posible usar IDEA en GPG descargando un plugin extra, sin embargo este puede requerir una licencia para usuarios de algunos países en donde esté patentada IDEA.

GPG es un software de cifrado híbrido que usa una combinación convencional de criptografía de claves simétricas para la rapidez y criptografía de claves públicas para el fácil compartimiento de claves seguras, típicamente usando recipientes de claves públicas para cifrar una clave de sesión que es usada una vez. Este modo de operación es parte del estándar OpenPGP y ha sido parte del PGP desde su primera versión.

Problemas

El estándar OpenPGP especifica varios métodos de mensajes con firmas digitales. Debido a un error al intentar mejorar la eficiencia de uno de los métodos, se introdujo una vulnerabilidad de seguridad (Nguyen 2004) que afectó a un único método de mensajes firmado digitalmente utilizado en algunas versiones de GPG (desde la 1.0.2 hasta la 1.2.3, con menos de 1.000 claves listadas en los servidores de claves). Dicha vulnerabilidad ha sido corregida a partir de la versión 1.2.4 de GPG. El episodio ilustra la dificultad de realizar implementaciones correctas de algoritmos criptográficos, protocolos e incluso criptosistemas.

GPG es un sistema en línea de comandos. Diferentes implementaciones gráficas están disponibles pero sólo algunas tienen implementadas todas sus características (por ejemplo: borrado de ID, usuarios o firmas). Debido a que todas las instrucciones deben ser pasadas a la línea de comandos, rápidamente llegan a dificultar el uso correcto de aspectos no triviales del programa. El trabajo sobre una versión de librería está en progreso.

Uso GPG

Vamos a ver como usariamos gpg para tener un conocimiento basico sobre el y poder estar listo para rendirlo en LPIC-1.

Generar nuestra llave gpg.

rino@servidorB:~$ gpg --gen-key
gpg (GnuPG) 1.4.10; Copyright (C) 2008 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection?
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
        = key expires in n days
      w = key expires in n weeks
      m = key expires in n months
      y = key expires in n years
Key is valid for? (0) 4
Key expires at Sat 19 Feb 2011 03:05:33 PM EST
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) "

Real name: RinoRondan
Email address: rino@restauradordeleyes.com.ar
Comment: This is a Test
You selected this USER-ID:
    "RinoRondan (This is a Test) "

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
.....+++++
.............+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
..+++++
..+++++
gpg: /home/rino/.gnupg/trustdb.gpg: trustdb created
gpg: key B32E99FF marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2011-02-19
pub   2048R/B32E99FF 2011-02-15 [expires: 2011-02-19]
      Key fingerprint = DEDF F9DE D3EF F481 5DC6  4829 A2D2 DE78 B32E 99FF
uid                  RinoRondan (This is a Test) 
sub   2048R/56E6C627 2011-02-15 [expires: 2011-02-19]

rino@servidorB:~$

Si llegamos a tener este error -->

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 285 more bytes)

Tenemos que instalarnos la tool rng-tools y editar el archivo /etc/default/rng-tools agregandole el device -->HRNGDEVICE=/dev/urandom.
Para luego restartear el servicio --> /etc/init.d/rng-tools start.

Bueno si todo salio bien van a tener una pantalla similar a la de arriba.

Ahora vamos a ver como listamos nuestra llave creada.

rino@servidorB:~$ gpg --list-keys
/home/rino/.gnupg/pubring.gpg
-----------------------------
pub   2048R/B32E99FF 2011-02-15 [expires: 2011-02-19]
uid                  RinoRondan (This is a Test) 
sub   2048R/56E6C627 2011-02-15 [expires: 2011-02-19]

rino@servidorB:~$

Importar una llave publica al gpg keyring.

rino@servidorB:~$ gpg --export --armor rino@restauradordeleyes.com.ar > rinorondan.asc
rino@servidorB:~$ gpg --import rinorondan.asc
gpg: key B32E99FF: "RinoRondan (This is a Test) " not changed
gpg: Total number processed: 1
gpg:              unchanged: 1
rino@servidorB:~$

En este caso la llave publica ya la tengo... pero si tuviera una que me pasaran por mail con el gpg --import file bastaria.

Si quisiera editar una llave ..

rino@servidorB:~$ gpg --edit-key RinoRondan
gpg (GnuPG) 1.4.10; Copyright (C) 2008 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

pub  2048R/B32E99FF  created: 2011-02-15  expires: 2011-02-19  usage: SC
                     trust: ultimate      validity: ultimate
sub  2048R/56E6C627  created: 2011-02-15  expires: 2011-02-19  usage: E
[ultimate] (1). RinoRondan (This is a Test) 

gpg> help
quit        quit this menu
save        save and quit
help        show this help
fpr         show key fingerprint
list        list key and user IDs
uid         select user ID N
key         select subkey N
check       check signatures
sign        sign selected user IDs [* see below for related commands]
lsign       sign selected user IDs locally
tsign       sign selected user IDs with a trust signature
nrsign      sign selected user IDs with a non-revocable signature
adduid      add a user ID
addphoto    add a photo ID
deluid      delete selected user IDs
addkey      add a subkey
addcardkey  add a key to a smartcard
keytocard   move a key to a smartcard
bkuptocard  move a backup key to a smartcard
delkey      delete selected subkeys
addrevoker  add a revocation key
delsig      delete signatures from the selected user IDs
expire      change the expiration date for the key or selected subkeys
primary     flag the selected user ID as primary
toggle      toggle between the secret and public key listings
pref        list preferences (expert)
showpref    list preferences (verbose)
setpref     set preference list for the selected user IDs
keyserver   set the preferred keyserver URL for the selected user IDs
notation    set a notation for the selected user IDs
passwd      change the passphrase
trust       change the ownertrust
revsig      revoke signatures on the selected user IDs
revuid      revoke selected user IDs
revkey      revoke key or selected subkeys
enable      enable key
disable     disable key
showphoto   show selected photo IDs
clean       compact unusable user IDs and remove unusable signatures from key
minimize    compact unusable user IDs and remove all signatures from key

* The `sign' command may be prefixed with an `l' for local signatures (lsign),
  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures
  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).

gpg>

Cualquier cambio que hagan les va a pedir la clave para esa llave.

Todas las claves tienen un ID -->

pub 2048R/B32E99FF created: 2011-02-15 expires: 2011-02-19 usage: SC

Lo que esta resaltado en negrita es el ID de su clave gpg.

Exportar las llaves :
Ambas:
rino@servidorB:~$ gpg --export -o gpg_backup_file

Solo la privada:
rino@servidorB:~$ gpg --export-secret-key -a "RinoRondan" -o private.key
Les va a mostrar todo el string con la data de la clave privada.

Importar una clave por el ID

rino@servidorB:~/.gnupg$ gpg --recv-keys EF9AAD20
gpg: requesting key EF9AAD20 from hkp server keys.gnupg.net
gpg: key EF9AAD20: public key "G. Matthew Rice " imported
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2011-02-19
gpg: Total number processed: 1
gpg:               imported: 1
rino@servidorB:~/.gnupg$

Ahora firmamos el id que bajamos con la nuestra llave.

rino@servidorB:~/.gnupg$  gpg --edit-key G. Matthew Rice
gpg (GnuPG) 1.4.10; Copyright (C) 2008 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

pub  1024D/EF9AAD20  created: 2004-05-14  expires: never       usage: SC
                     trust: unknown       validity: unknown
sub  2048g/EC0B7A34  created: 2004-05-14  expires: never       usage: E
[ unknown] (1). G. Matthew Rice 
[ unknown] (2)  G. Matthew Rice 
[ unknown] (3)  G. Matthew Rice 
[ unknown] (4)  G. Matthew Rice 
[ unknown] (5)  G. Matthew Rice 
[ unknown] (6)  G. Matthew Rice 

Invalid command  (try "help")

Invalid command  (try "help")

gpg> lsign
Really sign all user IDs? (y/N) y

pub  1024D/EF9AAD20  created: 2004-05-14  expires: never       usage: SC
                     trust: unknown       validity: unknown
 Primary key fingerprint: BD41 69EA 33A4 B657 3A28  2A80 E006 CBF0 EF9A AD20

     G. Matthew Rice 
     G. Matthew Rice 
     G. Matthew Rice 
     G. Matthew Rice 
     G. Matthew Rice 
     G. Matthew Rice 

Are you sure that you want to sign this key with your
key "RinoRondan (This is a Test) " (B32E99FF)

The signature will be marked as non-exportable.

Really sign? (y/N) y

You need a passphrase to unlock the secret key for
user: "RinoRondan (This is a Test) "
2048-bit RSA key, ID B32E99FF, created 2011-02-15

gpg> tsign
Really sign all user IDs? (y/N) y
Your current signature on "G. Matthew Rice "
is a local signature.
Do you want to promote it to a full exportable signature? (y/N) y
Your current signature on "G. Matthew Rice "
is a local signature.
Do you want to promote it to a full exportable signature? (y/N) y
Your current signature on "G. Matthew Rice "
is a local signature.
Do you want to promote it to a full exportable signature? (y/N) y
Your current signature on "G. Matthew Rice "
is a local signature.
Do you want to promote it to a full exportable signature? (y/N) y
Your current signature on "G. Matthew Rice "
is a local signature.
Do you want to promote it to a full exportable signature? (y/N) y
Your current signature on "G. Matthew Rice "
is a local signature.
Do you want to promote it to a full exportable signature? (y/N) y

pub  1024D/EF9AAD20  created: 2004-05-14  expires: never       usage: SC
                     trust: unknown       validity: unknown
 Primary key fingerprint: BD41 69EA 33A4 B657 3A28  2A80 E006 CBF0 EF9A AD20

     G. Matthew Rice 
     G. Matthew Rice 
     G. Matthew Rice 
     G. Matthew Rice 
     G. Matthew Rice 
     G. Matthew Rice 

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I trust marginally
  2 = I trust fully

Your selection? 2

Please enter the depth of this trust signature.
A depth greater than 1 allows the key you are signing to make
trust signatures on your behalf.

Your selection? 1

Please enter a domain to restrict this signature, or enter for none.

Your selection? 1

Are you sure that you want to sign this key with your
key "RinoRondan (This is a Test) " (B32E99FF)

Really sign? (y/N) y

You need a passphrase to unlock the secret key for
user: "RinoRondan (This is a Test) "
2048-bit RSA key, ID B32E99FF, created 2011-02-15

gpg> quit
Save changes? (y/N) y

Ahora listamos:

rino@servidorB:~/.gnupg$ gpg --list-keys
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   1  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: depth: 1  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 1f, 0u
gpg: next trustdb check due at 2011-02-19
/home/rino/.gnupg/pubring.gpg
-----------------------------
pub   2048R/B32E99FF 2011-02-15 [expires: 2011-02-19]
uid                  RinoRondan (This is a Test) 
sub   2048R/56E6C627 2011-02-15 [expires: 2011-02-19]

pub   1024D/EF9AAD20 2004-05-14
uid                  G. Matthew Rice 
uid                  G. Matthew Rice 
uid                  G. Matthew Rice 
uid                  G. Matthew Rice 
uid                  G. Matthew Rice 
uid                  G. Matthew Rice 
sub   2048g/EC0B7A34 2004-05-14

rino@servidorB:~/.gnupg$

Ahora encriptamos con un archivo nuestro para que solo lo pueda abrir una persona.

rino@servidorB:~/.gnupg$ gpg -e -u "RinoRondan" -r "G. Matthew Rice" rino
rino@servidorB:~/.gnupg$

Despues cuando Matthew reciba el archivo el lo va a poder desencriptar asi..
gpg -d rino.gpg

Como subir mi ID a un servidor de llaves publicas

gpg --keyserver keys.gnupg.net --recv-key ID

Si quisieramos buscar mas sobre como funciona tendriamos que entender sobre estos archivos:

En el examen de LPI solo nos van a pedir que identifiquemos los archivos que estan en ~/gpg/.

gpg.conf
Nos permite crear los seteos por defectos para GPG, incluyendo nuestro servidor de llaves preferido. En donde este servidor contiene las llaves publicas de los que deseen subirla.

pubring.gpg
Contiene las llaves publicas que importamos.

random_seed
Un archivo de texto que contiene caracteristicas que permitiran a GPG crear numeros aleatorios mas facil y rapidamente.

secring.gpg
Contiene la llave privada que determina nuestra identidad.

trustdb.gpg
La base de datos de confianza, que contiene la información relativa a los valores de la confianza que ha asignado a varias claves públicas. Un usuario puede establecer diferentes niveles de confianza para las claves públicas en su anillo dominante.

Uso de GPG con Gmail

Para poder usar nuestras llaves con gmail vamos a tener que usar el thunderbird y activar el plugin Enigmail o bajarselo con aptitude.
Luego pueden utilizar el wizzar de thunderbird para habilitar la cuenta de gmail y despues configurar su llaves. Acuerdense de antes generar sus llaves con gpg.
Tambien pueden utilizar FreeGPG para firefox en donde van a poder utilizar gpg con gmail.
Aca les dejo un link donde explica --> https://security.ngoinabox.org/es/thunderbird_usarenigmail

Fuente:

http://es.wikipedia.org/wiki/OpenSSH

[2]http://es.wikipedia.org/wiki/Clave_pública
[3]http://ubuntulife.wordpress.com/2007/03/30/exportar-el-display-ejecutar-aplicaciones-x-remotas-en-local/
[4]http://www.gnupg.org/gph/es/manual.html#AEN210
[5]http://codesorcery.net/old/mutt/mutt-gnupg-howto
[6]http://www.thegeekstuff.com/2008/11/3-steps-to-perform-ssh-login-without-password-using-ssh-keygen-ssh-copy-id/
[7]http://docs.fedoraproject.org/en-US/Fedora/13/html/Deployment_Guide/s2-ssh-configuration-keypairs.html
[8]http://www.ucolick.org/~sla/ssh/agenttips.html
[9]https://wiki.archlinux.org/index.php/Using_SSH_Keys
[10]http://fedoraproject.org/wiki/DocsProject/UsingGpg/CreatingKeys
[11]https://security.ngoinabox.org/es/thunderbird_usarenigmail
[12]http://www.dotdeb.org/2010/07/11/dotdeb-packages-are-now-signed/
[13]http://www.itrestauracion.com.ar/?p=26
[14]http://www.e-ghost.deusto.es/docs/articulo.ssh.html
[15]http://crysol.org/es/node/1317
[16]http://www.rossde.com/PGP/index.html
[17]http://es.wikipedia.org/wiki/GNU_Privacy_Guard
[18]http://www.howtoforge.com/helping-the-random-number-generator-to-gain-enough-entropy-with-rng-tools-debian-lenny
[19]http://technologist.pro/systems/encrypt-data-using-gpggnu-privacy-guard

Share
This entry was posted in Lpi, Redes and tagged , . Bookmark the permalink.

Leave a Reply