Nov
05
2008
0

Autenticación de usuarios mediante certificados


Suele ser cada vez más normal que se nos requiera a los administradores de sistemas una forma alternativa para acceder a los correos corporativos desde cualquier lugar del mundo, además de usando el cliente de correo. Normalmente esta opción suele ser usar algún tipo de webmail.

Bajo mi punto de vista ésta es sin duda una forma muy cómoda de acceder al correo electrónico, y al mismo tiempo un peligro en potencia. Los usuarios y muchos administradores de sistemas suelen dormir tranquilos cuando instalan este servicio usando https y protegido con un login y un password para cada usuario que tenga cuenta en el servidor. Sin embargo, en mi caso, son numerosos los dolores de barrigua que me produce el pensar que cualquiera desde un ciberbar puede ver los correos de la gente a la que se supone que protejo con el simple hecho de saber la clave del usuario…

Donde actualmente trabajo, existe una gran cantidad de consultores que viajan alrededor de todo el mundo y usan en ocasiones el webmail desde algún ordenador que les proporciona el cliente al que van a prestar la consultoría. Es muy fácil que a un cliente poco avanzado se le ocurra echar un ojo por encima del hombro de mi consultor cuando va a teclear la clave, para luego poder usarla él tranquilamente desde su casa. Un cliente un poco más avanzado podría incluso instalar un keylogger en esa máquina, con lo que el trabajo sería aún más fácil. Entonces… ¿cuál es la solución? La solución pasa por mejorar el sistema de autentificación. Hay que autentificarse no sólo por una clave que sabes, sino que también debes usar un certificado que tienes. Probablemente en tu pendrive, que debes guardar como si fuese tu tarjeta de crédito.

Doy por hecho de que ya tenemos un servidor Apache bajo Linux instalado, por lo que voy a pasar a cómo generar los certificados para los clientes.

En este caso, nosotros mismos seremos la autoridad certificadora (CA) que firmará los certificados del cliente, autoridad que hay que guardar de forma segura y sólo poder acceder a ella los administradores de sistemas. Espero que este mini-manual os sirva de ayuda. Tened en cuenta que tendréis que adaptar los comandos ejecutados para que se ajusten a vuestra estructura de directorio. Esta instalación se ha hecho en una distribución Gentoo, pero sirve para cualquiera.

Paso 1: Configuración Apache y SSL

Ahora vamos a hacer que escuche en el puerto 443 para conexiones seguras. Es decir, para el protocolo https.

Añadimos lo siguiente al fichero /etc/apache2/vhosts/00_default_ssl_vhost.conf:


Listen 443
SSLEngine on
SSLOptions +StrictRequire

SSLProtocol -all +TLSv1 +SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM

SSLMutex file:/var/log/apache2/ssl_mutex

SSLRandomSeed startup file:/dev/urandom 1024
SSLRandomSeed connect file:/dev/urandom 1024

SSLSessionCache shm:/var/log/apache2/ssl_cache_shm
SSLSessionCacheTimeout 600

SSLPassPhraseDialog builtin
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key

SSLVerifyClient none
SSLProxyEngine off

AddType application/x-x509-ca-cert      .crt
AddType application/x-pkcs7-crl         .crl

SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

NOTA: En el fichero de configuracion del apache, esa linea anterior debe ir sin los \.

Antes de arrancar de nuevo nuestro Apache tendremos que generar los certificados, que estarán firmados por nosotros mismos. Se supone que nos los tendria que dar alguna empresa tipo VeriSign, pero para lo que nosotros queremos, nos bastamos y nos sobramos.

servidor:/etc/apache2/ssl# openssl req -new -x509 -days 30 -keyout /etc/apache2/ssl/server.key -out /etc/apache2/ssl/server.crt -subj ‘/CN=Javi-Test-Certificate’

(Para más información sobre la sintaxis ir a www.openssl.org)

servidor:/etc/apache2/ssl# openssl req -new -x509 -days 30 -keyout /etc/apache2/ssl/server.key -out
/etc/apache2/ssl/server.crt -subj ‘/CN=Organizacion-Test-Certificate’

Generating a 1024 bit RSA private key
..++++++
.......................................++++++
writing new private key to '/etc/apache2/ssl/server.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

Desde ahora cuando arranquéis Apache os pedirá la clave. En realidad es configurable, pero por defecto os lo pedirá.

Una vez arrancado ya podéis conectaros poniendo desde el mismo ordenador, en un navegador https://localhost

Os saldrán los datos del certificado.

Si es así es que vamos bien.

Ahora vamos a cambiar la configuración, para que cada cliente que se vaya a conectar a nuestro web tenga que tener un certificado instalado en su navegador.

Paso 2: Hacemos que el servidor nos pida un certificado

Para eso, cambiamos configuración en Apache cambiando los siguientes valores:

SSLVerifyClient require
SSLVerifyDepth 1

Ese valor a 1 significa el numero máximo de intermediarios que aceptamos en el certificado. Si lo ponemos a 1 significa que todos los certificados tienen que estar firmados directamente por el CA que indiquemos. En este caso somos nosotros mismos.

Una vez que hagamos esos cambios y volvamos a rearrancar el servidor, veremos que ya no nos podemos conectar, y eso se debe a que no tenemos instalado ningún certificado en nuestro navegador; por lo tanto no tiene éxito la negociación y nos echa.

Tenemos que indicar Apache cuál es la entidad certificadora. En nuestro caso está en /etc/apache2/ssl/server.crt

Para ello, en httpd.conf añadimos:

SSLCACertificateFile /etc/apache2/ssl/server.crt

Reiniciamos Apache para ver que va todo bien.

Paso 3: Generación de certificados para clientes

Generación de certificados para la gente que queramos que vea nuestra web.

La creación de certificados para el cliente es muy similar a la que seguimos para la generación de certificados para el servidor.

Mediante este comando creamos una clave cliente:

servidor:/etc/apache2/ssl#openssl req -new -sha1 -newkey rsa:1024 -nodes -keyout client.key -out request.pem -subj ‘/O=Secure/OU=Organizacion/CN=Javi’

Eso genera dos ficheros, client.key y request.pem (éste debe ser firmado por la CA, en este caso nosotros). La CA se supone que debe de asegurarse que la información es real antes de firmar nada.

Ahora toca firmarla. Te puedes poner a configurar el fichero openssl.cnf, pero yo lo que hice fue copiar el directorio /usr/lib/ssl/misc/demoCA a mi directorio CA, con lo que me quedó la siguiente estructura:

javi@servidor:~$ tree CA
CA
|-- demoCA
|   |-- cacert.pem
|   |-- careq.pem
|   |-- certs
|   |-- crl
|   |-- index.txt
|   |-- index.txt.attr
|   |-- index.txt.old
|   |-- newcerts
|   |   `-- 91213828FA1E8EA9.pem
|   |-- private
|   |   `-- cakey.pem
|   `-- serial
|-- requests
|   `-- request.pem
`-- signed
`-- signed.pem

Una vez ejecutado:

servidor:/etc/apache2/ssl# openssl ca -config /usr/lib/ssl/openssl.cnf -keyfile /etc/apache/ssl/server.key -cert /etc/apache2/ssl/server.crt -policy policy_anything -out /etc/apache2/ssl/CA/signed.pem -infiles /etc/apache2/ssl/CA/requests/request.pem

Tenemos el fichero signed.pem listo para enviar al cliente.

El cliente por tanto, una vez recibido ese fichero, tendrá en un directorio los
siguientes ficheros:

  • client.key
  • request.pem
  • signed.pem

Ahora tiene que guardarlo todo en un certificado con formato PKCS#12 y para eso hace:

openssl pkcs12 -export -clcerts -in signed.pem -inkey client.key -out client.p12

Y ya para finalizar hay que cargar el certificado client.p12 en el navegador. Cada navegador tendrá un procedimiento para hacer esto.

Share
Written by Javier Rodriguez in: Web | Etiquetas:
Abr
28
2008
0

Crea un fichero .htaccess online


.htaccess editor es una herramienta online que nos permite generar rápidamente un archivo .htaccess para alojarlo en nuestro sitio web. Para utilizarlo, solo tenemos que ir seleccionando cada ítem de la izquierda y darle el permiso adecuado.

Luego, cuando hayamos definidos los parámetros necesarios, en la parte inferior de la página podemos copiar el texto, que pegaremos a nuestro archivo .htaccess.

htaccesseditor.gif

.htaccess es el nombre de un archivo de texto que se coloca en el directorio de una página web, para configurar algunos cambios en el servidor. Cada línea del archivo contiene una regla. Cada regla se aplica únicamente en el directorio donde se encuentra, incluyendo sus subdirectorios y ficheros.

Crear un .htaccess es muy sencillo, abrímos el bloc de notas escribimos las directivas y lo guardamos con el nombre “.htaccess” (incluye las comillas, para guardarlo sin la extensión .txt). Ahora, sólo debemos subir el archivo a nuestro , y éste lo procesará cada vez que un cliente realice una petición.

Ejemplos de .htaccess que todo webmaster debería conocer

En Password Robot blog, han publicado un interesante artículo con 5 ejemplos .htaccess sencillos y muy útiles, cómo para ponerlos en práctica rápidamente. Aquí los comentamos y ampliamos:

1. Redireccionamiento

Imagina que necesitas enviar a todos tus visitantes a una página en especial, mientras realizas el mantenimiento de tu sitio web:

order deny,allow
deny from all
allow from 123.123.123.123

ErrorDocument 403 /pagina.html

<Files page.html>
allow from all
</Files>

Reemplaza el 123.123.123.123 con tu dirección IP y «pagina.html» con el nombre de la página que deseas que tus visitantes vean.

2. Bloqueo de IPs

Pero el redireccionamiento no lo es todo. Ahora imagina, ¿Qué sucedería si hay un crawlers o un boot spam que sobre carga tu servidor con peticiones inútiles o consultas fastidiosas? ¿Cómo los bloqueamos?

Order allow, deny
Deny from 123.123.123.123
Allow from all

Donde 123.123.123.123 es la dirección ip a bloquear. Si se percatan, las directivas son muy similares a la anterior, con la diferencia, que en la primera denegamos el acceso a todos los visitantes, mientras que en la actual a uno.

3. Transfiriendo Page Rank

Esto se aplica a los casos en que hemos movido o renombrado una página web en nuestro sitio y queremos que todos nuestros visitantes sean enviados a la nueva url. La alternativa, que incluye la transferencia de PageRank, para el posicionamiento en buscadores, es:

Redirect 301 /pagina_antigua.html http:// tusitio.com/ pagina_nueva.html

Con el redireccionamiento 301, la página nueva no pierde el valor ganado por la página antigua.

4. Prevenir la navegación en un directorio

Esto es algo que a veces se nos olvida. Cuando un directorio no tiene la página de index, cualquier visitante puede observar los archivos contenidos en el directorio, y navegar a través de ellos. Si nosotros queremos prevenir esto, sólo debemos escribir lo siguiente:

Options All -Indexes

5. Página de Error 404 personalizada

Por defecto, el servidor Apache muestra una página de error 404 “404 File Not Found”, cuando nuestros visitantes acceden a una página que en el momento no existe.

Sin embargo, la página por defecto es poco usable y no deja una buena impresión. Por lo que, podríamos crear una página especial, a la cual redirigir cada vez que se produce el error 404.

ErrorDocument 404 /404.html

Donde 404.html es el nombre de la página personalizada, que queremos que nuestros visitantes vean.

6. Reescribir URLs amigables

Cuando tenemos dos urls amigables, por lo general se recomienda escoger la más corta y fácil de recordar. Por ejemplo:

RewriteEngine on
RewriteRule ^contacto/$ /pages/contacto.html [L]

Aquí le decimos al servidor Apache, que active el modulo mod_rewrite (RewriteEngine on) y muestre el contenido de “/pages/contacto.html” cada vez que cualquier visitante ingrese a “http://tusitio.com/contacto”. Con la bandera L, detenemos el proceso si es que se cumple la condición, de esta manera ahorramos recursos.

7. Directorios restringidos con contraseñas

En los casos en que necesitemos permitir el acceso a un directorio sólo a determinadas personas, podemos configurar nuestro servidor apache para cubrir esta necesidad. Básicamente, son 2 pasos los que hay que seguir:

Paso 1.- Crear el .htaccess, en el directorio a restringir

AuthUserFile /full/path/to/.htpasswd
AuthName «Ingresar»
AuthType Basic

require user nombre_de_usuario

El archivo .htpasswd no debe estar en un directorio accesible a cualquier cliente web. No se olviden de probar esto.

Paso 2.- Crear el fichero .htpasswd

El ficher .htpasswd debe contener el nombre de usuario y la contraseña, que Apache solicitará. La contraseña debe estar cifrada.

nombre_de_usuario:password_encriptado

Extraido de BaluArt.net

Share
Written by Javier Rodriguez in: Linux,Web | Etiquetas: ,

Theme: TheBuckmaker.com Blog Themes | Hostpapa customer, Berlin