Вы находитесь на странице: 1из 28

ALEJANDRO ARBOLEDA

SENA 2009

OPENSSL EN LINUX “Autenticacion de un Servidor Web”

Las nuevas Tecnologías de la Información han tomado las redes como eje para el desarrollo de
diferentes sistemas de interacción, en los que la transmisión de información se convierte en una de
las principales preocupaciones, pues esta es la fuente y el sustento de los procesos que aquí se
manejan. La web posiblemente como la red mundial mas grande de transmision de datos no se
escapa de gran variedad de ataques que pretenden vulnerar cualquiera de los principios de la
informacion, Confidencialidad, Integridad, Disponibilidad y No repudio, por esto, personas y
comunidades interesadas en mejorar la seguridad en las comunicaiones han desarrollo una serie de
herramientas que pretenden generar confianza en el momento del intercambio de datos.

SSL y TLS son dos protocolos creados con la finalidad de añadir a las capas de aplicación y
tranporte del modelo OSI una serie de componetes capaces de cifrar los paquetes que en nuestro
caso se enviaran desde los clientes hacia servidores web y viceversa, permitiendo que el
intercambio de datos este encriptado bajo algoritmos RSA (Clave pública / Clave privada). En el
caso de los servidores web, estos deberan poseer un certificado aprobado por un tercero confiable
que indicara al cliente (navegador web) su identidad y quien la corrobora, por su parte el navegador
debe soportar la notificación de comprobación de identidad del servidor al cual se conecta y
responder con sus credenciales si el servidor asi lo requiere.

A continuación mostraremos como generar certicados digitales y como crear la entidad que los
firmara, otorgando confianza “local” puesto que para esto se han creado entidades externas
encargadas de hacerlo, lo que trataremos en este documento sera la implementación de un servidor
web trabajando con los protocolos seguros SSL, crear la Autoridad Certificadora propia,
basicamente la implemetación de la Infraestructura de Llave Pública.

Los navegadores web reconocen, por defecto, una serie de autoridades certificadoras como Verisign
o Thawte, aunque hay muchas más. Puedes verlas todas en las opciones de tu navegador. Pero, ¿qué
es realmente lo que hace una Autoridad Certificadora? Firmar. Firma tu certificado SSL asegurando
que os pertenece a ti y a tu dominio. Cuando un cliente accede a tu dominio y descarga el
certificado SSL, busca dentro de sus certificados de CA’s si hay alguno que lo haya firmado. Si lo
encuentra, acepta tu certificado y no ocurre nada especial, pero si no encuentra la CA lanza un aviso
indicando que no se reconoce la autoridad que lo firma. Esto no quiere decir que el certificado no
sea válido, lo único que ocurre es que no sabe quien lo firma. Esto significa, por tanto, que tú
mismo puedes ser tu propia autoridad certificadora y firmar tus certificados, funcionarán
perfectamente y cumplirán su cometido de asegurar las comunicaciones cliente/servidor.
1- Comenzamos creando el servidor DNS que nos permitira hacer las pruebas locales necesarias.
Luego de iniciar sesión como super usuario instalamos el paquete necesario para el servidor

Entramos a modificar el archivo de configuración de zonas del DNS en /etc/bind/named.conf


Ahora copiamos los archivos que almacenaran los registros con los que trabajara el DNS, debemos
copiar el formato para la zona inversa y directa redireccionando el contenido de los archivos
db.local y db.127

Ingresamos a editar el archivo de los registros de la zona directa, asegurandonos de especificar las
variables y nombres adecuados, pues son estos los que permitiran encontrar el equipo en la red.
debian:/etc/bind# nano directa 
Acto seguido modificamos el archivo con los registros de la zona inversa y lo dejamos similar a las
lineas de la siguiente imagen
debian:/etc/bind# nano inversa

Para evitar poner IP fija y poder tener salida a internet y la vez tener nuestros sitios y registros DNS
corriendo, habilitamos la opción de reenvio que ofrece el bind, primero copiamos la IP del DNS
actual de la red que se puede ver en: /etc/resolv.conf
La llevamos al archivo que habilita la opción de reenvio en el bind en
/etc/bind/named.conf.option y tras descomentar las lineas de reenvio (forwarder) el
archivo debera lucir como la siguiente imagen

Editamos el archivo de resolv.conf que indica al sistema la direccion IP y el dominio


predeterminado y debera verse como el siguiente:
debian:/home/debian# nano /etc/resolv.conf
El ultimo archivo que es necesario cambiar para la nueva y optima resolucion interna de nombres
sera /etc/hosts, donde indicaremos el nuevo nombre y la IP real a la que la maquina respondera al
obtener peticiones desde la red.

Reiniciamos el servidor para que cargue los cambios realizados y verificamos que este libre de
errores de configuración
Por ultimo probamos que las zonas y los registros agregados esten respondiendo correctamente a las
configuraciones y datos agregados, lo hacemos desde cualquier ruta del sistema con el comando
nslookup,  podemos ver como es resuelto tanto los registros internos agregados manualmene
como los externos como google.com resuelto por terceros gracias al reenviador

2- El segundo componete necesario para esta implementación será un revidor web, que instalaremos
normalamente pero a quien en pasos siguientes se modificara para establecer la conexión segura.
Comenzamos instalando el paquete servidor de los repositorios, con apt­get install apache2
Como primera medida para instalar un servidor web debemos tener previamente seleccionados los
archivos que queremos publicar en el servidor, procedemos entonces a ubicarlos en la ruta que
posteriormente sera indicada en los archivos de configuración del servidor web, crearemos una
carpeta en la que se almacenaran los archivos del sitio

Y a continuación enviamos los ficheros correspondientes del futuro sitio


Entramos a modificar el archivo del nuevo sitio web, utilizaremos el “default” por asuntos
pedagógicos y prácticos (ud. puede copiar este y trabajar con los nuevos).

Ahora en el archivo especificaremos:


-el encabezado de host, para tener la posibilidad de trabajar con URL's motivo por el cual se crearon
los registros DNS ó trabajar por IP, por lo cual se modifico /etc/hosts www.alejo.com ó
192.168.1.66
-la ruta donde se guardaran los archivos del sitio web, index, imagenes y demás, usualmente
/var/www/ esta se muestra como “DocumentRoot” y “Directory”
-el archivo que se indexara para mostrarse como primero al momento de visualizar la pagina desde
el navegador, esto se logra con la variable “DirectoryIndex”
Este archivo con las pocas modificaciones debera verse parecido a la imagen
Cuelgo el archivo completo para despejar dudas sobre otras variables del mismo, aunque hasta el
momento no se han realizado mayores cambios

######### /etc/apache2/sites­available/default Modificado ##############

<VirtualHost *:80> 
        Servername  www.alejo.com 
        ServerAdmin webmaster@localhost 

        DocumentRoot /var/www/buscador/ 
        <Directory /> 
                Options FollowSymLinks 
                AllowOverride None 
        </Directory> 
        <Directory /var/www/buscador/> 
                Options Indexes FollowSymLinks MultiViews 
                AllowOverride None 
                Order allow,deny 
                allow from all 
                DirectoryIndex          Buscar_com_ve.html 
        </Directory> 

        ScriptAlias /cgi­bin/ /usr/lib/cgi­bin/ 
        <Directory "/usr/lib/cgi­bin"> 
                AllowOverride None 
                Options +ExecCGI ­MultiViews +SymLinksIfOwnerMatch 
                Order allow,deny 
                Allow from all 
        </Directory> 

        ErrorLog /var/log/apache2/error.log 

        # Possible values include: debug, info, notice, warn, error, crit, 
        # alert, emerg. 
        LogLevel warn 

        CustomLog /var/log/apache2/access.log combined 

    Alias /doc/ "/usr/share/doc/" 
    <Directory "/usr/share/doc/"> 
        Options Indexes MultiViews FollowSymLinks 
        AllowOverride None 
        Order deny,allow 
        Deny from all 
        Allow from 127.0.0.0/255.0.0.0 ::1/128 
    </Directory> 
</VirtualHost> 

###################    default Modificado    ####################
Solo queda reiniciar el servidor para que cargue los cambios, informe sobre posibles problemas que
se deben corregir de inmediato y verificar que todo este correcto

Ahora desde el navegado web accedemos al sitio para verificar que el sitio se encuentre corriendo y
cargando todos sus archivos correctamente, recordemos que podemos hacerlo con la URL dada en
el registro dns o la IP local renombrada en /etc/hosts
ó ingresando con la IP debe cargar el mismo sitio

3- Instalamos el servidor ssl, que con sus paquetes permitira la implementación de la entidad
certificadora y las diferentes funciones como firmar certicados digitales, crear certicados para
clientes, validar la identidad mia y de otros, entre otros.
Es buena idea verificar la version del paquete descargado, para saber que soporta y en que
procedimientos puede usarse

Ahora iremos a los archivos de configuración del Openssh y comenzaremos creando el directorio
que albergara los archivos de la nueva entidad certificadora en /ect/CA

En ese nuevo directorio creamos dos carpetas, una contendran las claves de los certicados
generados y otra el certificado.
En este punto debemos editar el archivo de configuración de openssl, en el que se encuentran las
variables que ssl tomara para crear entidades certificadoras, crear certicados, firmarlos, entreo otras,
comenzamos copiando el archivo de configuración de openssl para mantener el backup de este.

Borramos el contenido del archivo orginal y conservamos el backup.

Copiamos al directorio de la entidad certificadora el archivo de configuración ssl que hemos


vaciado para posteriormente poblar con nuestra configuración
Luego abrimos el archivo del openssl que estamos modificando, para tener una imagen clara y
manejo facil, lo hacemos con la utilidad “gedit”

Como anteriormente hemos vaciado el archivo, se recomienda utilizar las siguientes lineas con las
que según nuestras preferencias, obtendremos las variables que el servidor tomara para la ejecución
de las funciones de openssl, como creación y firma de certicados digitales

 
# www.linuxtotal.com.mx 
# sergio.gonzalez.duran@gmail.com 

# Archivo de configuracion para openssl 

# ***** openssl.cnf ****** 

dir           = .    # variable que establece el directorio de trabajo 
  
# seccion que permite convertirnos en una CA 
# solo se hace referncia a otra sección CA_default 
[ ca ] 
default_ca    = CA_default 

[ CA_default ] 
serial        = $dir/serial          # archivo que guarda el siguiente número de serie 
database      = $dir/index.txt       # archvio que guarda la bd de certificados 
new_certs_dir = $dir/certificados    # dir que guarda los certificados generados 
certificate   = $dir/CAcertificado.pem      # nombre del archivo del certificado raíz 
private_key   = $dir/privado/cakey.pem # llave privada del certificado raíz 
default_md    = md5                  # algoritmo de dispersión usado 
preserve      = no                   # Indica si se preserva o no el orden de los 
                                     #   campos del DN cuando se pasa a los certs. 
nameopt       = default_ca           # esta opcion y la siguiente permiten mostrar 
                                     #   detalles del certificado  
certopt       = default_ca           
policy        = policy_match         # indica el nombre de la seccion 
                                     #   donde se especifica que campos son 
                                     #   obligatorios, opcionales y cuales deben ser 
                                     #   iguales al certificado raíz 
# seccion de politicas para la emision de certificados 
[ policy_match ] 
countryName                 = match          # match, obligatorio 
stateOrProvinceName         = match          
organizationName            = match 
organizationalUnitName      = optional       # optional, campo opcional 
commonName                  = supplied       # supplied, debe estar en la petición 
emailAddress                = optional 

# seccion que indica como los certificados deben ser creados 
[ req ] 
default_bits       = 1024           # tamaño de la llave, si no se indica 512 
default_keyfile    = key.pem        # nombre de la llave privada 
default_md         = md5            # algoritmo de dispersión a utilizar 
string_mask        = nombstr        # caracteres permitidos en la mascara de la llave 
distinguished_name = req_distinguished_name  # seccion para el nombre distinguido (DN) 
req_extensions     = v3_req         # seccion con mas extensiones que se añaden a la 
                                    #   peticion del certificado 

# seccion del nombre distinguido, el valor es el prompt que se vera en pantalla. 
# datos del propietario del certificado. 
# esta seccion define el contenido de datos de id que el certificado llevara. 
[ req_distinguished_name ] 
0.organizationName          = Nombre de la organizacion 
0.organizationName_default  = Alejo, S.A. 
organizationalUnitName      = Departamento o division 
emailAddress                = Correo electronico 
emailAddress_max            = 
localityName                = Ciudad o distrito 
localityName_default        = Medellin 
stateOrProvinceName         = Estado o provincia 
stateOrProvinceName_default = Antioquia 
countryName                 = Codigo del pais (dos letras) 
countryName_default         = CO 
countryName_min             = 2 
countryName_max             = 2 
commonName                  = Nombre comun (hostname o IP) 
commonName_max              = 64 

# si en la linea de comandos se indica la opcion ­x509, 
# las siguientes extensiones tambien aplican 
[ v3_ca ] 
# indica que se trata de un certificado CA raíz con autoridad para 
# firmar o revocar otros certificados 
basicConstraints       = CA:TRUE  
                                 

# especifica bajo que metodo identificar a la llave publica que sera certificada 
subjectKeyIdentifier   = hash     
                                  

# especifica como identifcar la llave publica 
 
authorityKeyIdentifier = keyid:always,issuer:always  
                                        

# extensiones de la opcion req 
[ v3_req ] 
basicConstraints            = CA:FALSE  # los certificados firmados no son CA 
subjectKeyIdentifier        = hash 
#

  
Al copiar estas lineas en /etc/ssl/openssl.cnf con la utilidad gedit, deberemos ver algo así.

Al volver a la consola original y ver o modificar los campos para nuestra configuración unica,
debemos prestar especial atención a las lineas que se muestran a continuación, pues indican la
informacion requerida en los certicados.
Antes de proceder a ejecutar las funciones propias de una entidad certicadora, verificamos que los
archivos y directorios necesarios se encuntren en la ruta adecuada, en este caso. /etc/ssl/CA/

4- Al completar los requisitos anteriores crearemos el certicado que avalara la identidad de una
entidad certificadora, que nos permitira a su vez la creacion y firma de certificados, para las
conexiones seguras.

El siguiente comando nos generara el certificado raíz = “CAcertificado.pem” y Llave privada =


“/etc/ssl/CA/privado/cakey.pem” con la que la nueva entidad certicadora avalara su identidad y las
que en ella confien.
debian:/etc/ssl/CA# openssl req ­new ­x509 ­extensions v3_ca ­keyout privado/cakey.pem \

El anterior comando activa el asistente para petición de certificados y con la siguiente cadena lo
generamos
> ­out CAcertificado.pem ­days 3650 ­config ./openssl.cnf
el comando “openssl” invocado anteriormente esta acompañado de las siguintes opciones

*req -new -x509 = sirve para crear un nuevo certificado autofirmado.


*-extensions v3_ca = sirve para crear el certificado raíz CA (Entidad certificadora).
*-keyout = sirve para especificar el nombre y donde se guardara la llave privada.
*-out = sirve para mostrar el nombre del certificado raíz CA.
*-days 3650 = sirve para especificar el periodo de validez del certificado (3650 días=10años). Si no
se especifica el tiempo el certificado tendrá una duración de 30 días.
*-config = archivo de donde tomara la configuración

El asistente de peticion de certificados ira tomando los datos necesarios para avalar la petición
como la empresa, el pais, etc.

Ahora podemos ver el certificado de la nueva entidad certicadora que la identificara ante los
usuarios que a ella hagan peticiones, debian:/etc/ssl/CA# more Cacertificado.pem
Y la clave generada al pedir el certificado. debian:/etc/ssl/CA# more privado/cakey.pem

5- Como ya tenemos una entidad certicadora que firmara y avalara la identidad de sitios web que
confien en ella, procedemos a generar la petición del certificado para el sitio web en el que hemos
trabajado (www.alejo.com) con el siguiente comando, donde indicamos:
*req =solicitando un certificado nuevo.
*-out =nombre del certificado que deseamos que nos firmen.
*-config =toma el archivo de configuración que creamos.
*-nodes =indica que no deseamos contraseña en la llave privada. .

debian:/etc/ssl/CA# openssl req ­nem ­nodes ­out alejo­cert.pem ­config ./openssl.cnf
Ingresamos los datos que el asistente de generación de certicados requiere, podemos dejar los que
trae por omisión, o modificarlos según nuestra preferencia, (el “nombre comun” sera el que indique
el propietario del certificado, por lo que este debe ser valido según nuestra configuración.)

Hemos generado una petición de certificado “alejo-cert.pem” y una llave privada “key.pem” con la
que se encriptara la comunicación que bajo este certificado se establezca, observamos la peticion.

Y la llave de este certificado.


Para que la peticion generada anteriormente pase a ser certificado, necesitamos que la entidad lo
firme y exporte para ser agregado al sitio web solicitante.

Nos pedira la clave de la entidad certificadora, nos confirmara los datos del certificado y nos
preguntara si deseamos firmar esta peticion.

Al firmarlo la peticion pasara a ser certificado con un formato como el siguiente


Los archivos de la entidad certificadora se actualizaran en el momento de la creacion de estos y
podemos verificarlo en el “serial” y en el “idex.txt”

6- El servidor necesitara habilitar ahora su autenticación, indicando que la conexión hacia él se hara
de forma segura, además debe especificarse en sus archivos de configuración la ruta del certificado
que utilizara y las redirecciones respectivas a puertos seguros, esto se hace principalmente en el
archivo del sitio web, donde se agregara un <virtual host> al final del archivo, la variable de
“RedirectPermanent” y las variables de SSL que habilitaran e indicaran el metodo de autenticación.
<VirtualHost *:80> 
ServerName  www.alejo.com 
ServerAdmin webmaster@localhost 
RedirectPermanent / https://www.alejo.com 
DocumentRoot /var/www/buscador/ 
<Directory /> 
Options FollowSymLinks 
AllowOverride None 
</Directory> 
<Directory /var/www/buscador/> 
Options Indexes FollowSymLinks MultiViews 
AllowOverride None 
Order allow,deny 
allow from all 
DirectoryIndex Buscar_com_ve.html 
</Directory> 

ScriptAlias /cgi­bin/ /usr/lib/cgi­bin/ 
<Directory "/usr/lib/cgi­bin"> 
AllowOverride None 
Options +ExecCGI ­MultiViews +SymLinksIfOwnerMatch 
Order allow,deny 
Allow from all 
</Directory> 

ErrorLog /var/log/apache2/error.log 

# Possible values include: debug, info, notice, warn, error, crit, 
# alert, emerg. 
LogLevel warn 

CustomLog /var/log/apache2/access.log combined 
    Alias /doc/ "/usr/share/doc/" 
    <Directory "/usr/share/doc/"> 
        Options Indexes MultiViews FollowSymLinks 
        AllowOverride None 
        Order deny,allow 
        Deny from all 
        Allow from 127.0.0.0/255.0.0.0 ::1/128 
    </Directory> 

</VirtualHost> 

<VirtualHost *:443> 
        ServerName  www.alejo.com 
        ServerAdmin webmaster@localhost 
      
        DocumentRoot /var/www/buscador/ 
        <Directory /> 
                Options FollowSymLinks 
                AllowOverride None 
        </Directory> 
        <Directory /var/www/buscador/> 
                Options Indexes FollowSymLinks MultiViews 
                AllowOverride None 
                Order allow,deny 
                allow from all 
                DirectoryIndex          Buscar_com_ve.html 
        </Directory> 

SSlEngine on 
SSLCertificateFile /etc/ssl/CA/firmado­alejo.com 
SSLCertificateKeyFile /etc/ssl/CA/key.pem 

</VirtualHost>
  
*Modificaremos el host virtual para que nos direccione de http:// a https:// donde nos indica que el
sitio es seguro y utiliza ssl.
*Agregamos la variable RedirectPermanent / https://www.alejo.com para que todas las peticiones
que el usuario haga por el puerto 80 las envié al puerto seguro 443.
*Agregamos las variables que indicaran la interacción con SSL.
“SSLEngine on” es para encender el motor de SSL.
“SSLcertificateFile” ruta donde se almacena nuestro certificado firmado. (/etc/ssl/CA/firmado-
alejo.com).
“SSLCertificateKeyFile”ruta donde se almacena la llave privada.
(/etc/ssl/CA/key.pem).

Para habilitar la comunicación por el puerto seguro debemos indicarle al archivo referente que lo
haga por el puerto 443 para las comunicaciones seguras en los servidores web.
7- Por ultimo habilitamos el módulo de seguridad para apache2 con el comando que carga los
modulos debian:/etc/apache2# a2enmod ssl

Terminamos reiniciando apache para que tome los ultimos cambios realizados en sus archivos y
luego de corregir posibles errores de rutas y variables procedemos a probarlo
Ahora necesitamos verificar que todo lo realizado anteriormente se a incorporado al servivio de una
forma exitosa, primero nos dirigimos al navegador web y digitamos la url del sitio que hemos
trabajado anteriormente “http://www.alejo.com”

Debera emitir una notificación de error al comunicarse pues este sitio debe verse utilizando un
certificado válido con el cual no contamos, entonces damos clik en el enalce “Or you can add...”
para permitir la instalar el nuevo certificado y proceder a el inicio en el servidor.
Nos mostrara la opción de añadir el certificado “Add exeption...” y al aceptarla se desplegara un
asistente que permitira obtener dicho certificado

Podemos ver el certificado antes de instalarlo para comprobar los datos genrales de este.
Y al aceptar la conexión con este metodo de autenticación nos direccionara automaticamente al sitio
web seguro que hemos configurado a lo largo de este documento, indicando de este modo de
conexión por que en la barra de navegación en ves de aparecer “http://” ahora sale “https://” y por el
candado de la parte inferior del navegador.