Demonstração de como integrar o 3scale com o Red Hat Single Sign-On (RH-SSO) e posteriormente expor APIS através do 3scale adicionando um camada de segurança.
O Red Hat Single Sign-On (RH-SSO) é uma solução de Sign-On integrada (SSO) que, quando usada em conjunto com 3scale, permite que você autentique seus desenvolvedores usando qualquer uma das opções de identity brokering e user federation.
Este workshop tem como pré requisito a instalação e configuração de uma instancia do Red Hat Single Sign-ON e do 3scale. As instruções podem ser encontradas no portal Red Hat (https://access.redhat.com/documentation/en-us/).
- Configurando o Red Hat Single Sign-ON (RH-SSO)
- Criando um realm
- Adicionando um novo Client
- Integrando 3scale Admin Console com RH-SSO
- Introdução.
- Criando um Realm no RH-SSO.
- Expondo sua API backend no 3scale.
- Integrando sua API com o RH-SSO.
- Configurando o Zync pod para certificados auto assinados.
- Criando um Application Plan.
- Criando um novo usuário para acesso a API.
- Vinculando usuário a uma Application.
- Testando Integração.
Neste primeiro passo iremos configurar o Red Hat Single Sign-ON (RH-SSO) seguindo a documentação do produto.
Após realizar o login na console de administração do RH-SSO, posicione o mouse abaixo de Master (lado esquerdo acima) e clique em Add realm. Informe o nome do realm 3scale-admin
Do lado esquerdo acima, estará o nome do realm criado conforme imagem abaixo:
Adicione um novo client no realm 3scale-admin que criamos anteriormente.
Vá até a opção Clients e clique em Create.
Informe o Client ID, no nosso caso será o 3scale e clique em Save.
Configure os parâmetros deste Client conforme os campos abaixo:
- Client ID: informe o nome desejado, no nosso caso será 3scale-rh-sso.
- Enabled: mude para ON.
- Consent Required: mude para OFF.
- Client Protocol: selecione openid-connect.
- Access Type: selecione confidential.
- Standard Flow Enabled: mude para ON.
- Root URL: Informe a URL da console de administração do 3scale https://yourdomain.3scale.net.
- Valid Redirect URLs: Informe o endereço da console de administração do 3scale e adicione: /* por exemplo: https://yourdomain.3scale.net/*.
TODOS os demais parâmetros devem ser mudados para OFF.
Vá até a aba Credentials e copie o client secret gerado conforme a imagem a seguir:
Posteriormente vá até a aba Mappers e clique em Add Builtin
Selecione email verified e clique em Add selected
Certifique-se de ter configurado corretamente conforme imagem a seguir:
Neste primeiro passo iremos integrar a console de administração do 3 scale com o nosso client criado no Red Hat Single Sign-On (RH-SSO).
Após logar na console de administração do 3scale, vá até **Account Settings (*) - Users - SSO Integrations **
Clique em New SSO Integration e preencha os campos conforme abaixo:
- Client: Nome do client no Red Hat Single Sign-On
- Client Secret: Client secret
- Realm: Nome do Realm e URL de acesso para o Red Hat Single Sign-ON
Posteriormente clique em Create Authentication Provider
Agora iremos testar nossa integração. Clique em Test authentication flow now
Faça o login com um usuário do RH-SSO.
** Caso você não tenha criado um usuário anteriormente, siga os passos descritos em 4.2. Creating New Users
** Caso receba a mensagem de erro: Your account isn't active or hasn't been approved yet., ative a flag Email Verified para ON nas configurações do seu usuário no RH-SSO.
Após validar o fluxo de autenticação, clique em Publish e verifique se o State mudou para Visible
Pronto, sua console de administração do 3scale está instegrada ao Red Hat Single Sign-On (RH-SSO). Basta clicar em Authenticate through Red Hat Single Sign-On que seu login será feito com base nos usuários do RH-SSO.
Após logar com o usuário do RH-SSO, logue novamente na console de administração do 3scale e vá em Account Settings (*) - Users - Listing, clique em Edit e na seção Administrative, aplique a Role - Admin (full access) para seu usuário e depois clique em Update User, assim poderemos seguir para os próximos passos com todas as permissões aplicadas a este usuário.
Nos passos a seguir, iremos confgurar um novo realm no Red Hat Single Sign-On e posteriormente um novo client que serão utilizados pelas APIS que serão expostas no 3 scale. Seguiremos os passos descritos na documentação.
Crie um novo realm chamado 3scale-apis
Crie um novo client chamado 3scale-apis
Configure os parâmetros do novo client conforme abaixo:
- Access Type: confidential.
- Standard Flow Enabled: OFF.
- Direct Access Grants Enabled: OFF.
- Service Accounts Enabled: ON
Após salvar as configurações do client, vá até a aba Service Account Roles
Em Client Roles digite realm-management
Selecione manage-clients em Available Roles e clique em Add Selected
Anote o client-id e o cient-secret que pode ser consultado na aba Credentials pois usaremos posteriormente
Neste exemplo iremos expor uma API backend que foi realizado o deploy no Openshift. O código desta api e as informações de deploy no Openshift podem ser encotradas em: https://github.com/raraujo-dev/spring-boot-rest-api
Após realizar o login no 3scale, clique na aba BACKENDS e clique em NEW BACKEND
Preencha os campos de sua API que será exposta no 3scale, informe a URL de acesso em Private Base URL
No menu lateral selecione Methods and Metrics e clique em New method
Nossa API REST que será exposta possui retorna no path /currentDateTime a data e o horário do ambiente que a API está rodando.
Neste caso iremos adicionar o método que irá retornar esta informação, assim poderemos coletar métricas posteriormente deste método específico.
Preencha as informações do seu método e clique em Create Method
Agora clique em Add a mapping rule
Neste exemplo, irei preencher as informações do meu path /currentDateTime da minha API que está sendo exposta pelo 3scale.
Após preencher as informações da sua API clique em Create Mapping Rule
No menu central, selecione Dashboard e posteriormente a aba PRODUCTS
Clique em NEW PRODUCT, preencha as informações da sua API que será exposta como um produto cadastrado no 3scale e posteriormente clique em Create Product
Após criar o produto, você será direcionado para a página de Overview
No menu lateral clique em Integration - Backends e clique em Add Backend
Selecione o backend cadastrado anteriormente e preencha o Path da sua API antes de clicar em Add to Product
No menu lateral selecione Settings
Em AUTHENTICATION mude para OpenID Connect Use OpenID Connect for any OAuth 2.0 flow.
No campo OpenID Connect Issuer iremos preencher o location do RH-SSO seguindo o modelo https://<CLIENT_ID>:<CLIENT_SECRET>@:/auth/realms/<REALM_NAME>".
No nosso caso iremos preencher os campos conforme as informações do client criado no RH-SSO.
- CLIENT_ID: 3scale-apis
- CLIENT_SECRET: 387200ee-6828-4d63-aa1a-2d07ad0034a3
- HOST: sso-xxx-rh-sso.apps.saopaulo-996b.open.redhat.com
- PORT: 443
- REALM NAME: 3scale-apis
A url final ficará da seguinte forma https://3scale-apis:387200ee-6828-4d63-aa1a-2d07ad0034a3@sso-xxx-rh-sso.apps.saopaulo-996b.open.redhat.com/auth/realms/3scale-apis
Em OIDC AUTHORIZATION FLOW selecione:
- Authorization Code Flow
- Service Accounts Flow
- Direct Access Grant Flow
Em CREDENTIALS LOCATION selecione As HTTP Headers
Role a página até o final e clique em UPDATE PRODUCT
Posteriormente, vá até a aba Configuration e clique em Promoto to staging API Cast para aplicar as novas configurações.
Quando integramos o 3scale com o Rh-SSO é estabelecido uma conexão SSL entre Zync (3scale) e Red Hat Single Sign-On que será responsável por sincronizar os dados entre o 3scale e o RH-SSO. Quando utilizado um certificado auto assinado (self signed) é necessário realizar uma configuração adicional. Este procedimento pode ser encontrado na documentação em [Configure Zync to use custom CA certificates](https://access.redhat.com/documentation/en-us/red_hat_3scale_api_management/2.7/html/administering_the_api_gateway/openid-connect#configure_zync_to_use_custom_ca_certificates)
Após realizar o login no cluster openshift, execute o comando abaixo no namespace onde está instalado o 3scale.
oc get pods
Observe que o pod responsável por está sincronização, no examplo acima, é o zync-que-1-gcg5k
Agora iremos executar o comando abaixo, substituindo o por zync-que-1-gcg5k, este comando irá buscar o certificado do pod e posteriormente irá gravar no arquivo zync.pem.
oc exec <zync-pod-id> cat /etc/pki/tls/cert.pem > zync.pem
Anexe o novo arquivo ao pod Zync como ConfigMap:
oc create configmap zync-ca-bundle --from-file=./zync.pem
oc set volume dc/zync --add --name=zync-ca-bundle --mount-path /etc/pki/tls/zync/zync.pem --sub-path zync.pem --source='{"configMap":{"name":"zync-ca-bundle","items":[{"key":"zync.pem","path":"zync.pem"}]}}'
oc patch dc/zync --type=json -p '[{"op": "add", "path": "/spec/template/spec/containers/0/volumeMounts/0/subPath", "value":"zync.pem"}]'
Após o deployment, verifique se o certificado está anexado e se o conteúdo está correto:
oc exec <zync-pod-id> cat /etc/pki/tls/zync/zync.pem
Configure a variável de ambiente SSL_CERT_FILE no Zync para apontar para o novo pacote de certificado CA:
oc set env dc/zync SSL_CERT_FILE=/etc/pki/tls/zync/zync.pem
Faça o rollout do último deploy para aplicar as novas configurações
oc rollout latest dc/zync
Execute o comando abaixo e veja que um novo rollout do zync pod foi realizado
oc get pods
Execute o comando #oc exec cat /etc/pki/tls/zync/zync.pem - para se certificar que o certificado foi anexado ao pod com sucesso.
oc exec zync-4-9mzbr cat /etc/pki/tls/zync/zync.pem
Application Plans estabelecem as regras (limites, preços, recursos) para usar sua API; cada aplicativo de desenvolvedor acessando sua API estará acessando-o dentro das restrições de um Application Plan.
No menu central selecione o produto que acabamos de criar Get Current Date and Time, posteriormente no menu lateral selecione Applications - Applications Plans e clique em Create Application Plan
Preencha os campos do seu Application Plan e clique em Create Application Plan
Agora no menu central selecione Audience e logo em seguida no menu lateral vá até Accounts - Listinge posteriormente clique em Create
Preencha os dados do seu usuário e clique em Create
Agora veja que seu usuário foi criado com sucesso.
Logo após criar seu usuário que irá acessar sua API sendo exposta pelo 3scale, clique em Applications e posteriormente Create Application
Após preencher os dados clique em Create Application
Veja que neste momento as API Credentials para acesso a sua API exposta no 3scale foram criadas
Vá até a console de administração do RH-SSO e veja se este client foi sincronizado com o RH-SSO conforme a imagem abaixo:
Em caso de problemas, consulte os logs do pod zync-que-xxx no projeto do 3scale e/ou verifique se as configurações foram aplicadas corretamente.
Utilizando o username e password do usuário que criamos no 3scale, iremos realizar um POST no endereço do token_endpoint do RH-SSO. Devemos enviar como parâmetro:
- username: usuário criado no RH-SSO
- password: password do usuário criado no RH-SSO
- grant_type: password
- client_secret: o client secret da sua aplicaçao que pode ser consultado no 3scale
- client_id: client id da aplicação que pode ser consultado na console do 3scale
O token_endpoint do seu realm pode ser consultado na console do RH-SSO em Endpoints conforme a imagem a seguir:
Irei utilizar o postman para realizar este teste:
Será retornado o access token:
De posse do access token, agora iremos realizar a chamada para nossa aplicação.
Vá até a console do 3scale e copie a URL de acesso da sua API exposta no 3scale, basta selecionar a API no menu central e posteriormente no menu lateral selecionar Integration - Configuration
No postman, faça uma request informando o endpoint e a Mapping Rule da API exposta no 3scale.
No header passe como parâmetro a variável Authorization com o valor Bearer token_coletado conforme na imagem a seguir:
Pronto, o agora temos o retorno da API exposta no 3scale