Thursday, April 4, 2019

Keycloak Server: delegando a segurança de sua aplicação (parte 1)

Adicionar autenticação para qualquer aplicação é uma tarefa trabalhosa. Se sua aplicação não usa alguma forma de autenticação e controle de autorização e acessos de usuário, esteja certo de que uma hora isso será necessário, você terá que implementar autentiação, autorização e todo um esquema de gestão de usuários. E você fatalmente acabará fazendo isso do jeito errado.


Já que autenticação e diversas questões relacionadas à segurança de sua aplicação demandam tempo considerável de análise e implementação, e mesmo depois de prontas, após um longo trabalho, sua implementação apresentará alguma falha, por que não delegar tudo isso para quem sabe fazer? 

Na parte 2 deste post criamos uma aplicação web simples sem escrever uma única linha relacionada a login/logout de usuário, mas que vai rodar tendo por trás um sistema robusto e confiável de autenticação. Nesta parte 1 apresentamos e configuramos o Keycloak Server.

Keycloak Server

Keycloak Server é uma solução open source, baseado no Wildfly server, para identificação e autenticação de usuários para as aplicações e serviços modernos, ou, em outras palavras, é uma aplicação JAX-RS que expõe diversos serviços customizáveis relacionados à autenticação e autorização de usuários que qualquer aplicação pode fazer uso. Embora seja uma distribuição do Wildfly, o Keycloak não pode ser usado como container de aplicações.

Conceitos

Antes de começar a testar o Keycloak, é importante entender alguns termos importantes presentes no seu contexto:

  • Realm: é um território que você cria. No Keycloak as aplicações são agrupadas por realms, os usuários também, entre outras entidades.
  • Client: são as aplicações e serviços segurados pelo Keycloak (não confundir com o usuário).
  • Roles: tipo ou categoria de usuário, geralmente vinculada a um tipo de acesso ou permissão.
  • Users: Entidades que podem logar no sistema.
  • User role mapping: a relação entre users e roles. Um user pode ter várias roles.
  • Groups: Conjunto de usuários. Groups também podem ter atributos e roles.
  • Acess token: Um token JSON que concede acesso a um serviço especificado

Configurando o Keycloak para o uso

Faça download do arquivo keycloak-5.0.0.[zip|tar.gz], que contem a distribuição do server. Descompacte o arquivo zipado. Se você já utilizou o Widlfly server, vai reparar que a estrutura de diretórios do Keycloak é praticamente idêntica a dele:



Para subir o Keycloak, vá para a pasta bin e execute o arquivo standalone.bat (se o seu ambiente for windows) ou standalone.sh (para Linux). O argumento -Djboss.socket.binding.port-offset=100 é opcional e foi passado para impedir que o Keycloak ocupe a porta 8080 e assim não cause conflito com o Wildfly server (que será executado logo mais).

$ ./standalone.sh -Djboss.socket.binding.port-offset=100

Após executar o comando acima, você pode acessar o console de administração do Keycloak no endereço http://localhost:8180/auth/:


Na tela acima, cadastre um novo usuário administrador (com login e senha). Esse processo também cria o realm master automaticamente. Após clicar em create,  clique no link Administration Console:

Logue com o usuário e senha de administrador que você acabou de criar. A tela inicial é a que segue:



No canto superior esquerdo, temos o realm default Master. Vamos criar um novo realm chamado TeamSecurity. Posicione o cursor em Master e clique no botão add realm:



Em name, coloque o nome do novo realm. Após, clique em create. Repare no canto superior esquerdo que o nome do realm mudou de Master para TeamSecurity (podemos alternar entre os diversos realms criados).

Agora vamos adicionar um cliente chamado MyWebApp dentro do realm TeamSecurity. No menu lateral esquerdo, clique em client e depois (à direita) create. Na combo-boox client protocol deixe a opção default openid-connect. Em Root URL coloque a URL da aplicação, que neste caso pode ser http://localhost:8080/myapp.


Após salvar, a seguinte tela aparece:



Preencha os campos Root URL, Valid Redirect URL e Web Origins conforme a imagem abaixo. myapp será aplicação que será protegida pelo Keycloak. Na combobox Access type, escolha confidential. Após selecionar o access type, as opções Service Accounts Enabled e Authorization Enabled vão aparecer, ative-as colocando em ON, conforme a imagem abaixo. E clique em save.



Keycloak Adapters

Keycloak suporta autenticação por meio de dois protocolos: OpenID Connect (OIDC) e SAML 2.0. Você deve escolher qual dos dois será usado na sua aplicação. Neste caso escolhemos o OIDC.

Dependendo de qual framework/container sua aplicação Java esteja utilizando (Wildfly, Tomcat, Spring Boot, Jetty, etc), o Keycloak provê alguns adaters para integrar de forma mais eficiente com a plataforma, há ainda adapters para outras linguagens.

No caso dos Java Adapters, todos eles compartilham uma série de configurações em comum, as quais podem ser definidas em um arquivo JSON colocado dentro da pasta WEB-INF ou, no caso do Wildfly, definí-las em um arquivo de configurações do servidor, como o standalone.xml por exemplo (dessa forma você não precisa alterar o arquivo .war).

Neste post, vamos gerar o arquivo de configuração JSON.

Ainda na área do client MyWebApp, na aba Instalation, na combobox format option, selecione Keycloak OIDC JSON. Esse procedimento dispões para download as configurações básicas no formato JSON, incluindo a secret-key do realm para a criptografia das informações trocadas entre o cliente e o servidor. A public-key para está acessível na url http://localhost:<keycloak-port>/auth/realms/{realm} (neste exemplo a url seria http://localhost:8180/auth/realms/TeamSecurity)

Salve esse arquivo como keycloak.json. Ele será usado na parte 2 deste post.



Agora vamos criar uma role de usuário. No menu lateral esquerdo clique em Roles. E depois em add role. Dê a esta role o nome de Developer, depois salve-a.

Agora vamos criar um usuário. No menu lateral, clique em users. E depois Add User. Dê um nome ao user. Você também pode preencher os campos First Name, Last Name e email. Marque a opção  Email Verified (ON), para habilitá-lo imediatamente. Salve.

Esse usuário que você criou poderá logar no console, mas não como admin, na url http://localhost:8180/auth/realms/{realmName}/account. Uma vez logado em sua própria conta, o usuário poderá atualizar seu perfil, entre outras atividades.



Depois de salvar esse user, na aba role mappings, adicione a role Developer para ele:


Na aba credentials, crie e guarde uma senha para esse usuário. Em seguida, clique em Reset Password. Teste se seu usuário foi criado com sucesso logando na área de usuários em http://localhost:8180/auth/realms/TeamSecurity/account/. Use o login e senha que você acabou de criar. No primeiro acesso, o Keycloak solicita ao usuário que mude sua senha.

Essa configurações representam o básico para proteger a aplicação MyWebApp no Keycloak. Na parte dois deste post criamos a aplicação e delegamos o seu processo de autenticação e autorização de usuários para o Keycloak.

"E não sede conformados com este mundo, mas sede transformados pela renovação do vosso entendimento, para que experimenteis qual seja a boa, agradável, e perfeita vontade de Deus"

Romanos 12:2


       

1 comment:

  1. Otimo post! Duas perguntas: 1) Para personalizar a tela de login? 2) Integrarncom o AD ou LDAP?

    ReplyDelete