Adicionando Segurança em um projeto com Quarkus.io

Uma postagem bem rápida hoje. Vamos adicionar segurança com Elytron em um CRUD REST com quarkus.io. Todo código está no github

Se você quiser saber mais sobre quarkus.io pode acessar os seguintes links:

O primeiro passo é adicionar a dependência do elytron no seu pom.xml:

     io.quarkus
     quarkus-elytron-security
     0.11.0

Próximo passo é editar o arquivo de configuração application.properties:

quarkus.security.file.enabled=true (1)
quarkus.security.file.users=example-users.properties (2)
quarkus.security.file.roles=example-roles.properties (3)
quarkus.security.file.auth-mechanism=BASIC (4)
  1. Estamos habilitando a segurança no projeto;
  2. Passamos o nome do arquivo onde estarão o nossos usuários e senhas;
  3. Passamos o nome do arquivo onde estarão as roles;
  4. Por fim passamos o tipo de segurança, no caso vamos utilizar BASIC.

Vamos agora criar os arquivos com usuários, senhas e roles no mesmo local onde está o arquivo application.properties:

  • example-users.properties
william=pass123
pedro=q1w2e3r4
  • example-roles.properties
pedro=admin,user
william=NoRolesUser

Agora vamos atualizar nossos endpoints para poder seguir as regras de segurança:

@Path("/encontro")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class EncontroResource {

    @Inject
    EncontroService encontroService;

    @GET
    @PermitAll (1)
    public List lista() {
        return encontroService.lista();
    }
    
    @PUT
    @RolesAllowed("admin") (2)
    public Response cria(Encontro encontro) {
        long id = encontroService.cria(encontro);
        return Response.created(URI.create("http://localhost:8080/encontro/" + id))
                       .build();
    }
    
    @GET
    @Path("{id}")
    @PermitAll
    public Encontro porId(@PathParam("id") long id) {
        return encontroService.porId(id);
    }
    
    @DELETE
    @Path("{id}")
    @RolesAllowed("admin")
    public void apaga(@PathParam("id") long id) {
        Encontro encontro = encontroService.porId(id);
        if (encontro == null) {
            throw new WebApplicationException(404);
        }
        encontroService.apagar(id);
    }
}
  1. Todos usuários podem acessar o endpoint. Para listar e para buscar por id;
  2. Apenas usuários com role admin podem acessar o endpoint. Para remover e criar um evento.

Agora apenas testar. Para executar o projeto execute:

mvn compile quarkus:dev

Wildfly + LDAP: Fazendo Segurança do Management Console

Para realizar esta configuração, você precisará:

  • Wildfly versão mais atual;
  • Vamos realizar o exemplo utilizando o modo standalone;
  • Servidor LDAP.

Para o Servidor LDAP e ter uma visão mais completa das configurações LDAP, recomendo utilizar o ApacheDS Studio, que é baseado na IDE Eclipse e trás muitas facilidades para utilização do LDAP. Com o Wildfly instalado e rodando e também o ApacheDS, vamos configurar o LDAP.

Configurando LDAP

 

  1. Inicie o ApacheDS:
$APACHE_DS_HOME/Apache/./ApacheDirectoryStudio

2. Crie uma nova connection usando os valores padrão;

3. Crie uma nova LDAP partition com o seguinte sufix: dc=keycloak,dc=org

4. Importe o seguinte LDIF file dentro do partition criado anteriormente:

dn: ou=People,dc=keycloak,dc=org
objectclass: top
objectclass: organizationalUnit
ou: People

dn: ou=RealmRoles,dc=keycloak,dc=org
objectclass: top
objectclass: organizationalUnit
ou: RealmRoles

dn: ou=FinanceRoles,dc=keycloak,dc=org
objectclass: top
objectclass: organizationalUnit
ou: FinanceRoles

dn: uid=jbrown,ou=People,dc=keycloak,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
uid: jbrown
cn: James
sn: Brown
mail: jbrown@keycloak.org
postalCode: 88441
userPassword: password

dn: uid=bwilson,ou=People,dc=keycloak,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
uid: bwilson
cn: Bruce
sn: Wilson
mail: bwilson@keycloak.org
postalCode: 88441
postalCode: 77332
postalCode: 66221
street: Elm 5
userPassword: password

dn: cn=ldap-user,ou=RealmRoles,dc=keycloak,dc=org
objectclass: top
objectclass: groupOfNames
cn: ldap-user
member: uid=jbrown,ou=People,dc=keycloak,dc=org
member: uid=bwilson,ou=People,dc=keycloak,dc=org

dn: cn=ldap-admin,ou=RealmRoles,dc=keycloak,dc=org
objectclass: top
objectclass: groupOfNames
cn: ldap-admin
member: uid=jbrown,ou=People,dc=keycloak,dc=org

dn: cn=accountant,ou=FinanceRoles,dc=keycloak,dc=org
objectclass: top
objectclass: groupOfNames
cn: accountant
member: uid=bwilson,ou=People,dc=keycloak,dc=org

fonte: https://github.com/keycloak/keycloak/blob/master/examples/ldap/ldap-example-users.ldif

Configurando Wildfly

  1. Inicie o jboss-cli.sh:
$JBOSS_HOME/bin/jboss-cli.sh --connect

2. Execute os seguintes comandos:

/core-service=management/ldap-connection=ldapconnection/:add(search-credential=secret,url=ldap://localhost:10389,search-dn="uid=admin,ou=system")

/host=master/core-service=management/security-realm=LDAPRealm:add()

/host=master/core-service=management/security-realm=LDAPRealm/authentication=ldap:add(base-dn="ou=People,dc=keycloak,dc=org", recursive=true, username-attribute="uid", connection="ldapconnection")

/host=master/core-service=management/management-interface=http-interface/:write-attribute(name=security-realm,value=LDAPRealm)

3. Agora só acessar o Management Console (ex. http://localhost:9990) e utilize um dos dois usuários que existem no arquivo LDIF

Baseado no artigo: http://www.mastertheboss.com/jboss-server/jboss-security/ldap-and-wildfly-part-1-securing-the-management-console

Rest Seguro com Wildfly Swarm e Keycloak

Neste post vou apresentar e mostrar como trabalhar com dois projetos mantidos pela Red Hat, o Wildfly Swarm, utilizado para criar aplicações de uma forma ágil, com um servidor embarcado, e o Keycloak uma ferramenta para fazer Single Sign On, Social Login, LDAP etc.

Para os exemplos vamos precisar de Java 8, Eclipse, Maven, MySQL e Keycloak. Todos os exemplos podem ser vistos no meu github também.

Read More