Identidad Digital
Identidad Digital
Identidad Digital
Después nos preguntará si queremos que se elimine la base de datos cuando quitemos
slapd. Para evitar confusiones con bases de datos anteriores, lo mejor es responder Sí.
Al solicitarnos el DNS domain name el facilitamos gameofthron.es y posteriormente al
solicitarnos el nombre de la organización tecleamos gameofthron.
Tras introducir y confirmar el password e introducir el tipo de base de datos habremos
concluído la configuración inicial del servidor LDAP, que al igual que todos los servicios en
Debian, dispone de un script de arranque y parada en la carpeta /etc/init.d
// Arrancar o reiniciar el servidor LDAP
sudo /etc/init.d/slapd restart
Para comenzar creamos el archivo .ldif que nos permite crear las “organizational units”
(ou) necesarias para construir la estructura del directorio que se nos solicita:
El comando slapadd necesita ejecutarse con privilegios, por tanto, se han elevado para
ejecutar los scripts que lo contienen. En el script se comprueba si el proceso de LDAP se está
ejecutando y se finaliza en el caso de ser así. Posteriormente se introducen los datos al LDAP
con slapadd –c –v –l Ex1_3.ldif
A continuación se procede a crear el archivo .ldif que contiene las sentencias para añadir
a los trabajadores de la empresa al directorio junto con la información proporcionada en el
enunciado. En este caso va a ser necesario almacenar los passwords cifrados en el interior de
LDAP, por lo que, dado que esta estructura va a usarse posteriormente elijo con el criterio de
máxima seguridad el algoritmo SSHA, que es una versión de SHA con salt: “This is the salted
version of the SHA scheme. It is believed to be the most secure password storage scheme
supported by slapd.” (https://www.openldap.org/doc/admin24/security.html).
Para obtener el password cifrado y proporcionárselo al archivo .ldif se usa el comando
slappasswd –h {SSHA} –s password
Finalmente se crea el fichero .ldif que contiene las sentencias para crear los
encargados de departamento y enlazarlos con los trabajadores correspondientes y se nombra
Ex1_4_3.ldif
Y con el fin de cargar los archivos Ex_1_4_x.ldif, se proporciona una script cuyo
funcionamiento interno es similar al explicado con anterioridad.
Fuente: http://www.ite.educacion.es/formacion/materiales/85/cd/linux/m6/openldap.html
2.- Securizar una aplicacion Web con autenticación vía servidor single sign-on.
Tras descargar la versión de Apache-Tomcat 8.5.30 (binary distribution-core) de
https://tomcat.apache.org/donwnload-80.cgi, se descomprime y copia el Tomcat en dos
carpetas bajo /opt del entorno de trabajo (VirtualBox 5.2.8 r121009(Qt5.6.2) + Debian 9.0). Una
carpeta se denomina CAS y otra APP, y tienen inicialmente el mismo contenido.
Ello nos permite además de la operativa que iremos viendo a lo largo del ejercicio, tener
instalaciones limpias y evitarnos deshacer algunas configuraciones que eran necesarias para
hacer funcionar JAAS, ya que usaremos la aplicación que se entregó en la práctica 1 y que
estaba diseñada para ejecutarse en este entorno.
En la práctica tenemos dos Tomcat ejecutándose simultáneamente en la misma
máquina por lo que van a intentar usar los mismos puertos por defecto, lo que implicaría que
no sería posible que los dos servidores funcionaran a la vez, puesto que si arrancáramos un
segundo Tomcat con puertos coincidentes daría error y se cerraría.
Este problema lo evitamos cambiando los puertos por defecto del servidor web. Se ha
procedido editando el archivo server.xml de la carpeta CAS en la ruta
/opt/CAS/apache-tomcat-8.5.30/conf/server.xml
Esto solo lo realizamos para comprobar paso a paso que estamos realizando el
ejercicio correctamente, puesto que no es de recibo que hayan contraseñas harcodeadas.
Cuando conectemos con OpenLDAP corregiremos este extremo.
Puesto que el cierre de sesión de forma provisional (dado que acabaremos cerrando la
sesión CAS) ahora es:
Finalmente, eliminamos
<%User u = MyInfo.getUser(); %>
<h1>Sistema de Gestión</h1>
<% if (request.getUserPrincipal() != null)
{
%>
<p>Bienvenido/a<%= u.getName()%> (<%= request.getUserPrincipal().getName()%>)</p>
<%
} else {
%>
<% response.sendRedirect("/secure/error.jsp"); %>
Se mantiene una copia del sistema en este momento del desarrollo para verificar el
funcionamiento, si resultara de interés.
Ello permite que podamos usar una plantilla para la autenticación LDAP donde no se
requiere búsqueda para calcular el DN necesario para una operación de vinculación.
Si visitamos https://mvnrepository.com/artifact/org.jasig.cas/cas-server-support-
ldap/4.0.0 podemos descargar la versión 4.0.0. en formato .jar y la situamos en /opt/CAS/apache-
tomcat-8.5.30/webapps/cas-server-webapp-4.0.0/WEB-INF/lib/cas-server-support-ldap-4.0.0.jar
Una vez instalado lo configuramos para que se use en lugar de usar el listado de
contraseñas que hay en el archivo para lo que borramos dentro del deployerConfigContext.xml
la bean primaryAuthenticationHandler y posteriormente añadimos el código que se encuentra
en el tutorial para conectar el módulo y OpenLDAP usando Direct Bind, que se encuentra en
https://apereo.github.io/cas/4.0.x/installation/LDAP-Authentication.html#ldap_supporting_direct_bind
con la salvedad que aun no podemos usar ssl por lo que comentamos la propiedad
“sslConfig” de la bean “connectionConfig” y la bean “sslConfig”.
En los ejemplos de configuración del módulo de LDPA nos encontramos que para
buscar a los usuarios dentro de la organización usa ${ldap.auth.baseDN} por lo que sustituimos
la propiedad ${ldap.baseDN} por la anteriormente mencionada.
Posteriormente sustituimos el módulo usado para autenticar
<entry
key-ref="primaryAuthenticationHandler"
value-ref="primaryPrincipalResolver" />
por
<entry
key-ref="ldapAuthenticationHandler"
value-ref="primaryPrincipalResolver" />
Para finalizar se añade el código que se encuentra en el link de supporting direct bind,
al que hemos hecho referencia, para configurar las propiedades LDAP en el archivo
cas.properties
/opt/CAS/apache-tomcat-8.5.30/webapps/cas-server-webapp-4.0.0/WEB-INF/cas.properties
Sustituyendo
Se mantiene una copia del sistema en este momento del desarrollo para verificar el
funcionamiento, si resultara de interés.
Por supuesto, tiene un funcionamiento correcto una vez logueado con cualquiera de los
usuarios y contraseñas que proporciona el enunciado, seguro en tanto que se ha utilizado el
algoritmo de cifrado más seguro posible dentro de esta técnica e independiente de la web, para
lo que hay habilitados dos servidores con el objetivo de aplicar el control de acceso a una
aplicación web java, mediante el servidor CAS single sign-on que se encarga de realizar la
autenticación de los usuarios, y el framework Spring Security que nos proporciona la etapa de
autorización mediante roles.
Desde que el usuario introduce su contraseña hasta que ésta llega al servidor para
comprobar la autentificación, el paquete de datos que contiene la contraseña viaja por los
cables de red atravesando concentradores (hubs), conmutadores (switches) y enrutadores
(routers) hasta llegar al servidor. Durante el trayecto, cualquier persona con los conocimientos
necesarios podría quedarse con una copia del paquete de datos para, posteriormente analizarlo
y tratar de descubrir el nombre y la contraseña del usuario sin que éste se percatase.
Con la finalidad de dificultar que alguien trate de descubrir contraseñas analizando los
datos que las contienen, existe la posibilidad de cifrar los paquetes de datos en el PC antes de
enviarlos por la red, de manera que lleguen al servidor cifrados. De esta forma, aunque un
usuario malintencionado capture un paquete de datos con la información del usuario y la
contraseña, será muy dificil, por no decir imposible, que sea capaz de descifrarlos ya que se
utiliza cifrado asimétrico.
El servidor tiene guardada en un lugar seguro la clave privada. Cuando un cliente intenta
autentificarse, el servidor le trasfiere la clave pública para que cifre los datos con dicha clave
antes de enviarlos. El cliente utiliza la clave pública del servidor para cifrar los datos, así al
llegar el paquete al servidor, éste podrá descifrarlo porque dispone de la clave privada. Si un
usuario malintencionado intercepta el paquete de datos cifrado con la clave pública, no podrá
hacer nada porque no dispone de la clave privada. Si el usuario malintencionado intercepta el
primer paquete que envía el servidor con la clave pública, no le servirá para nada ya que no le
permitirá descifrar los datos emitidos por el PC que se va autentificar.
Fuente: https://wiki.jasig.org/display/CASUM/HOWTO+Setup+Dual+Authentication+in+CAS+-+SSL+Client+Auth+and+LDAP
Al igual que el servidor web apache utiliza el puerto 80 para transmitir información sin
encifrar (protocolo http) y el puerto 443 para transmitir información cifrada (protocolo https),
openLDAP también se puede configurar para que utilice las prestaciones de cifrado que ofrece
OpenSSL.
Normalmente las consultas al servidor LDAP se realizan por el puerto 389 (protocolo
ldap) pero dichas consultas se transmiten sin cifrar. Para realizar consultas seguras cifrando
los datos con SSL, es necesasrio utilizar el puerto 636 (protocolo ldaps o protocolo ldap seguro).
Para ello, el servidor deberá disponer de un certificado firmado por una entidad certificadora
(CA) y habrá que configurar slapd para que utilice los certificados. Se deberán realizar los
siguentes pasos:
echo cn = CertPaco>/etc/ssl/ca.info
echo ca>>/etc/ssl/ca.info
echo cert_signing_key>>/etc/ssl/ca.info
outfile /etc/ssl/certs/ldap_slapd_cert.pem
44:99:d3:e2:76:31:83:81:f1:b4:71:61:f9:1f:67:55
8c:b3:0e:e5:50:6d:c5:66:4e:21:8e:13:c8:06:c2:89
d3:17:52:38:e4:c4:60:92:01:52:a0:bc:41:0e:47:52
95:19:59:3a:23:fe:76:c9:de:54:5e:28:c4:14:63:dd
2f:f3:5b:c5:be:f3:61:4e:59:c1:02:9f:11:f0:23:73
ce:7b:86:e0:ef:be:e7:e2:58:8d:5d:28:44:c5:8b:b8
9d:5c:de:78:63:68:37:f6:10:91:01:b7:ad:96:eb:05
f6:10:54:b6:00:5a:53:4e:64:0e:e7:54:54:10:87:e8
70:62:22:3d:1e:81:1a:8e:1b:59:52:60:fc:fb:c8:b8
47:08:b2:68:cb:6c:71:2b:02:3f:35:dc:8f:1d:73:75
4d
Exponent (bits 24):
01:00:01
Extensions:
Basic Constraints (critical):
Certificate Authority (CA): TRUE
Key Usage (critical):
Certificate signing.
Subject Key Identifier (not critical):
5aca733ee26c20272500de1c95e45155bfdb58f3
Other Information:
Public Key ID:
sha1:5aca733ee26c20272500de1c95e45155bfdb58f3
sha256:ea135e4fdbcd74fbaa905a1f3429f932df1912759d24bc9c07e7f40a4ecab32d
Public key's random art:
+--[ RSA 3072]----+
|o .o+o..... |
|o o o.. . |
| o o . . |
| . . . |
| o S . o |
| o o. + = o|
| + .= . o .E|
| .o+. |
| oo... |
+-----------------+
Signing certificate...
Generating a 3072 bit RSA private key...
Generating a signed certificate...
X.509 Certificate Information:
Version: 3
Serial Number (hex): 5ae96c99327447f54aa336ee
Validity:
Not Before: Wed May 02 07:45:29 UTC 2018
Not After: Thu May 02 07:45:29 UTC 2019
Subject: O=CertPaco,CN=localhost
Subject Public Key Algorithm: RSA
Algorithm Security Level: High (3072 bits)
Modulus (bits 3072):
00:ac:8d:a7:48:3e:ce:1d:4c:f4:9c:92:9e:08:e8:bc
19:56:f1:3e:f2:a7:93:d7:fb:22:bc:57:6a:1b:8e:87
40:38:dc:3b:09:30:8e:74:ff:51:30:1c:ce:e7:89:e3
99:da:d7:51:08:7c:79:66:c5:41:a5:1e:17:07:8f:d4
68:8f:b3:de:48:02:77:0d:fe:92:d0:a8:88:be:f7:7d
ac:44:e6:6c:2f:f5:48:ab:b6:4d:e9:12:5a:25:e9:5d
18:38:bf:16:2f:72:c5:d9:e3:76:d2:e6:6f:23:82:a9
7e:1f:04:b6:61:5e:15:d2:d0:ce:ef:62:9c:45:6d:cc
02:b4:f4:8c:29:b8:ab:5a:93:8c:8d:aa:07:1e:da:b0
d4:7c:c4:25:1b:a7:f4:c9:8d:3b:00:7b:f7:0a:0c:45
6d:44:f6:35:96:0f:eb:98:e7:91:42:6b:88:9e:43:96
fb:0c:e4:de:43:6a:58:66:4c:78:1c:d2:14:4f:ff:c1
73:d3:0e:bc:b6:55:11:f2:00:a7:65:5f:d4:21:1e:5c
18:c5:24:02:ac:72:f9:d6:de:66:11:a1:ad:b3:db:87
3e:aa:51:52:0b:8e:a6:f7:fb:94:21:35:72:14:a4:fe
9e:91:57:3e:f3:16:74:79:53:35:53:b3:9f:e7:2d:f9
ad:bf:5c:2d:0c:f7:b2:c9:53:4b:24:6d:99:4f:68:b7
ff:a3:85:a1:9e:d1:68:55:66:ad:74:bf:0f:13:11:57
3d:43:97:db:75:62:6b:87:86:e8:ae:b7:67:38:9b:d7
6c:d2:bc:81:4d:27:1b:e3:11:88:69:63:6c:c9:17:6d
b2:12:38:56:6d:ab:45:e6:3c:59:10:b5:86:74:62:29
ed:0d:27:fa:a4:80:6d:b7:54:b3:56:17:09:f6:02:c5
d9:6b:99:2e:82:03:76:dc:c7:2e:22:19:25:25:fe:1c
94:db:6f:1e:6b:a5:81:9d:8d:92:82:bd:15:e2:71:f5
0f
Exponent (bits 24):
01:00:01
Extensions:
Basic Constraints (critical):
Certificate Authority (CA): FALSE
Key Purpose (not critical):
TLS WWW Server.
Key Usage (critical):
Digital signature.
Key encipherment.
Subject Key Identifier (not critical):
a12976818881548675ec152a725b610de4d5eefc
Authority Key Identifier (not critical):
5aca733ee26c20272500de1c95e45155bfdb58f3
Other Information:
Public Key ID:
sha1:a12976818881548675ec152a725b610de4d5eefc
sha256:f8fe2e0fe7d836228fd4a9b7020a37ed1857ddd8a37dbabbb615ddd7989abe4d
Public key's random art:
+--[ RSA 3072]----+
|+.++o*ooo |
|.+..+o+o . |
|...oo+o o |
| o +. + o |
| .o + S |
| . o o |
| . |
| E |
| |
+-----------------+
Signing certificate...
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
Aceptar certificado
Una vez que hemos conectado, podemos apreciar en la parte inferior que la conexión
se ha realizado al puerto 636:
http://www.ite.educacion.es/formacion/materiales/85/cd/linux/m6/autentificacin_segura_openssl_y_openldap.html
En este punto corresponde probar si la aplicación funciona con LDAP securizado; para
ello hemos modificado las líneas marcadas en rojo del archivo cas.properties en la ruta de la
carpeta CAS ../WEB~INF/cas.properties
========================================
# General properties
#========================================
ldap.url=ldaps://localhost:636
# LDAP connection timeout in milliseconds
ldap.connectTimeout=3000
# Whether to use StartTLS (probably needed if not SSL connection)
ldap.useStartTLS= false
ldap.trustedCert=file:///etc/ssl/certs/cacert.pem
#========================================
# LDAP connection pool configuration
#========================================
ldap.pool.minSize=3
ldap.pool.maxSize=10
ldap.pool.validateOnCheckout=false
ldap.pool.validatePeriodically=true
# Amount of time in milliseconds to block on pool exhausted condition
# before giving up.
ldap.pool.blockWaitTime=3000
# Frequency of connection validation in seconds
# Only applies if validatePeriodically=true
ldap.pool.validatePeriod=300
# Attempt to prune connections every N seconds
ldap.pool.prunePeriod=300
# Maximum amount of time an idle connection is allowed to be in
# pool before it is liable to be removed/destroyed
ldap.pool.idleTime=600
#========================================
# Authentication
#========================================
# Base DN of users to be authenticated
ldap.authn.baseDn=ou=employees,dc=gameofthron,dc=es
# Manager DN for authenticated searches
ldap.authn.managerDN=cn=admin,dc=gameofthron,dc=es
# Manager password for authenticated searches
ldap.authn.managerPassword=admin
# Search filter used for configurations that require searching for DNs
#ldap.authn.searchFilter=(&(uid={user})(accountState=active))
ldap.authn.searchFilter=(uid={user})
# Search filter used for configurations that require searching for DNs
ldap.authn.format=uid=%s,ou=employees,dc=gameofthron,dc=es
#ldap.authn.format=%s@example.com
Con ello indicamos la URL de LDAP por el puerto seguro 636 y le suministramos la
información de la ubicación del certificado. Asimismo comentamos el puerto LDAP no seguro
en el archivo de configuración slapd (ruta etc/default) ya que slapd normalmente sirve LDAP en
el puerto TCP 389 y en este caso hay que indicarle que atienda solicitudes en el puerto TCP
636 (LDAPS).
En este punto tras comprobar que el usuario openldap tiene los oportunos permisos de
acceso, creamos un nuevo bean con la configuración de SSL en deployerConfigContext.txt.
Un programa llamado keytool, que se incluye con JDK, realiza el trabajo de crear el
nuevo almacén de claves. Para crear un nuevo almacén de claves usando este programa,
ingresar en por linea de comandos:
# keytool -genkey -alias tomcat -keyalg RSA -keystore got_es.jks -keysize 2048 -dname "CN=localhost,
OU=CertificaPaco, O=Paco, L=ALC, ST=ALC, C=ES"
Introduzca la contraseña del almacén de claves:changeit
Volver a escribir la contraseña nueva:changeit
Introduzca la contraseña de clave para <tomcat>
(INTRO si es la misma contraseña que la del almacén de claves):
Ahora que ha creado su almacén de claves, es hora de crear un archivo llamado solicitud
de firma de certificado, o CSR, que será utilizado por la autoridad de certificación de su elección
para generar el certificado que SSL presentará a otras partes durante el protocolo de enlace.
# keytool -certreq -keyalg RSA -alias tomcat -file certgot.csr -keystore got_es.jks
Introduzca la contraseña del almacén de claves:changeit
También se puede usar la herramienta de claves para crear este archivo tal como se
muestra a continuación.
# keytool -export -alias tomcat -file certgot.crt -keystore got_es.jks
Introduzca la contraseña del almacén de claves:changeit
Certificado almacenado en el archivo <certgot.crt>
De esta manera keytool ha creado un archivo llamado certgot.crt, que se puede enviar
a la CA. Al usar este archivo, se genera un certificado personalizado para el servidor.
Fuente : https://www.mulesoft.com/tcat/tomcat-ssl
server.name=https://localhost:8443
host.name=localhost
No obstante se solicita que el cierre de sesión implique hacer un log-out al servidor CAS,
así como que la página “menu.jsp” debe tener un link que permita al usuario autenticado hacer
logout y cerrar la sesión, devolviendo a la página de portada “index.jsp”.
<p><a href="../logout">Logout</a></p>
Desde este punto de partida y tras securizar las comunicaciones con https, procedemos
a tratar el cierre de sesión con logout CAS y la redirección a index.jsp
Para concluir, tan solo resta crear una página que informe del intento de acceso a una
zona restringida, así como la posibilidad de volver a la página de menú desde donde se originó
la petición.
La página Acceso denegado aparece cuando un usuario no autorizado que no tiene
privilegios para ver una página / sección, intenta verla usando su nombre de usuario y
contraseña. Por ejemplo, cuando un usuario sin privilegios intenta ver páginas de una sección
de administrador, aparecerá una página de error que muestra el código de error 403 y un
mensaje "Acceso denegado".
</head>
<body>
<h1><font color="red">Denied Access</font></h1>
<p>No tiene permisos para acceder a esta zona</p>
https://www.digicert.com/es/sfc-creacion-java.htm
https://www.elarraydejota.com/administracion-de-autoridades-de-certificacion-de-confianza-en-
debian/
https://www.mulesoft.com/tcat/tomcat-ssl
https://coderanch.com/t/681099/application-servers/Tomcat-SSL-config-Tomcat
https://wiki.jasig.org/display/CASUM/HOWTO+Setup+Dual+Authentication+in+CAS+-
+SSL+Client+Auth+and+LDAP
https://docs.oracle.com/cd/E19509-01/820-3503/ggfka/index.html
https://stackoverflow.com/questions/21633274/should-we-point-keystore-and-truststore-to-the-
same-jks-file
https://stackoverflow.com/questions/21833732/configure-truststore-in-tomcat
http://magmax.org/blog/creando-tu-propia-entidad-certificadora-ssl/
https://www.dynacont.net/documentation/linux/openssl/
https://wiki.pentaho.com/display/ServerDoc2x/Enabling+SSL+on+the+CAS+Server
https://rubensa.wordpress.com/2010/03/03/recipe-for-creating-sample-certificates-from-scratch/