{"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\/pt\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","title":{"rendered":"SSO em arquitetura de microsservi\u00e7os. Usando Keycloak. Parte n\u00ba 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Em qualquer grande empresa, e o X5 Retail Group n\u00e3o \u00e9 exce\u00e7\u00e3o, \u00e0 medida que se desenvolve, aumenta a quantidade de projetos onde \u00e9 necess\u00e1ria a autoriza\u00e7\u00e3o de usu\u00e1rios. Com o tempo, h\u00e1 uma necessidade de transi\u00e7\u00e3o sem costura dos usu\u00e1rios de um aplicativo para outro e, ent\u00e3o, surge a necessidade de usar um servidor \u00fanico de Single-Sign-On (SSO). Mas como proceder quando provedores de identifica\u00e7\u00e3o como AD ou outros, que n\u00e3o possuem atributos adicionais, j\u00e1 est\u00e3o sendo usados em diversos projetos? A solu\u00e7\u00e3o pode ser encontrada na classe de sistemas chamada 'brokers de identidade'. Os representantes mais funcionais incluem, por exemplo, Keycloak, Gravitee Access Management, entre outros. Os cen\u00e1rios de uso podem variar: intera\u00e7\u00e3o entre m\u00e1quinas, participa\u00e7\u00e3o de usu\u00e1rios, etc. A solu\u00e7\u00e3o deve suportar funcionalidades flex\u00edveis e escal\u00e1veis, capazes de reunir todos os requisitos em uma \u00fanica plataforma, e a solu\u00e7\u00e3o em nossa empresa atualmente \u00e9 o broker de identidade - Keycloak. <\/p>\n<p><img decoding=\"async\" alt=\"SSO em arquitetura de microsservi\u00e7os. 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 \u00e9 um produto de c\u00f3digo aberto projetado para identifica\u00e7\u00e3o e controle de acesso, mantido pela RedHat. Ele \u00e9 a base dos produtos da empresa que utilizam SSO - RH-SSO.<\/p>\n<h3>Conceitos principais <\/h3>\n<p>\nAntes de come\u00e7ar a entender as solu\u00e7\u00f5es e abordagens, \u00e9 necess\u00e1rio definir os termos e a sequ\u00eancia dos processos:<\/p>\n<p><img decoding=\"async\" alt=\"SSO em arquitetura de microsservi\u00e7os. 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>Identifica\u00e7\u00e3o<\/b> \u2014 \u00e9 o procedimento de reconhecimento de um sujeito por seu identificador (em termos simples, \u00e9 a defini\u00e7\u00e3o do nome, login ou n\u00famero).<\/p>\n<p><b>Autentica\u00e7\u00e3o<\/b> \u2014 \u00e9 o procedimento de autentica\u00e7\u00e3o (o usu\u00e1rio \u00e9 verificado por meio de uma senha, o e-mail \u00e9 verificado por assinatura eletr\u00f4nica, etc.)<\/p>\n<p><b>Autoriza\u00e7\u00e3o<\/b> \u2014 \u00e9 a concess\u00e3o de acesso a um recurso (por exemplo, ao e-mail).<\/p>\n<h4>Broker de Identidade Keycloak<\/h4>\n<p>\n<b>Keycloak<\/b> \u2014 \u00e9 uma solu\u00e7\u00e3o para gerenciamento de identidade e acesso de c\u00f3digo aberto, destinada a ser usada em sistemas de informa\u00e7\u00e3o onde podem ser aplicados padr\u00f5es de arquitetura de microsservi\u00e7os.<\/p>\n<p>Keycloak oferece recursos como logon \u00fanico (SSO), identifica\u00e7\u00e3o de broker, login social, federa\u00e7\u00e3o de usu\u00e1rios, adaptadores de cliente, console de administra\u00e7\u00e3o e console de gerenciamento de contas.<\/p>\n<p>Funcionalidade b\u00e1sica suportada pelo Keycloak:<\/p>\n<ul>\n<li>Single-Sign On e Single-Sign Out para aplicativos de navegador.<\/li>\n<li>Suporte para OpenID\/OAuth 2.0\/SAML.<\/li>\n<li>Intermedia\u00e7\u00e3o de Identidade \u2013 autentica\u00e7\u00e3o atrav\u00e9s de provedores de identidade externos OpenID Connect ou SAML.<\/li>\n<li>Login Social \u2013 suporte a Google, GitHub, Facebook, Twitter para identifica\u00e7\u00e3o de usu\u00e1rios.<\/li>\n<li>Federa\u00e7\u00e3o de Usu\u00e1rios \u2013 sincroniza\u00e7\u00e3o de usu\u00e1rios a partir de servidores LDAP e Active Directory e outros provedores de identidade.<\/li>\n<li>Ponte Kerberos \u2013 utiliza\u00e7\u00e3o de servidor Kerberos para autentica\u00e7\u00e3o autom\u00e1tica de usu\u00e1rios.<\/li>\n<li>Console de Administra\u00e7\u00e3o \u2014 para gerenciamento centralizado de configura\u00e7\u00f5es e par\u00e2metros da solu\u00e7\u00e3o via Web.<\/li>\n<li>Console de Gerenciamento de Contas \u2013 para gerenciamento aut\u00f4nomo do perfil dos usu\u00e1rios.<\/li>\n<li>Customiza\u00e7\u00e3o da solu\u00e7\u00e3o com base na identidade visual da empresa.<\/li>\n<li>Autentica\u00e7\u00e3o 2FA \u2013 suporte a TOTP\/HOTP com Google Authenticator ou FreeOTP.<\/li>\n<li>Fluxos de Login \u2013 possibilidade de auto-registro de usu\u00e1rios, recupera\u00e7\u00e3o e redefini\u00e7\u00e3o de senha, entre outros.<\/li>\n<li>Gerenciamento de Sess\u00f5es \u2013 administradores podem gerenciar sess\u00f5es de usu\u00e1rios a partir de um ponto \u00fanico.<\/li>\n<li>Mapeadores de Token \u2013 vincula\u00e7\u00e3o de atributos de usu\u00e1rios, fun\u00e7\u00f5es e outros atributos necess\u00e1rios em tokens.<\/li>\n<li>Gerenciamento flex\u00edvel de pol\u00edticas atrav\u00e9s de realms, aplica\u00e7\u00f5es e usu\u00e1rios.<\/li>\n<li>Suporte CORS \u2013 adaptadores de cliente t\u00eam suporte integrado para CORS.<\/li>\n<li>Interfaces de Provedor de Servi\u00e7o (SPI) \u2013 uma grande quantidade de SPIs que permitem configurar v\u00e1rios aspectos da opera\u00e7\u00e3o do servidor: fluxos de autentica\u00e7\u00e3o, provedores de identidade, mapeamento de protocolos e muito mais.<\/li>\n<li>Adaptadores de cliente para aplica\u00e7\u00f5es JavaScript, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.<\/li>\n<li>Suporte a v\u00e1rias aplica\u00e7\u00f5es que utilizam a biblioteca OpenID Connect Relying Party ou a biblioteca SAML 2.0 Service Provider.<\/li>\n<li>Possibilidade de extens\u00e3o com o uso de plugins.<\/li>\n<\/ul>\n<p>\nPara processos de CI\/CD, assim como automa\u00e7\u00e3o de processos de gerenciamento no Keycloak, pode ser utilizado REST API\/JAVA API. A documenta\u00e7\u00e3o est\u00e1 dispon\u00edvel em formato eletr\u00f4nico: <\/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>Provedores de identidade de n\u00edvel empresarial (On-Premise)<\/h4>\n<p>\nPossibilidade de autentica\u00e7\u00e3o de usu\u00e1rios atrav\u00e9s de servi\u00e7os de Federa\u00e7\u00e3o de Usu\u00e1rios.<\/p>\n<p><img decoding=\"async\" alt=\"SSO em arquitetura de microsservi\u00e7os. Usando Keycloak. Parte n\u00ba 1\" src=\"\/wp-content\/uploads\/2020\/02\/59bbeaf4630855467ddb003d52b0c1b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAutentica\u00e7\u00e3o \u00fanica tamb\u00e9m pode ser utilizada \u2014 se os usu\u00e1rios se autenticarem em esta\u00e7\u00f5es de trabalho com Kerberos (LDAP ou AD), poder\u00e3o ser autenticados automaticamente no Keycloak sem necessidade de inserir novamente seu nome de usu\u00e1rio e senha. <\/p>\n<p>Para autentica\u00e7\u00e3o e autoriza\u00e7\u00e3o cont\u00ednua de usu\u00e1rios, \u00e9 poss\u00edvel usar um banco de dados relacional, o que \u00e9 mais aplicado em ambientes de desenvolvimento, pois n\u00e3o requer configura\u00e7\u00f5es e integra\u00e7\u00f5es longas nas fases iniciais dos projetos. Por padr\u00e3o, o Keycloak utiliza um banco de dados embutido para armazenar configura\u00e7\u00f5es e dados de usu\u00e1rios.<\/p>\n<p>A lista de bancos de dados suportados \u00e9 extensa e inclui: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle e outros. Os mais testados at\u00e9 o momento s\u00e3o o Oracle 12C Release1 RAC e o Galera 3.12 cluster para MariaDB 10.1.19. <\/p>\n<h4>Provedores de identidade \u2014 login social <\/h4>\n<p>\n\u00c9 poss\u00edvel usar credenciais de redes sociais. Para ativar a autentica\u00e7\u00e3o de usu\u00e1rios, utiliza-se o console do administrador do Keycloak. N\u00e3o s\u00e3o necess\u00e1rias altera\u00e7\u00f5es no c\u00f3digo das aplica\u00e7\u00f5es, e essa funcionalidade est\u00e1 dispon\u00edvel 'pronta para uso' e pode ser ativada em qualquer est\u00e1gio de implementa\u00e7\u00e3o do projeto.<\/p>\n<p><img decoding=\"async\" alt=\"SSO em arquitetura de microsservi\u00e7os. Usando Keycloak. Parte n\u00ba 1\" src=\"\/wp-content\/uploads\/2020\/02\/546ddea10c79662ca37a448d3dfc1fd0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPara autentica\u00e7\u00e3o de usu\u00e1rios, \u00e9 poss\u00edvel utilizar provedores de identidade OpenID\/SAML.<\/p>\n<h3>Cen\u00e1rios t\u00edpicos de autoriza\u00e7\u00e3o com uso de OAuth2 no Keycloak<\/h3>\n<p>\n<b>Fluxo de C\u00f3digo de Autoriza\u00e7\u00e3o <\/b> \u2014 utilizado com aplica\u00e7\u00f5es de servidor (server-side applications). Um dos tipos mais comuns de autoriza\u00e7\u00e3o, pois se adapta bem a aplica\u00e7\u00f5es de servidor, onde o c\u00f3digo-fonte e os dados do cliente n\u00e3o est\u00e3o acess\u00edveis externamente. O processo \u00e9 baseado em redirecionamento. A aplica\u00e7\u00e3o deve ser capaz de interagir com o agente do usu\u00e1rio (user-agent), como um navegador da web \u2014 recebendo c\u00f3digos de autoriza\u00e7\u00e3o da API redirecionados atrav\u00e9s do agente do usu\u00e1rio.<\/p>\n<p><b>Fluxo Impl\u00edcito<\/b> \u2014 utilizado por aplica\u00e7\u00f5es m\u00f3veis ou da web (aplica\u00e7\u00f5es que operam no dispositivo do usu\u00e1rio).<\/p>\n<p>O tipo de autoriza\u00e7\u00e3o impl\u00edcita \u00e9 utilizado por aplicativos m\u00f3veis e da web, onde a privacidade do cliente n\u00e3o pode ser garantida. Este tipo de autoriza\u00e7\u00e3o tamb\u00e9m utiliza o redirecionamento do agente do usu\u00e1rio, onde o token de acesso \u00e9 passado para o agente do usu\u00e1rio para uso posterior no aplicativo. Isso torna o token acess\u00edvel ao usu\u00e1rio e a outros aplicativos no dispositivo do usu\u00e1rio. Nesse tipo de autoriza\u00e7\u00e3o, n\u00e3o h\u00e1 autentica\u00e7\u00e3o da autenticidade do aplicativo, e o pr\u00f3prio processo depende da URL de redirecionamento (registrada anteriormente no servi\u00e7o).<\/p>\n<p>O Fluxo Impl\u00edcito n\u00e3o suporta tokens de atualiza\u00e7\u00e3o do token de acesso (refresh tokens).<br \/>\n<br \/>\n<b>Fluxo de Client Credentials Grant<\/b> \u2014 \u00e9 usado para acesso do aplicativo \u00e0 API. Este tipo de autoriza\u00e7\u00e3o \u00e9 geralmente utilizado para intera\u00e7\u00f5es 'servidor-servidor', que devem ser executadas em segundo plano sem intera\u00e7\u00e3o imediata com o usu\u00e1rio. O Fluxo de Credenciais do Cliente permite que um servi\u00e7o da web (cliente confidencial) utilize suas pr\u00f3prias credenciais em vez da representa\u00e7\u00e3o do usu\u00e1rio para autentica\u00e7\u00e3o ao chamar outro servi\u00e7o da web. Para um n\u00edvel mais alto de seguran\u00e7a, o servi\u00e7o chamador pode usar um certificado (em vez de um segredo compartilhado) como credenciais.<\/p>\n<p>A especifica\u00e7\u00e3o OAuth2 \u00e9 descrita em <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 e suas vantagens<\/h3>\n<p>\nJWT (JSON Web Token) \u00e9 um padr\u00e3o aberto (<noindex><a rel=\"nofollow\" href=\"https:\/\/tools.ietf.org\/html\/rfc7519\">https:\/\/tools.ietf.org\/html\/rfc7519<\/a><\/noindex>), que define uma forma compacta e aut\u00f4noma para a transmiss\u00e3o segura de informa\u00e7\u00f5es entre as partes na forma de um objeto JSON.<\/p>\n<p>De acordo com o padr\u00e3o, o token consiste em tr\u00eas partes em formato base-64, separadas por pontos. A primeira parte \u00e9 chamada de cabe\u00e7alho (header), que cont\u00e9m o tipo de token e o nome do algoritmo de hash para cria\u00e7\u00e3o da assinatura digital. A segunda parte armazena as informa\u00e7\u00f5es principais (usu\u00e1rio, atributos etc.). A terceira parte \u2013 a assinatura digital.<\/p>\n<p>..<br \/>\nNunca armazene o token em seu banco de dados. Pois um token v\u00e1lido \u00e9 equivalente a uma senha, armazenar um token \u00e9 como guardar uma senha em texto claro.<br \/>\n<b>Token de acesso <\/b>\u2014 \u00e9 um token que fornece ao seu propriet\u00e1rio acesso a recursos protegidos do servidor. Normalmente, possui um tempo de vida curto e pode conter informa\u00e7\u00f5es adicionais, como o endere\u00e7o IP da parte que solicita este token.<\/p>\n<p><b>Token de atualiza\u00e7\u00e3o <\/b>\u2014 \u00e9 um token que permite aos clientes solicitar novos tokens de acesso ap\u00f3s o vencimento do prazo de validade. Esses tokens geralmente s\u00e3o emitidos por um longo per\u00edodo.<\/p>\n<p>Principais vantagens da aplica\u00e7\u00e3o na arquitetura de microsservi\u00e7os:<\/p>\n<ul>\n<li>Possibilidade de acesso a diferentes aplica\u00e7\u00f5es e servi\u00e7os por meio de uma \u00fanica autentica\u00e7\u00e3o.<\/li>\n<li>Na aus\u00eancia de v\u00e1rios atributos necess\u00e1rios no perfil dos usu\u00e1rios, \u00e9 poss\u00edvel enriquecer com dados que podem ser adicionados \u00e0 carga \u00fatil, inclusive de forma automatizada e 'on-the-fly'.<\/li>\n<li>N\u00e3o h\u00e1 necessidade de armazenar informa\u00e7\u00f5es sobre sess\u00f5es ativas, a aplica\u00e7\u00e3o do servidor apenas deve verificar a assinatura.<\/li>\n<li>Gerenciamento de acesso mais flex\u00edvel devido a atributos adicionais na carga \u00fatil.<\/li>\n<li>O uso da assinatura do token para o cabe\u00e7alho e a carga \u00fatil aumenta a seguran\u00e7a da solu\u00e7\u00e3o como um todo.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Token JWT \u2014 composi\u00e7\u00e3o<\/h3>\n<p>\n<b>Cabe\u00e7alho<\/b> \u2014 por padr\u00e3o, o cabe\u00e7alho cont\u00e9m apenas o tipo de token e o algoritmo usado para a criptografia.<\/p>\n<p>O tipo de token \u00e9 armazenado na chave 'typ'. A chave 'typ' \u00e9 ignorada no JWT. Se a chave 'typ' estiver presente, seu valor deve ser JWT para indicar que este objeto \u00e9 um JSON Web Token.<\/p>\n<p>A segunda chave 'alg' define o algoritmo utilizado para criptografar o token. Por padr\u00e3o, deve ser configurado para HS256. O cabe\u00e7alho \u00e9 codificado em base64.<\/p>\n<p>{ \"alg\": \"HS256\", \"typ\": \"JWT\"}<br \/>\n<b>Carga \u00fatil (conte\u00fado)<\/b> \u2014 na carga \u00fatil, armazena-se qualquer informa\u00e7\u00e3o que precise ser verificada. Cada chave na carga \u00fatil \u00e9 conhecida como 'declara\u00e7\u00e3o'. Por exemplo, em uma aplica\u00e7\u00e3o pode-se entrar apenas por convite (promo\u00e7\u00e3o fechada). Quando queremos convidar algu\u00e9m para participar, enviamos um e-mail de convite. \u00c9 importante verificar se o endere\u00e7o de e-mail pertence \u00e0 pessoa que aceita o convite, portanto, incluiremos esse endere\u00e7o na carga \u00fatil, para isso o salvaremos na chave 'e-mail'<\/p>\n<p>{ \"email\": \"example@x5.ru\" }<br \/>\n<br \/>\nAs chaves na carga \u00fatil podem ser arbitr\u00e1rias. No entanto, existem algumas reservadas:<\/p>\n<ul>\n<li>iss (Emissor) \u2014 define a aplica\u00e7\u00e3o da qual o token \u00e9 enviado.<\/li>\n<li>sub (Assunto) \u2014 define o tema do token.<\/li>\n<li>aud (P\u00fablico) \u2013 um array de strings ou URIs que diferencia mai\u00fasculas de min\u00fasculas, sendo uma lista de destinat\u00e1rios deste token. Quando a parte receptora recebe o JWT com esta chave, ela deve verificar sua presen\u00e7a entre os destinat\u00e1rios \u2014 caso contr\u00e1rio, deve ignorar o token.<\/li>\n<li>exp (Tempo de Expira\u00e7\u00e3o) \u2014 indica quando o token expira. O padr\u00e3o JWT requer que em todas as suas implementa\u00e7\u00f5es tokens expirados sejam rejeitados. A chave exp deve ser um timestamp em formato unix.<\/li>\n<li>nbf (N\u00e3o Antes) \u2014 este tempo em formato unix define o momento quando o token se tornar\u00e1 v\u00e1lido.<\/li>\n<li>iat (Emitido Em) \u2014 esta chave representa o tempo em que o token foi emitido e pode ser usada para determinar a idade do JWT. A chave iat deve ser um timestamp em formato unix.<\/li>\n<li>jti (ID do JWT) \u2014 uma string que define um identificador \u00fanico para este token, sendo sens\u00edvel a mai\u00fasculas e min\u00fasculas.<\/li>\n<\/ul>\n<p>\n\u00c9 importante entender que a carga \u00fatil n\u00e3o \u00e9 transmitida de forma criptografada (embora os tokens possam ser aninhados e permitir a transmiss\u00e3o de dados criptografados). Portanto, n\u00e3o se pode armazenar informa\u00e7\u00f5es secretas nela. Assim como o cabe\u00e7alho, a carga \u00fatil \u00e9 codificada em base64.<br \/>\n<b>Assinatura<\/b> \u2014 quando temos o cabe\u00e7alho e a carga \u00fatil, podemos calcular a assinatura.<\/p>\n<p>Os dados codificados em base64: cabe\u00e7alho e carga \u00fatil s\u00e3o combinados em uma string atrav\u00e9s de um ponto. Em seguida, esta string e a chave secreta s\u00e3o passadas como entrada para o algoritmo de criptografia especificado no cabe\u00e7alho (chave \"alg\"). A chave pode ser qualquer string. Strings mais longas ser\u00e3o prefer\u00edveis, pois levar\u00e1 mais tempo para serem quebradas.<\/p>\n<p>{\"alg\":\"RSA1_5\",\"payload\":\"A128CBC-HS256\"}<\/p>\n<h3>Constru\u00e7\u00e3o da arquitetura de um cluster de Keycloak resistente a falhas<\/h3>\n<p>\nAo usar um \u00fanico cluster para todos os projetos, surgem exig\u00eancias maiores para a solu\u00e7\u00e3o de SSO. Quando o n\u00famero de projetos \u00e9 pequeno, essas exig\u00eancias n\u00e3o s\u00e3o t\u00e3o percept\u00edveis em todos os projetos, no entanto, \u00e0 medida que o n\u00famero de usu\u00e1rios e integra\u00e7\u00f5es aumenta, as exig\u00eancias de disponibilidade e desempenho crescem. <\/p>\n<p>O aumento dos riscos de falha do SSO \u00fanico eleva as exig\u00eancias para a arquitetura da solu\u00e7\u00e3o e os m\u00e9todos de reserva de componentes utilizados, resultando em um SLA muito rigoroso. Devido a isso, \u00e9 comum que, na fase de desenvolvimento ou nas etapas iniciais de implementa\u00e7\u00e3o das solu\u00e7\u00f5es, os projetos possuam sua pr\u00f3pria infraestrutura n\u00e3o tolerante a falhas. \u00c0 medida que evolui, \u00e9 necess\u00e1rio incorporar capacidades de desenvolvimento e escalabilidade. A constru\u00e7\u00e3o de um cluster tolerante a falhas \u00e9 mais flex\u00edvel com o uso de virtualiza\u00e7\u00e3o em cont\u00eaineres ou de uma abordagem h\u00edbrida. <\/p>\n<p>Para operar em modo Active\/Active e Active\/Passive, o cluster requer a garantia da consist\u00eancia dos dados na base de dados relacional \u2014 ambos os n\u00f3s da base de dados devem ser replicados de forma s\u00edncrona entre diferentes data centers geograficamente distribu\u00eddos.<\/p>\n<p>O exemplo mais simples de uma instala\u00e7\u00e3o tolerante a falhas.<\/p>\n<p><img decoding=\"async\" alt=\"SSO em arquitetura de microsservi\u00e7os. Usando Keycloak. Parte n\u00ba 1\" src=\"\/wp-content\/uploads\/2020\/02\/c0df30a07e7dda5ae892a1fca3790a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuais s\u00e3o as vantagens de usar um cluster \u00fanico:<\/p>\n<ul>\n<li>Alta disponibilidade e desempenho.<\/li>\n<li>Suporte a modos de opera\u00e7\u00e3o: Active\/Active, Active\/Passive.<\/li>\n<li>Capacidade de escalabilidade din\u00e2mica \u2014 ao usar virtualiza\u00e7\u00e3o em cont\u00eaineres.<\/li>\n<li>Capacidade de gest\u00e3o e monitoramento centralizados.<\/li>\n<li>Uma abordagem \u00fanica para a identifica\u00e7\u00e3o\/autentica\u00e7\u00e3o\/autoriza\u00e7\u00e3o de usu\u00e1rios em projetos.<\/li>\n<li>Intera\u00e7\u00f5es mais transparentes entre diferentes projetos sem a participa\u00e7\u00e3o dos usu\u00e1rios.<\/li>\n<li>Capacidade de reutilizar o token JWT em diferentes projetos.<\/li>\n<li>Um \u00fanico ponto de confian\u00e7a.<\/li>\n<li>Implanta\u00e7\u00e3o mais r\u00e1pida de projetos com o uso de microsservi\u00e7os\/virtualiza\u00e7\u00e3o em cont\u00eaineres (n\u00e3o \u00e9 necess\u00e1rio configurar componentes adicionais).<\/li>\n<li>Possibilidade de aquisi\u00e7\u00e3o de suporte comercial do fornecedor. <\/li>\n<\/ul>\n<p><\/p>\n<h3>O que observar ao planejar o cluster<\/h3>\n<p><\/p>\n<h4>SGBD<\/h4>\n<p>\nKeycloak utiliza um sistema de gerenciamento de SGBD para armazenar: realms, clients, users, etc.<br \/>\n\u00c9 suportado um amplo espectro de SGBDs: MS SQL, Oracle, MySQL, PostgreSQL. O Keycloak vem com um banco de dados relacional pr\u00f3prio integrado. \u00c9 recomendado para ambientes de baixa carga \u2014 como ambientes de desenvolvimento.<\/p>\n<p>Para operar em modo Active\/Active e Active\/Passive, \u00e9 necess\u00e1rio garantir a consist\u00eancia dos dados na base de dados relacional e ambos os n\u00f3s do cluster de banco de dados s\u00e3o replicados de forma s\u00edncrona entre os data centers.<\/p>\n<h4>Cache distribu\u00eddo (Infinispan)<\/h4>\n<p>\nPara o funcionamento correto do cluster, \u00e9 necess\u00e1ria a sincroniza\u00e7\u00e3o adicional dos seguintes tipos de cache usando o JBoss Data Grid:<\/p>\n<p>Sess\u00f5es de autentica\u00e7\u00e3o \u2014 utilizadas para armazenar dados durante a autentica\u00e7\u00e3o de um usu\u00e1rio espec\u00edfico. As requisi\u00e7\u00f5es desse cache geralmente incluem apenas o navegador e o servidor Keycloak, e n\u00e3o o aplicativo.<\/p>\n<p>Tokens de a\u00e7\u00e3o \u2014 s\u00e3o utilizados para cen\u00e1rios em que o usu\u00e1rio precisa confirmar uma a\u00e7\u00e3o de forma ass\u00edncrona (por e-mail). Por exemplo, durante o fluxo de recupera\u00e7\u00e3o de senha, o cache actionTokens Infinispan \u00e9 usado para rastrear metadados sobre os tokens de a\u00e7\u00e3o relacionados que j\u00e1 foram utilizados, portanto, eles n\u00e3o podem ser reutilizados.<\/p>\n<p>Cache e invalida\u00e7\u00e3o de dados persistentes \u2013 usado para armazenar em cache dados permanentes, evitando requisi\u00e7\u00f5es desnecess\u00e1rias ao banco de dados. Quando algum servidor Keycloak atualiza dados, todos os outros servidores Keycloak em todos os data centers devem ser informados sobre isso.<\/p>\n<p>Trabalho \u2014 usado apenas para enviar mensagens de invalida\u00e7\u00e3o entre os n\u00f3s do cluster e os data centers. <\/p>\n<p>Sess\u00f5es de usu\u00e1rio \u2014 utilizadas para armazenar dados sobre as sess\u00f5es do usu\u00e1rio, que s\u00e3o v\u00e1lidas durante a sess\u00e3o do navegador do usu\u00e1rio. O cache deve tratar requisi\u00e7\u00f5es HTTP do usu\u00e1rio final e do aplicativo. <\/p>\n<p>Prote\u00e7\u00e3o contra for\u00e7a bruta \u2014 usada para rastrear dados sobre tentativas de login malsucedidas. <\/p>\n<h4>O balanceamento de carga<\/h4>\n<p>\nO balanceador de carga \u00e9 o \u00fanico ponto de entrada no Keycloak e deve suportar sess\u00f5es persistentes. <\/p>\n<h4>Servidores de aplicativos<\/h4>\n<p>\nUsados para controlar a intera\u00e7\u00e3o entre os componentes e podem ser virtualizados ou containerizados com o uso de ferramentas de automa\u00e7\u00e3o existentes e escalonamento din\u00e2mico de infraestrutura. Os cen\u00e1rios de implanta\u00e7\u00e3o mais comuns s\u00e3o no OpenShift, Kubernetes, Rancher.<\/p>\n<p>Aqui termina a primeira parte \u2014 a te\u00f3rica. Nos pr\u00f3ximos ciclos de artigos, ser\u00e3o discutidos exemplos de integra\u00e7\u00f5es com diversos provedores de identidade e exemplos de configura\u00e7\u00f5es.<br \/>\n<br \/>Fonte: <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.3 - 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\/pt\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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 em arquitetura de microsservi\u00e7os. Usamos Keycloak. Parte n\u00ba 1 | ProHoster","description":"Em qualquer grande empresa, e o X5 Retail Group n\u00e3o \u00e9 exce\u00e7\u00e3o, com o desenvolvimento, aumenta o n\u00famero de projetos que requerem autoriza\u00e7\u00e3o de usu\u00e1rios.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/sso-na-mikroservisnoj-arhitekture-ispolzuem-keycloak-chast-%e2%84%961","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/40865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=40865"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/40865\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/40866"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=40865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=40865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=40865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}