{"id":40865,"date":"2020-02-05T10:07:04","date_gmt":"2020-02-05T07:07:04","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961"},"modified":"2020-02-05T10:07:04","modified_gmt":"2020-02-05T07:07:04","slug":"sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","title":{"rendered":"SSO en arquitectura de microservicios. Usando Keycloak. Parte n.\u00ba 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>En cualquier empresa grande, y X5 Retail Group no es una excepci\u00f3n, a medida que se desarrolla, aumenta el n\u00famero de proyectos donde se requiere la autorizaci\u00f3n de usuarios. Con el tiempo, se necesita una transici\u00f3n fluida de los usuarios de una aplicaci\u00f3n a otra y surge la necesidad de utilizar un servidor \u00fanico de Single-Sign-On (SSO). Pero, \u00bfqu\u00e9 hacer cuando ya se utilizan proveedores de identidad como AD u otros que no tienen atributos adicionales en varios proyectos? Los sistemas llamados 'correos de identidad' vienen al rescate. Sus representantes m\u00e1s funcionales son productos como Keycloak, Gravitee Access Management, entre otros. Los escenarios de uso suelen ser diversos: interacci\u00f3n m\u00e1quina a m\u00e1quina, participaci\u00f3n de usuarios, etc. La soluci\u00f3n debe soportar funcionalidades flexibles y escalables que puedan unir todos los requisitos en una sola, y esa soluci\u00f3n en nuestra empresa actualmente es el br\u00f3ker de identidad: Keycloak. <\/p>\n<p><img decoding=\"async\" alt=\"SSO en arquitectura de microservicios. Usando Keycloak. Parte n.\u00ba 1\" src=\"\/wp-content\/uploads\/2020\/02\/3a7f1d5f68fa5d07fc30f2804dc62bef.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nKeycloak es un producto de c\u00f3digo abierto destinado a la identificaci\u00f3n y control de acceso, respaldado por la empresa RedHat. Es la base para los productos de la empresa que utilizan SSO: RH-SSO.<\/p>\n<h3>Conceptos b\u00e1sicos <\/h3>\n<p>\nAntes de comenzar a revisar soluciones y enfoques, es necesario aclarar los t\u00e9rminos y la secuencia de procesos:<\/p>\n<p><img decoding=\"async\" alt=\"SSO en arquitectura de microservicios. Usando Keycloak. Parte n.\u00ba 1\" src=\"\/wp-content\/uploads\/2020\/02\/3a83d4364425aeed1019662fd1d5f152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Identificaci\u00f3n<\/b> \u2014 es el procedimiento para reconocer a un sujeto por su identificador (en otras palabras, es determinar el nombre, inicio de sesi\u00f3n o n\u00famero).<\/p>\n<p><b>Autenticaci\u00f3n<\/b> \u2014 es el procedimiento de autenticaci\u00f3n (se verifica al usuario mediante una contrase\u00f1a, un correo se valida mediante firma electr\u00f3nica, etc.).<\/p>\n<p><b>Autorizaci\u00f3n<\/b> \u2014 es la concesi\u00f3n de acceso a alg\u00fan recurso (por ejemplo, al correo electr\u00f3nico).<\/p>\n<h4>Br\u00f3ker de identidad Keycloak<\/h4>\n<p>\n<b>Keycloak<\/b> \u2014 es una soluci\u00f3n para la gesti\u00f3n de identidades y accesos de c\u00f3digo abierto, dise\u00f1ada para ser utilizada en sistemas donde se pueden emplear patrones de arquitectura de microservicios.<\/p>\n<p>Keycloak ofrece funciones como inicio \u00fanico (SSO), identificaci\u00f3n de br\u00f3ker y acceso social, federaci\u00f3n de usuarios, adaptadores de clientes, consola de administraci\u00f3n y consola de gesti\u00f3n de cuentas.<\/p>\n<p>Funcionalidades b\u00e1sicas soportadas en Keycloak:<\/p>\n<ul>\n<li>Single-Sign On y Single-Sign Out para aplicaciones web.<\/li>\n<li>Soporte para OpenID\/OAuth 2.0\/SAML.<\/li>\n<li>Identificaci\u00f3n de Agentes \u2013 autenticaci\u00f3n mediante proveedores de identidad externos OpenID Connect o SAML.<\/li>\n<li>Inicio de Sesi\u00f3n Social \u2013 soporte para Google, GitHub, Facebook, Twitter para la identificaci\u00f3n de usuarios.<\/li>\n<li>Federaci\u00f3n de Usuarios \u2013 sincronizaci\u00f3n de usuarios desde servidores LDAP y Active Directory y otros proveedores de identidad.<\/li>\n<li>Puente Kerberos \u2013 uso del servidor Kerberos para la autenticaci\u00f3n autom\u00e1tica de usuarios.<\/li>\n<li>Consola Administrativa \u2014 para la gesti\u00f3n unificada de configuraciones y par\u00e1metros de la soluci\u00f3n a trav\u00e9s de la Web.<\/li>\n<li>Consola de Gesti\u00f3n de Cuentas \u2013 para la autogesti\u00f3n del perfil de usuarios.<\/li>\n<li>Personalizaci\u00f3n de la soluci\u00f3n basada en la identidad corporativa.<\/li>\n<li>Autenticaci\u00f3n 2FA \u2013 soporte para TOTP\/HOTP mediante Google Authenticator o FreeOTP.<\/li>\n<li>Flujos de Inicio de Sesi\u00f3n \u2013 posibilidad de auto registro de usuarios, recuperaci\u00f3n y restablecimiento de contrase\u00f1as, y m\u00e1s.<\/li>\n<li>Gesti\u00f3n de Sesiones \u2013 los administradores pueden gestionar las sesiones de los usuarios desde un \u00fanico punto.<\/li>\n<li>Mapeadores de Tokens \u2013 vinculaci\u00f3n de atributos de usuarios, roles y otros atributos necesarios en los tokens.<\/li>\n<li>Gesti\u00f3n flexible de pol\u00edticas a trav\u00e9s de realm, aplicaci\u00f3n y usuarios.<\/li>\n<li>Soporte CORS \u2013 adaptadores de cliente tienen soporte incorporado para CORS.<\/li>\n<li>Interfaces de Proveedor de Servicios (SPI) \u2013 gran cantidad de SPI que permiten configurar varios aspectos del funcionamiento del servidor: flujos de autenticaci\u00f3n, proveedores de identidad, mapeo de protocolos y mucho m\u00e1s.<\/li>\n<li>Adaptadores de cliente para aplicaciones JavaScript, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.<\/li>\n<li>Soporte para trabajar con diversas aplicaciones que utilizan la biblioteca OpenID Connect Relying Party o la biblioteca SAML 2.0 Service Provider.<\/li>\n<li>Posibilidad de expansi\u00f3n mediante plugins.<\/li>\n<\/ul>\n<p>\nPara procesos CI\/CD y tambi\u00e9n la automatizaci\u00f3n de procesos de gesti\u00f3n en Keycloak, se puede utilizar REST API\/JAVA API. La documentaci\u00f3n est\u00e1 disponible en formato electr\u00f3nico: <\/p>\n<p>REST API <noindex><a rel=\"nofollow\" href=\"https:\/\/www.keycloak.org\/docs-api\/8.0\/rest-api\/index.html\">https:\/\/www.keycloak.org\/docs-api\/8.0\/rest-api\/index.html<\/a><\/noindex><br \/>\nJAVA API <noindex><a rel=\"nofollow\" href=\"https:\/\/www.keycloak.org\/docs-api\/8.0\/javadocs\/index.html\">https:\/\/www.keycloak.org\/docs-api\/8.0\/javadocs\/index.html<\/a><\/noindex><\/p>\n<h4>Proveedores de identidad a nivel empresarial (On-Premise)<\/h4>\n<p>\nPosibilidad de autenticaci\u00f3n de usuarios a trav\u00e9s de servicios de Federaci\u00f3n de Usuarios.<\/p>\n<p><img decoding=\"async\" alt=\"SSO en arquitectura de microservicios. Usando Keycloak. Parte n.\u00ba 1\" src=\"\/wp-content\/uploads\/2020\/02\/59bbeaf4630855467ddb003d52b0c1b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTambi\u00e9n se puede utilizar la autenticaci\u00f3n \u00fanica: si los usuarios se autentican en estaciones de trabajo con Kerberos (LDAP o AD), pueden ser autenticados autom\u00e1ticamente en Keycloak sin necesidad de volver a ingresar su nombre de usuario y contrase\u00f1a. <\/p>\n<p>Para la autenticaci\u00f3n y autorizaci\u00f3n de los usuarios, es posible utilizar una base de datos relacional, lo cual es m\u00e1s aplicable para entornos de desarrollo, ya que no implica configuraciones e integraciones prolongadas en las primeras etapas de los proyectos. Por defecto, Keycloak utiliza una base de datos incorporada para almacenar la configuraci\u00f3n y los datos de los usuarios.<\/p>\n<p>La lista de bases de datos soportadas es amplia e incluye: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle y otras. Las que han sido m\u00e1s probadas hasta el momento son Oracle 12C Release1 RAC y Galera 3.12 cluster para MariaDB 10.1.19. <\/p>\n<h4>Proveedores de identidad \u2014 inicio de sesi\u00f3n social <\/h4>\n<p>\nEs posible utilizar el inicio de sesi\u00f3n desde redes sociales. Para activar la posibilidad de autenticar a los usuarios, se utiliza la consola de administraci\u00f3n de Keycloak. No se requieren cambios en el c\u00f3digo de las aplicaciones y esta funcionalidad est\u00e1 disponible 'de f\u00e1brica' y puede ser activada en cualquier etapa de la implementaci\u00f3n del proyecto.<\/p>\n<p><img decoding=\"async\" alt=\"SSO en arquitectura de microservicios. Usando Keycloak. Parte n.\u00ba 1\" src=\"\/wp-content\/uploads\/2020\/02\/546ddea10c79662ca37a448d3dfc1fd0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPara la autenticaci\u00f3n de usuarios, es posible utilizar proveedores de identidad OpenID\/SAML.<\/p>\n<h3>Escenarios t\u00edpicos de autorizaci\u00f3n utilizando OAuth2 en Keycloak<\/h3>\n<p>\n<b>Flujo de C\u00f3digo de Autorizaci\u00f3n <\/b> \u2014 se utiliza con aplicaciones del lado del servidor (server-side applications). Uno de los tipos m\u00e1s comunes de autorizaci\u00f3n, ya que es muy adecuado para aplicaciones del lado del servidor, donde el c\u00f3digo fuente de la aplicaci\u00f3n y los datos del cliente no son accesibles para terceros. En este caso, el proceso se basa en la redirecci\u00f3n. La aplicaci\u00f3n debe poder interactuar con el agente del usuario (user-agent), como un navegador web, para recibir c\u00f3digos de autorizaci\u00f3n de API redirigidos a trav\u00e9s del agente del usuario.<\/p>\n<p><b>Flujo Impl\u00edcito<\/b> \u2014 se utiliza por aplicaciones m\u00f3viles o web (aplicaciones que funcionan en el dispositivo del usuario).<\/p>\n<p>El tipo impl\u00edcito de autorizaci\u00f3n se utiliza en aplicaciones m\u00f3viles y web, donde no se puede garantizar la privacidad del cliente. Este tipo de autorizaci\u00f3n tambi\u00e9n utiliza la redirecci\u00f3n del agente de usuario, pasando el token de acceso al agente de usuario para su uso posterior en la aplicaci\u00f3n. Esto hace que el token est\u00e9 disponible para el usuario y otras aplicaciones en el dispositivo del usuario. Con este tipo de autorizaci\u00f3n, no se lleva a cabo la autenticaci\u00f3n de la aplicaci\u00f3n y el proceso se basa en la URL de redirecci\u00f3n (registrada previamente en el servicio).<\/p>\n<p>El flujo impl\u00edcito no admite tokens de actualizaci\u00f3n (refresh tokens).<br \/>\n<br \/>\n<b>Flujo de concesi\u00f3n de credenciales del cliente<\/b> \u2014 se utiliza cuando una aplicaci\u00f3n accede a una API. Este tipo de autorizaci\u00f3n se utiliza normalmente para interacciones \u00abservidor-servidor\u00bb que deben ejecutarse en segundo plano sin interacci\u00f3n inmediata del usuario. El flujo de otorgaci\u00f3n de credenciales del cliente permite que un servicio web (cliente confidencial) utilice sus propias credenciales en lugar de representar al usuario para la autenticaci\u00f3n al llamar a otro servicio web. Para un mayor nivel de seguridad, el servicio que realiza la llamada puede utilizar un certificado (en lugar de un secreto compartido) como credenciales.<\/p>\n<p>La especificaci\u00f3n OAuth2 est\u00e1 descrita en <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc6749\">RFC-6749<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc8259\">RFC-8252<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc6819\">RFC-6819<\/a><\/noindex><\/p>\n<h3>Token JWT y sus ventajas<\/h3>\n<p>\nJWT (JSON Web Token) es un est\u00e1ndar abierto (<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc7519\">https:\/\/tools.ietf.org\/html\/rfc7519<\/a><\/noindex>), que define un m\u00e9todo compacto y aut\u00f3nomo para la transmisi\u00f3n segura de informaci\u00f3n entre partes en forma de objeto JSON.<\/p>\n<p>Seg\u00fan el est\u00e1ndar, el token consta de tres partes en formato base-64, separadas por puntos. La primera parte se llama encabezado (header), que contiene el tipo de token y el nombre del algoritmo de hash utilizado para obtener la firma digital. La segunda parte almacena la informaci\u00f3n principal (usuario, atributos, etc.). La tercera parte es la firma digital.<\/p>\n<p>..<br \/>\nNunca almacenes el token en tu base de datos. Porque un token v\u00e1lido es equivalente a una contrase\u00f1a; almacenar el token es lo mismo que almacenar una contrase\u00f1a en texto claro.<br \/>\n<b>Token de acceso <\/b>\u2014 es un token que proporciona a su propietario acceso a recursos protegidos en el servidor. Normalmente, tiene una vida \u00fatil corta y puede contener informaci\u00f3n adicional, como la direcci\u00f3n IP de la parte que solicita este token.<\/p>\n<p><b>Token de actualizaci\u00f3n <\/b>\u2014 es un token que permite a los clientes solicitar nuevos tokens de acceso una vez que hayan expirado. Estos tokens generalmente se emiten por un per\u00edodo prolongado.<\/p>\n<p>Principales ventajas de su uso en arquitectura de microservicios:<\/p>\n<ul>\n<li>Posibilidad de acceder a varias aplicaciones y servicios a trav\u00e9s de una \u00fanica autenticaci\u00f3n.<\/li>\n<li>Si faltan ciertos atributos requeridos en el perfil de usuario, es posible enriquecer los datos que se pueden agregar a la carga \u00fatil, incluso de manera automatizada y \"en tiempo real\".<\/li>\n<li>No es necesario almacenar informaci\u00f3n sobre sesiones activas; la aplicaci\u00f3n del servidor solo necesita verificar la firma.<\/li>\n<li>Gesti\u00f3n de acceso m\u00e1s flexible gracias a atributos adicionales en la carga \u00fatil.<\/li>\n<li>El uso de la firma del token para el encabezado y la carga \u00fatil aumenta la seguridad de la soluci\u00f3n en general.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Token JWT \u2014 composici\u00f3n<\/h3>\n<p>\n<b>Encabezado<\/b> \u2014 por defecto, el encabezado contiene solo el tipo de token y el algoritmo utilizado para la encriptaci\u00f3n.<\/p>\n<p>El tipo de token se almacena en la clave \"typ\". La clave \"typ\" es ignorada en JWT. Si la clave \"typ\" est\u00e1 presente, su valor debe ser JWT, para indicar que este objeto es un JSON Web Token.<\/p>\n<p>La segunda clave \"alg\" define el algoritmo utilizado para la encriptaci\u00f3n del token. Por defecto, debe establecerse en HS256. El encabezado se codifica en base64.<\/p>\n<p>{ \"alg\": \"HS256\", \"typ\": \"JWT\"}<br \/>\n<b>Carga \u00fatil (contenido)<\/b> \u2014 en la carga \u00fatil se almacena cualquier informaci\u00f3n que necesite ser verificada. Cada clave en la carga \u00fatil se conoce como \"declaraci\u00f3n\". Por ejemplo, se puede acceder a la aplicaci\u00f3n solo por invitaci\u00f3n (promoci\u00f3n cerrada). Cuando queremos invitar a alguien a participar, le enviamos un correo electr\u00f3nico con la invitaci\u00f3n. Es importante verificar que la direcci\u00f3n de correo electr\u00f3nico pertenece a la persona que acepta la invitaci\u00f3n, por lo que incluiremos esta direcci\u00f3n en la carga \u00fatil, guard\u00e1ndola en la clave \"e-mail\".<\/p>\n<p>{ \"email\": \"example@x5.ru\" }<br \/>\n<br \/>\nLas claves en la carga \u00fatil pueden ser arbitrarias. Sin embargo, hay algunas reservas:<\/p>\n<ul>\n<li>iss (Emisor) \u2014 define la aplicaci\u00f3n desde la cual se env\u00eda el token.<\/li>\n<li>sub (Subject) \u2014 define el tema del token.<\/li>\n<li>aud (Audience) \u2013 un array de cadenas sensibles a may\u00fasculas o URI, que es una lista de destinatarios de este token. Cuando la parte receptora recibe un JWT con esta clave, debe verificar su presencia en los destinatarios; de lo contrario, ignorar el token.<\/li>\n<li>exp (Expiration Time) \u2014 indica cu\u00e1ndo expira el token. El est\u00e1ndar JWT requiere que en todas sus implementaciones, los tokens con tiempo de expiraci\u00f3n hayan sido rechazados. La clave exp debe ser una marca de tiempo en formato unix.<\/li>\n<li>nbf (Not Before) \u2014 es el tiempo en formato unix que define el momento en que el token ser\u00e1 v\u00e1lido.<\/li>\n<li>iat (Issued At) \u2014 esta clave representa el tiempo en que se emiti\u00f3 el token y puede ser utilizada para determinar la edad del JWT. La clave iat debe ser una marca de tiempo en formato unix.<\/li>\n<li>jti (JWT ID) \u2014 una cadena que define el identificador \u00fanico de este token, siendo sensible a may\u00fasculas.<\/li>\n<\/ul>\n<p>\nEs importante entender que la carga \u00fatil no se transmite de forma encriptada (aunque, los tokens pueden estar anidados, permitiendo as\u00ed transmitir datos encriptados). Por tanto, no se puede almacenar informaci\u00f3n secreta en ella. Al igual que el encabezado, la carga \u00fatil se codifica en base64.<br \/>\n<b>Firma<\/b> \u2014 una vez que tenemos el encabezado y la carga \u00fatil, se puede calcular la firma.<\/p>\n<p>Se toman el encabezado y la carga \u00fatil codificados en base64, se combinan en una cadena a trav\u00e9s de un punto. Luego, esta cadena y la clave secreta se pasan al algoritmo de cifrado especificado en el encabezado (clave \"alg\"). La clave puede ser cualquier cadena. Las cadenas m\u00e1s largas ser\u00e1n preferibles, ya que tomar\u00e1n m\u00e1s tiempo para ser descifradas.<\/p>\n<p>{\"alg\":\"RSA1_5\",\"payload\":\"A128CBC-HS256\"}<\/p>\n<h3>Construcci\u00f3n de la arquitectura de un cl\u00faster de Keycloak resistente a fallos<\/h3>\n<p>\nAl utilizar un \u00fanico cl\u00faster para todos los proyectos, se generan mayores requisitos para la soluci\u00f3n de SSO. Cuando el n\u00famero de proyectos no es grande, estos requisitos no son tan perceptibles para todos los proyectos; sin embargo, a medida que aumenta la cantidad de usuarios e integraciones, tambi\u00e9n lo hacen los requerimientos de disponibilidad y rendimiento. <\/p>\n<p>El aumento de los riesgos de fallo del SSO unificado incrementa los requisitos para la arquitectura de la soluci\u00f3n y los m\u00e9todos de respaldo de los componentes, lo que resulta en un SLA muy estricto. Por ello, en las fases de desarrollo o implementaci\u00f3n temprana de las soluciones, los proyectos suelen tener su propia infraestructura que no es tolerante a fallos. A medida que avanza el desarrollo, es necesario incorporar capacidades de crecimiento y escalado. La forma m\u00e1s flexible de construir un cl\u00faster tolerante a fallos es mediante la virtualizaci\u00f3n de contenedores o un enfoque h\u00edbrido. <\/p>\n<p>Para operar en modo Active\/Active y Active\/Passive, el cl\u00faster debe garantizar la consistencia de los datos en la base de datos relacional: ambos nodos de la base de datos deben replicarse de manera sincr\u00f3nica entre diferentes centros de datos geogr\u00e1ficamente distribuidos.<\/p>\n<p>El ejemplo m\u00e1s sencillo de una instalaci\u00f3n tolerante a fallos.<\/p>\n<p><img decoding=\"async\" alt=\"SSO en arquitectura de microservicios. Usando Keycloak. Parte n.\u00ba 1\" src=\"\/wp-content\/uploads\/2020\/02\/c0df30a07e7dda5ae892a1fca3790a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00bfCu\u00e1les son las ventajas de utilizar un cl\u00faster unificado?<\/p>\n<ul>\n<li>Alta disponibilidad y rendimiento.<\/li>\n<li>Soporte para los modos de operaci\u00f3n: Active\/Active, Active\/Passive.<\/li>\n<li>Capacidad de escalado din\u00e1mico \u2014 al utilizar virtualizaci\u00f3n de contenedores.<\/li>\n<li>Posibilidad de gesti\u00f3n y monitoreo centralizado.<\/li>\n<li>Un enfoque \u00fanico para la identificaci\u00f3n\/autenticaci\u00f3n\/autorizaci\u00f3n de usuarios en los proyectos.<\/li>\n<li>Interacci\u00f3n m\u00e1s transparente entre diversos proyectos sin la participaci\u00f3n de los usuarios.<\/li>\n<li>Posibilidad de reutilizar el token JWT en diferentes proyectos.<\/li>\n<li>Un solo punto de confianza.<\/li>\n<li>Lanzamiento m\u00e1s r\u00e1pido de proyectos utilizando microservicios\/virtualizaci\u00f3n de contenedores (no se requiere levantar y configurar componentes adicionales).<\/li>\n<li>Es posible adquirir soporte comercial del proveedor. <\/li>\n<\/ul>\n<p><\/p>\n<h3>Aspectos a tener en cuenta al planificar un cl\u00faster<\/h3>\n<p><\/p>\n<h4>SGBD<\/h4>\n<p>\nKeycloak utiliza un sistema de gesti\u00f3n de bases de datos para almacenar: realms, clients, users, etc.<br \/>\nSe admite una amplia gama de bases de datos: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak se entrega con su propia base de datos relacional integrada. Se recomienda su uso para entornos no cargados, como los entornos de desarrollo.<\/p>\n<p>Para operar en modo Active\/Active y Active\/Passive, el cl\u00faster debe garantizar la consistencia de los datos en la base de datos relacional y ambos nodos del cl\u00faster de base de datos se replican de forma sincr\u00f3nica entre los centros de datos.<\/p>\n<h4>Cach\u00e9 distribuido (Infinispan)<\/h4>\n<p>\nPara un funcionamiento correcto del cl\u00faster, se requiere la sincronizaci\u00f3n adicional de los siguientes tipos de cach\u00e9 utilizando JBoss Data Grid:<\/p>\n<p>Sesiones de autenticaci\u00f3n: se utilizan para mantener los datos durante la autenticaci\u00f3n de un usuario espec\u00edfico. Las solicitudes de este cach\u00e9 generalmente incluyen solo el navegador y el servidor Keycloak, y no la aplicaci\u00f3n.<\/p>\n<p>Tokens de acci\u00f3n: se utilizan en escenarios donde el usuario necesita confirmar una acci\u00f3n de forma as\u00edncrona (por correo electr\u00f3nico). Por ejemplo, durante el flujo de olvido de contrase\u00f1a, el cach\u00e9 actionTokens de Infinispan se utiliza para rastrear metadatos sobre los tokens de acci\u00f3n relacionados que ya se han utilizado, por lo que no se pueden reutilizar.<\/p>\n<p>Cach\u00e9 e invalidaci\u00f3n de datos persistentes: se utiliza para almacenar en cach\u00e9 datos persistentes para evitar consultas innecesarias a la base de datos. Cuando un servidor Keycloak actualiza datos, todos los dem\u00e1s servidores Keycloak en todos los centros de datos deben estar al tanto.<\/p>\n<p>Trabajo: se utiliza \u00fanicamente para enviar mensajes de invalidaci\u00f3n entre nodos del cl\u00faster y centros de datos. <\/p>\n<p>Sesiones de usuario: se utilizan para almacenar datos sobre sesiones de usuario que son v\u00e1lidas durante la sesi\u00f3n del navegador del usuario. El cach\u00e9 debe manejar solicitudes HTTP del usuario final y de la aplicaci\u00f3n. <\/p>\n<p>Protecci\u00f3n contra ataques de fuerza bruta: se utiliza para rastrear datos sobre intentos de inicio de sesi\u00f3n fallidos. <\/p>\n<h4>Balanceo de carga<\/h4>\n<p>\nEl balanceador de carga es el \u00fanico punto de entrada en Keycloak y debe admitir sesiones pegajosas. <\/p>\n<h4>Servidores de aplicaciones<\/h4>\n<p>\nSe utilizan para controlar la interacci\u00f3n entre componentes y pueden ser virtualizados o contenerizados utilizando herramientas de automatizaci\u00f3n existentes y escalado din\u00e1mico de infraestructura. Los escenarios de implementaci\u00f3n m\u00e1s comunes en OpenShift, Kubernetes, Rancher.<\/p>\n<p>Aqu\u00ed finaliza la primera parte, la te\u00f3rica. En los siguientes ciclos de art\u00edculos, se analizar\u00e1n ejemplos de integraciones con varios proveedores de identidad y ejemplos de configuraciones.<br \/>\n<br \/>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/X5RetailGroup\/blog\/486778\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0421 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438 \u0442\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Single-Sing-On (SSO). \u041d\u043e \u043a\u0430\u043a \u0431\u044b\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b \u043a\u0430\u043a AD \u0438\u043b\u0438 \u0438\u043d\u044b\u0435, \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":40866,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-40865","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47SSO \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Keycloak. \u0427\u0430\u0441\u0442\u044c \u21161 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-05T07:07:04+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-05T07:07:04+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47SSO en arquitectura de microservicios. Usamos Keycloak. Parte n\u00ba 1 | ProHoster","description":"En cualquier gran empresa, y X5 Retail Group no es la excepci\u00f3n, a medida que se desarrolla, aumenta el n\u00famero de proyectos donde se requiere la autorizaci\u00f3n de usuarios.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47SSO \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Keycloak. \u0427\u0430\u0441\u0442\u044c \u21161 | ProHoster","og:description":"\u0412 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0438 X5 Retail Group \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.","og:url":"https:\/\/prohoster.info\/es\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-05T07:07:04+00:00","article:modified_time":"2020-02-05T07:07:04+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"40865","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:46:14","updated":"2022-09-27 14:28:39","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/40865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=40865"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/40865\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/40866"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=40865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=40865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=40865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}