Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 7 Current »

Desde la versión 4.1.0-outlaw se podrá activar la autenticación por certificados en nuestro Identity Manager avanzado.

A continuación vamos a detallar como activar la autenticación por certificados en el IM avanzado de plataforma.

Esta funcionalidad permite a los usuarios iniciar sesión en la plataforma y aplicación desarrolladas sobre la misma mediante certificados de cliente X509, con la ventaja de poder seguir utilizando Oauth2 como estándar de seguridad en las comunicaciones.

Configuración de Nginx

Legacy (Rancher 1.6)

Como el nginx termina la conexión SSL, necesitamos configurar el forwarding del certificado a Keycloak primero.

Al nivel de server añadir:

#x509
ssl_verify_client optional_no_ca;
#se puede poner a optional y checkear la cadena de confianza con el siguiente parámetro
#CA.pem deberá contener todos los certificados concatenados de los issuers 
#de certificados que vaya a aceptar nuestro sistema
#ssl_client_certificate /etc/nginx/ssl/CA.pem;
ssl_verify_depth 2;

A nivel de location añadir:

location /auth {
		proxy_set_header X509-Cert $ssl_client_escaped_cert; 
		....	
}

Kubernetes (Rancher 2.6+)

Como requisito para configurar un entorno con kubernetes, necesita tener la versión 1.21+ de k8s para que el Ingress Controller soporte las anotaciones networking.k8s.io/v1

Creación del secret con las CAs

En primer lugar deberemos crear el secreto que contendrá los certificados concatenados de las CA necesarias para validar los certificados de cliente que se quieran autenticar.

Crearemos un secret llamado platform-ca en el namespace de onesaitplatform, por ejemplo, y como clave del secret lo llamaremos ca.crt , dejando como valor la cadena de certificados.

Configuración del Ingress Controller

En el Ingress Controller tendremos que poner las siguients anotaciones:

nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
nginx.ingress.kubernetes.io/auth-tls-secret: onesaitplatform/platform-ca
nginx.ingress.kubernetes.io/auth-tls-verify-client: optional
nginx.ingress.kubernetes.io/auth-tls-verify-depth: "2"

Configuración Config Map loadbalancer

Por último tendremos que añadir la siguiente directiva al config map de nuestro balanceador, con el objetivo de propagar la cabecera HTTP que inyecta el Ingress Controller con el certificado:

  proxy_set_header X509-Cert $http_ssl_client_cert;

Configuración Keycloak

Flujo de autenticación

Lo primero será modificar el flujo principal de autenticación, ‘Multitenant-browser-flow’:

Añadimos una execution, ‘X509 Onesait Platform’:

La marcamos como alternativa en el flujo de autenticación, y la ponemos en el tercer nivel:

Configuración de la execution

Ahora tenemos que configurar la execution para el mapeo de certificado - usuario.

Hacemos click en actions → config:

En este ejemplo vamos a configurarlo para aceptar DNIe como fuente de certificado electrónico.

Tenemos que configurar los siguientes campos:

Import User after first log in: lo dejaremos marcado para que importe a los usuarios después de la primera autenticación.

User Identity Source: lo dejaremos a Match SubjectDN using RegEx, ya que extraeremos de ahí el ID de usuario.

User ID: expresión regular para extraer el ID único de usuario, en el caso del DNIe se extrae del campo SERIALNUMBER del DN del certificado.

Email: expresión regular para extraer el correo, en el caso del DNIe no aplica, se deja vacío ya que no aparece este campo.

Email suffix: sufijo del correo que se usará en caso de que no exista un RegEx para extraer el correo. El correo se compondrá de ID Usuario + @ + email suffix.

Full user name: RegEx para extraer el nombre de usuario completo, se pueden usar múltiples RegEx separadas por ‘;;’ como en el ejemplo, ya que en el DNIe el nombre de pila y el apellido vienen separados. El nombre completo será una concatenación de los valores obtenidos por las expresiones regulares.

Import DN as extrafields: lo marcaremos si queremos almacenar en el campo extra fields de los usuarios de plataforma el DN completo extraído del certificado.

Administrators whitelist: lista de ID de usuario separados por comas que se les va a dar rol administrador.

Default import Role: rol por defecto de importación de usuarios.

User mapping method: lo dejaremos a Username or Email.

El resto de opciones no hace falta configurarlas.

Truststore

Por último habrá que añadir los certificados de los issuers de los certificados electrónicos que vaya a aceptar nuestro sistema, en el caso del DNIe, tenemos que añadir el de la Policia Nacional.

-----BEGIN CERTIFICATE-----
MIIG6DCCBNCgAwIBAgIQQ5qWKLJmD+5Tmutm/PFVGDANBgkqhkiG9w0BAQsFADBf
MQswCQYDVQQGEwJFUzEoMCYGA1UECgwfRElSRUNDSU9OIEdFTkVSQUwgREUgTEEg
UE9MSUNJQTENMAsGA1UECwwERE5JRTEXMBUGA1UEAwwOQUMgUkFJWiBETklFIDIw
HhcNMTQwNjEzMTIxNTM0WhcNMjkwNjEzMTIxNTM0WjBcMQswCQYDVQQGEwJFUzEo
MCYGA1UECgwfRElSRUNDSU9OIEdFTkVSQUwgREUgTEEgUE9MSUNJQTENMAsGA1UE
CwwERE5JRTEUMBIGA1UEAwwLQUMgRE5JRSAwMDQwggIiMA0GCSqGSIb3DQEBAQUA
A4ICDwAwggIKAoICAQDGadrtPpUT6l2bo3med81g0J5E/CxNKXnbNsgh/pIQtLjg
I0MM9G3xNuh1yJYMjy4ebbZyoJCZVqQsk9A5ko/CUibbONS4RqUkC5wVtm0jkVdY
Lw9JPMHWLpoRKokU6QbgKErMES5Yh9XadB0Bp2RJLw7WWy/bs8axZ1j/c/y5QNK/
cgPQhpbjvjMoCNej+exp6tVQfNbo7HxKh8+JPzyZZO/vHownKqoa3atrHTIAnzlg
BTMwMQiUDi72Iag0auB9j2oSrH+XEGs1d11nNpu4SWSX979g09OI3PkwTKopU0P0
GpVrgejtXQI+Nmz7rNEhAYoDfushYzfpwvc1zUIKnEoS7cYKkHXZzCnK/1tNW3nf
mfczwktcioGpy9Al58CBZkbQihYQHKHfRBHOz/aZ27CwSdIvTy62EdPvbD/zCBIM
aoNbWSKY5Uun56nJpxjO7MmNUHKNYW/BPBdXtRjw3QC31wHWfP+AgNV1p3NJlAuf
RnCVATo+dgYM4Vj4RdOh1tC2VfmrWtPUjEkP56U12tcXVurmn88QxTGvv6qMCEO9
H8aRu4K4MZizQAkC/cPBt04NyDeS8vxqTKJDec9El4lO4Pksf2fNzCpARC6Ww/XL
VV+CQoPQtNecOHjyUkvgiEm6pTsp8AGeEwN9PlgKUY01lEi8f5lzVXQEIrF4lQID
AQABo4IBoTCCAZ0wHQYDVR0OBBYEFOvGL4ThFxerBvBAjOqvQk7xMc0aMB8GA1Ud
IwQYMBaAFFPcbmKkzhMbd+CHoVqkD7KHEvCbME0GA1UdIARGMEQwQgYEVR0gADA6
MDgGCCsGAQUFBwIBFixodHRwOi8vcGtpLnBvbGljaWEuZXMvZG5pZS9wdWJsaWNh
Y2lvbmVzL2RwYzASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjCB
5wYDVR0fBIHfMIHcMIHZoIHWoIHThidodHRwOi8vcGtpLnBvbGljaWEuZXMvZG5p
ZS9jcmxzL0FSTC5jcmyGgadsZGFwOi8vbGRhcC5kbmllLmVzL0NOPUNSTCxDTj1B
QyUyMFJBSVolMjBETklFJTIwMixPVT1ETklFLE89RElSRUNDSU9OJTIwR0VORVJB
TCUyMERFJTIwTEElMjBQT0xJQ0lBLEM9RVM/YXV0aG9yaXR5UmV2b2NhdGlvbkxp
c3Q/YmFzZT9vYmplY3RjbGFzcz1jUkxEaXN0cmlidXRpb25Qb2ludDANBgkqhkiG
9w0BAQsFAAOCAgEAUL0NUEeaAze4/dZeFLqUkFxR8+vGIEhkjYilrrEoFbFsPHT8
reXjtb5F6tqIOIh0n11WhQWGcc+Plwi5JXuHsAcwuEKVPK827HiL6EzlCuPVlxxR
/PcSKCDiKWiuMDWmv6Z4AlpjON+SFWRL2brEf/O/0WvokuwBmVz4nmIrDTlrijYL
ldc7ODHD4/HEBXhgW2HnhSwraR2i1yaM/mZMdFWWHeVAU6VZ1jWNsDHUEWxZ9F6Y
A0mTiGG44MB6Nv28opLGTtsdW12Lc1SI8ydZZl/z9+V5vgCZ3D2JKW/UJI+WKJRc
Ux/9z5iQARWGhr1vpRFu/EyMuUIumTVLVTgU0Y69lecNGjY3nvfOccxweOhx0UqR
BQMgEQoO7ePhIAuql3Y1Fp/Eb5HzCGYqSCJjHPcm5lh54uKM+eYG3QnUEgHCJ1SH
ECZkavldmy/urRCWL+jd3PIZFj2G+oceQBlZBzUPHq6ADnsIdfu/QmHGXbP9Qo+y
tj03DrDiDORVp2vvRnbIZKsolxMX+mjO+OL8Zrqm+s92Iyuvspksgq1edHhHT8Bz
KYaJTeol+17DEee7v8cCgr0+0Zj6wCXMOHe/UN/n1xSOsljIFkEz9BOC2Xcy304+
GM8cSBe81y5/IlB4dERoBBnydiIaE/okylJix+LhYd4ijYcQJh0OqwaqhFQ=
-----END CERTIFICATE-----

Para añadirlo, solicitarlo a través de soporte de plataforma.

keytool -importcert -keystore "KEYSTORE_FILE" -storepass "KEYSTORE_PASSWORD" -file "CERTIFICATE_FILE" -alias "CERTIFICATE_ALIAS"

El keystore de keycloak esta ubicado en /opt/jboss/keycloak/standalone/configuration/keystore.jks, la contraseña es la misma que el JKS de la JVM.

En el directorio que tenemos de /onesait-cloud-platform/tools/keycloak/server se encuentra el keystore.jks con las CAs más comunes pedidas por los clientes, siempre se pueden añadir más y regenerar la imagen del keycloak server.

Conectar front/back al sistema de autenticación

Como se comentaba al principio del post, para integrar una aplicación con este sistema de autenticación, se seguirá usando Oauth2, con el flujo de código de autorización, de tal forma que la aplicación redireccionará al IM, este leerá el certificado del cliente si lo tiene configurado, y devolverá a la aplicación original un token JWT.

Existen librerías para configurar este tipo de flujo tanto para Spring Boot como para Vue JS, y habrá que configurar una serie de parámetros del estilo de:

oauth2.client.clientId = onesaitplatform
oauth2.client.clientSecret = onesaitplatform
oauth2.client.accessTokenUri = https://${SERVER_NAME}/auth/realms/onesaitplatform/protocol/openid-connect/token
oauth2.client.userAuthorizationUri = https://${SERVER_NAME}/auth/realms/onesaitplatform/protocol/openid-connect/auth?scope=openid
oauth2.client.checkTokenEndpointUrl = https://${SERVER_NAME}/auth/realms/onesaitplatform/protocol/openid-connect/token/introspect
oauth2.client.logoutUrl=https://${SERVER_NAME}/auth/realms/onesaitplatform/protocol/openid-connect/logout?redirect_uri=https://${SERVER_NAME}/controlpanel/login
oauth2.resource.userInfoUri = https://${SERVER_NAME}/auth/realms/onesaitplatform/protocol/openid-connect/userinfo
oauth2.client.useCurrentUri: false
oauth2.client.preEstablishedRedirectUri: https://${SERVER_NAME}/controlpanel/login
  • No labels