O que é Keycloak?
O Keycloak é uma ferramenta Open Source que oferece soluções para a gestão de identidade e controle de acesso. Ele facilita a implementação de autenticação e autorização em sistemas e aplicativos, oferecendo recursos como:
- Autenticação centralizada: Permite que os usuários se autentiquem em várias aplicações utilizando um único login (Single Sign-On – SSO).
- Autorização e controle de acesso: Oferece mecanismos para definir permissões de acesso a recursos e serviços, com suporte a roles (funções) e políticas de segurança.
- Integração com provedores de identidade externos: O Keycloak pode ser integrado com provedores como Google, Facebook, LDAP e outros, permitindo a autenticação de usuários a partir dessas fontes.
- Suporte a protocolos de segurança: O Keycloak é compatível com protocolos de autenticação como OAuth 2.0, OpenID Connect e SAML, facilitando a integração com diversas plataformas e aplicações.
Conceitos básicos do Keycloak
Realm: O realm é um repositório centralizado de usuários, constituindo a base principal para a configuração e gerenciamento dos dados.
Client: O termo client refere-se às “aplicações” ou “clientes” configurados dentro do realm, os quais interagem com os recursos e permissões associadas.
Role: A role é um conjunto de permissões que podem ser atribuídas de forma específica a um client (quando se requer permissões distintas por aplicação) ou ao realm (quando as permissões devem ser independentes das aplicações).
Group: Um group é uma estrutura organizacional que permite a criação de conjuntos de configurações, as quais podem ser aplicadas de maneira centralizada, evitando a necessidade de repetição para cada usuário individual.
Exemplo: Grupo “Departamento Pessoal”.
User: O conceito de user refere-se ao cadastro de usuários, bem como a definição de suas configurações específicas, ou, alternativamente, à vinculação a um grupo previamente criado, com o intuito de simplificar o gerenciamento das permissões.
Identity Providers: Os Identity Providers referem-se a provedores de identidade externos à organização, permitindo que os usuários realizem seu próprio cadastro por meio de métodos como login via Google, Facebook, LinkedIn, entre outros.
User Federation: A User Federation consiste em uma integração com bases de dados externas, possibilitando a vinculação dessas fontes ao Keycloak.
Por exemplo, caso a organização já possua uma base LDAP contendo os dados de todos os usuários, é possível conectar essa base ao Keycloak, o que permite a importação automática dos usuários, eliminando a necessidade de cadastrá-los de forma individual e manual.
Funcionamento do Keycloak
Ele funciona da seguinte maneira:
- Usuário entra na URL da aplicação
- A aplicação faz o redirecionamento para a página de login do Keycloak
- Usuário insere as credenciais
- Keycloak valida o usuário
- Caso válido, redireciona para a aplicação, caso inválido é retornado a página de login
Podemos visualizar de maneira mais simples por meio da imagem a seguir:
Figura: Funcionamento Keycloak
Como identificar uma aplicação rodando Keycloak
Existem várias formas de identificar isso, porém as mais simples são:
Em alguns momentos, realizando uma varredura dentro da aplicação, você encontra um painel de login que já demonstra o serviço em funcionamento, como o da imagem a seguir:
Figura: Keycloak
Também é possível ao analisar a URL, pois sempre que conter campos como /realms, /myrealm, /openin-connect, indica que há um serviço rodando, como na URL abaixo:
0.0.0.0:8080/auth/realms/myrealm/protocol/openid-connect/auth?client_id=
Dentro do payload JWT, caso houver campos como resource_access:
Figura: Payload JWT
E dentro do código-fonte da página, onde devemos buscar por campos que contenham /keycloak:
Figura: Código-fonte
Enumeração de Realms
Realms podem ser enumerados facilmente, utilizando o Burp Suite Intruder, vamos para a URL que contenha a requisição GET /auth/realms/nome_do_realms
Em que no campo nome_do_realms iremos rodar uma lista com possíveis nomes a fim de realizar a enumeração.
Figura: Aba Intruder
Figura: Realms enumerados
Enumeração de Client IDs
Quando instalado, o Keycloak vem por padrão com alguns Clients predefinidos, sendo eles:
- account
- account-console
- admin-cli
- broker
- realm-management
- security-admin-console
Para realizar uma enumeração de Client ID, iremos realizar o mesmo processo como foi feito com o Realms, porém dentro de outro endpoint, que seria:
/auth/realms/<nome_do_realm>/protocol/openid-connect/auth?client_id=enum&redirect_uri=<…>&state=<…>&response_mode=<…>&response_type=<…>&**scope=openid**&nonce=<…>&code_challenge=<…>&code_challenge_method=<…>
Em que o parâmetro enum irá ser o que iremos realizar a enumeração.
Exemplos de palavras que podem se encaixar na busca seriam: account, account-console, accounts, admin, admin-cli, broker, brokers, realm-management, realms-management, security-admin-console.
A enumeração não vai ocorrer conforme o código retornado, e sim pelo tamanho diferente retornado. Como podemos ver nas imagens a seguir, apenas 1 resultou no código 200, porém tivemos mais 4 itens com o length diferente do padrão, em que o padrão neste caso seria 2646:
Figura: Aba Intruder
Figura: Enumeração concluída
Podemos validar a enumeração com os clients registrados:
Figura: Clients
Bypass CSRF
A página de login contém um token CSRF (Cross-Site Request Forgery) que precisa ser extraído e usado neste ataque, para isso vamos realizar uma requisição de login e enviar para o Intruder, dentro dele vamos selecionar o session_code e a senha como pontos onde irá ocorrer o ataque, o tipo de ataque deve ser selecionado o Pitchfork attack:
Figura: Aba Intruder
Já na aba de Payloads, vamos marcar o primeiro payload com o tipo “Recursive Grep” e o segundo como “Simple List”. No segundo payload, vamos inserir a lista de senhas que iremos utilizar:
Figura: Segundo payload
O primeiro payload vamos configurar da seguinte maneira, vamos em Settings, Grep – Extract e vamos selecionar a parte onde apresenta o session_code:
Figura: Campo selecionado
Vamos selecionar também o campo “Extract the following items from responses:” e desmarcar o campo “Make unmodified baseline request”:
Figura: Campo Grep – Extract
Figura: Campo Attack Results
Vamos voltar para o campo Payloads e colocar em “Initial payload for first request” um session_code do campo de login:
Figura: Campo Payload Configuration
Agora iremos para a aba Resource Pool e vamos criar uma nova e marcar a opção “Maximum concurrent requests” para 1:
Figura: Campo Resource Pool
Por fim iremos rodar o ataque, quando conseguirmos um usuário válido irá ocorrer um redirect (302) e, dessa maneira, iremos obter sucesso no ataque.
Figura: Ataque completo
Auto cadastrar
Em alguns casos é possível se auto cadastrar, seja por meio do botão visível de se registrar ou pelo link direto para a página. Ambos os casos representam uma vulnerabilidade grave para a aplicação.
Aplicações com o botão para se registrar se tornam mais inseguras, visto que ocorre a exposição publicamente, como pode ser visualizado a seguir:
Figura: Registro
Figura: Aba registro
Em outros casos não irá aparecer desta forma exposta, porém através de acesso direto também se torna possível registrar dentro da aplicação. O link a seguir pode ser usado como forma de validação:
/auth/realms/<nome-do-realm>/login-actions/registration?client_id=<mesmo-da-página-de-login>&tab_id=<mesmo-do-formulário-de-login>
Vulnerabilidades conhecidas
Em versões mais antigas do Keycloak existem vulnerabilidades conhecidas (CVE), em sua maioria relacionadas a Cross-Site Scripting (XSS), Server-Side Request Forgery (SSRF), entre outras. Todas são relacionadas a versões específicas e com maneiras próprias de explorar as vulnerabilidades. Algumas CVEs relacionadas ao Keycloak são:
Recomendações
Desabilitar auto cadastrar
Não permitir qualquer usuário que acesse o serviço do Keycloak se cadastre é uma ótima maneira de manter seus ativos seguros, tendo em vista que isto abriria maneiras de um atacante infectar seu ambiente.
Para desabilitar, basta ir até Realms Settings, em seguida Login e deixar como “Off” a opção “User registration”:
Figura: Painel administrativo
Habilitar detecção de brute force
Manter esta opção habilitada impede com que atacantes realizem alguns ataques dentro do seu ambiente como: brute force, password spray, denail of service, entre outros.
Esta opção fornece configurações adicionais que devem ser adaptadas conforme a regra de seu negócio.
Para habilitar basta:
Ir até Realms Settings, em seguida Security Defenses e por fim Brute Force Detection, como pode ser visualizado na imagem a seguir:
Figura: Detecção de brute force
Implementação de headers de segurança
Security headers são definições incluídas no cabeçalho HTTP que fortalecem a segurança de aplicações web, ao estabelecer diretrizes de comportamento para os navegadores e restringir ações potencialmente maliciosas.
Através da simples implementação deles, alguns ataques podem ser mitigados como:
- Clickjacking
- Cross-Site Scripting (XSS)
- Man-in-the-middle (MITM)
Vale ressaltar de que nenhum security header isoladamente consegue eliminar completamente todos os vetores de ataque. Embora eles sirvam como barreiras importantes contra determinados tipos de ameaças, precisam ser combinados a boas práticas de desenvolvimento seguro para uma aplicação mais segura.
Para implementação basta ir até Realms Settings, Security Defenses e por fim Headers:
Figura: Security Headers
É importante enfatizar que, para a aplicação, não é interessante a adoção de todos os headers listados nesta aba, pois headers como “X-XSS-Protection” e “X-Frame-Options” estão depreciados atualmente, o que irá aumentar sua exposição a vulnerabilidades. Sendo assim, é de maior importância a implementação dos cabeçalhos “Content-Security-Policy, X-Content-Type-Options e HTTP Strict Transport Security (HSTS)”.
Política de senhas
A política de senhas é de extrema importância quando falamos sobre segurança. Definir uma boa política de senhas dificulta para o atacante o comprometimendo da conta de algum usuário. Para isso, a política deve ser definida conforme as boas práticas que podem ser encontradas em aqui.
Para definir a política de senhas, basta ir em Authentication, Password Policy, e para acrescentar basta clicar no botão “Add policy”.
Figura: Aba autenticação
Tokens
É importante manter as sessões bem configuradas para aumentar a robustez de sua segurança. A seguir algumas configurações que devem ser implementadas:
Figura: Aba Tokens
Figura: Aba Tokens 2
- Default Signature Token: Por padrão é o RS256, porém podemos selecionar opção com maiores níveis de segurança como o RS512
- Revoke Tokens: Serve para revogar os tokens assim que realizado o logout
- Refresh Token Max Reuse: Definido como 0 para não haver reuso do token
- SSO Session Indle: Tempo para invalidar uma sessão invativa
- SSO Session Max: Tempo máximo para uma sessão ser expirada
- Access Token Lifespan: É o período pelo qual um access token permanece válido antes de expirar
- Access Token Lifespan for Implicit Flow: Determina a duração dentro da qual um refresh token pode gerar novos access tokens.
Referências
Pentesting Keycloak Part 1: Identifying Misconfiguration Using Risk Management Tools
Pentesting Keycloak – Part 2: Identifying Misconfiguration Using Risk Management Tools
A Quick Guide to Using Keycloak for Identity and Access Management
Keycloak Session Configuration: Best Practices and Principles