Edge para nuvem privada v. 4.17.05
Com o mapeamento de papéis externos, é possível mapear seus próprios grupos ou papéis para papéis e grupos de controle de acesso baseado em papéis (RBAC, na sigla em inglês) criados no Apigee Edge.
Pré-requisitos
- Você precisa ser um administrador do sistema da nuvem privada da Apigee com credenciais de administrador do sistema global para realizar essa configuração.
- Você precisa saber o diretório raiz da instalação da nuvem privada do Apigee Edge. O diretório raiz padrão é /opt. Se você escolheu um diretório raiz diferente durante a instalação do Apigee Edge para nuvem privada, use-o em vez de /opt ao seguir estas instruções.
- Consiga os arquivos JAR necessários na Apigee.
Verifique se os usuários estão registrados no Edge e no serviço do diretório
Ao usar o mapeamento de papéis, todos os usuários que acessam o Edge precisam existir no serviço do diretório externo e no repositório de usuários do Edge. Isso significa que, ao adicionar um usuário ao serviço do diretório externo, você também precisa adicionar esse mesmo usuário ao repositório de usuários da Apigee.
Por exemplo, o usuário a01@company.com existe no grupo de diretório externo apiadmin. Em seguida, você quer mapear o usuário a01@company.com para o papel orgadmin no Edge. Portanto, o usuário a01@company.com precisa primeiro ser adicionado ao grupo orgadmin no Edge.
Consulte Como criar usuários globais para saber mais sobre como criar usuários do Edge e atribuí-los a papéis.
Configuração padrão
O mapeamento de papéis externos está desativado por padrão.
Como ativar o mapeamento de papéis externos
- Antes de concluir a configuração a seguir, crie uma classe Java que implemente a interface ExternalRoleMapperService. Para mais detalhes sobre essa implementação, consulte o exemplo abaixo.
- Faça login no servidor de gerenciamento do Apigee Edge e interrompa-o:
> /opt/apigee/apigee-service/bin/apigee-service edge-management-server stop - Verifique o status dos servidores. Verifique se o servidor de gerenciamento está parado/não está em execução:
> /opt/apigee/apigee-service/bin/apigee-all status - Abra /opt/apigee/customer/application/management-server.properties em um editor de texto.
- Edite o arquivo management-server.properties com as seguintes configurações:
conf_security_authentication.user.store=externalized.authentication
conf_security_externalized.authentication.role.mapper.enabled=true
conf_security_externalized.authentication.role.mapper.implementation.class=com.customer.authorization.impl.ExternalRoleMapperImpl
Importante: a classe de implementação e o nome do pacote referenciados acima, ExternalRoleMapperImpl, são apenas um exemplo. É uma classe que você precisa implementar e que pode nomear a classe e o pacote como quiser. Para detalhes sobre como implementar essa classe, consulte o exemplo abaixo. - Salve o arquivo management-server.properties.
- Inicie o servidor de gerenciamento:
> /opt/apigee/apigee-service/bin/apigee-service edge-management-server start - Verifique se o servidor está em execução:
> /opt/apigee/apigee-service/bin/apigee-all status
Como desativar a autorização externa
Para desativar a autorização externa:
- Abra /opt/apigee/customer/application/management-server.properties em um editor de texto.
- Mude o armazenamento de usuários de autenticação para ldap:
conf_security_authentication.user.store=ldap - Defina a seguinte propriedade como falsa:
conf_security_externalized.authentication.role.mapper.enabled=false - Reinicie o servidor de gerenciamento:
> /opt/apigee/apigee-service/bin/apigee-service edge-management-server restart
Sobre o exemplo de implementação ExternalRoleMapperImpl
No arquivo de configuração management-server.properties descrito acima, observe esta linha:
conf_security_externalized.authentication.role.mapper.implementation.class=com.customer.authorization.impl.ExternalRoleMapperImpl
Essa classe implementa a interface ExternalRoleMapperService e é obrigatória. Você precisa criar sua própria implementação dessa classe que reflita seus respectivos grupos. Quando terminar, coloque a classe compilada em um JAR e coloque esse JAR em /<install_dir>/apigee/edge-gateway/lib/infra/libraries.
Você pode nomear a classe e o pacote como quiser, desde que implemente ExternalRoleMapperService, seja acessível no caminho de classe e seja referenciado corretamente no arquivo de configuração management-server.properties.
Confira abaixo um exemplo de implementação bem comentado de uma classe ExternalRoleMapperImpl. Para compilar essa classe, é preciso referenciar o seguinte arquivo JAR incluído no Edge:
/<install_dir>/apigee/edge-gateway/lib/infra/libraries/authentication-1.0.0.jar
package com.apigee.authenticate; import com.apigee.authentication.ConfigBean; import com.apigee.authentication.ConnectionException; import com.apigee.authentication.ExternalRoleMapperService; import com.apigee.authentication.NameSpace; import com.apigee.authentication.NameSpacedRole; import com.apigee.authorization.namespace.OrganizationNamespace; import com.apigee.authorization.namespace.SystemNamespace; import java.util.Collection; import java.util.HashSet; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; /** * * Sample Implementation constructed with dummy roles with required namespaces. * * Created by GopiAlagar on 6/12/15. */ public class ExternalRoleMapperImpl implements ExternalRoleMapperService { InitialDirContext dirContext = null; @Override public void stop() throws Exception { } /** * * This method would be implemented by the customer, Below is the basic * example. * * If User has sysadmin role then it's expected to set SystemNameSpace * along with the * res\quested NameSpace. Otherwise role's requestedNameSpace to be set * for the NameSpacedRole. * * Collection<NameSpacedRole> results = new HashSet<NameSpacedRole>(); * * NameSpacedRole sysNameSpace = new NameSpacedRole("sysadmin", * SystemNamespace.get()); * * String orgName = * ((OrganizationNamespace)requestedNameSpace).getOrganization(); * * NameSpacedRole orgNameSpace = new NameSpacedRole ("orgadmin", * requestedNameSpace); * * results.add(sysNameSpace); * * results.add(orgNameSpace); */ public Collection<NameSpacedRole> getUserRoles(String userName, String password, NameSpace requestedNameSpace) { /* * There are 3 actions performed in the below implementation * 1. Authenticate Given User against ADS * 2. Fetch the internal groups from the ADS * 3. Map the internal group into the apigee-edge roles */ /*************************************************************/ /******************* Authenticate Given User *******************/ /*************************************************************/ // Customer Specific Implementation will override this method // implementation. // Obtain dnName for given username or email address. String dnName = ImplementDnameLookupLogic(); if (dnName == null) { System.out.println("Error "); } DirContext dirContext = null; Collection<NameSpacedRole> results = new HashSet<NameSpacedRole>(); try { // Verify the credentials for a given username or dnName // and password in order to create a directory context. dirContext = ImplementDirectoryContextCreationLogic(); /****************************************************/ /********** Fetch internal groups *******************/ /****************************************************/ String groupDN = "OU=Groups,DC=corp,DC=wacapps,DC=net"; SearchControls controls = new SearchControls(); controls.setSearchScope(SearchControls.ONELEVEL_SCOPE); NamingEnumeration<SearchResult> groups = dirContext.search(groupDN,"(objectClass=*)", new Object[] { "", "" }, controls); if (groups.hasMoreElements()) { while (groups.hasMoreElements()) { SearchResult searchResult = groups.nextElement(); Attributes attributes = searchResult.getAttributes(); String groupName = attributes.get("name").get().toString(); /**************************************/ /** Map the internal group into the ***/ /** apigee-edge roles ***/ /**************************************/ if (groupName.equals("BusDev")) { results.add(new NameSpacedRole("businessAdmin",SystemNamespace.get())); } else if (groupName.equals("DevSupport")) { results.add(new NameSpacedRole("devOpsAdmin",SystemNamespace.get())); } else if (groupName.equals("Engineering")) { if (requestedNameSpace instanceof OrganizationNamespace) { String orgName = ((OrganizationNamespace) requestedNameSpace).getOrganization(); results.add(new NameSpacedRole("orgadmin", new OrganizationNamespace(orgName))); } } else if (groupName.equals("Operations") || groupName.equals("IT")) { results.add(new NameSpacedRole("sysadmin",SystemNamespace.get())); } else if (groupName.equals("Marketing")) { results.add(new NameSpacedRole("marketAdmin",SystemNamespace.get())); } else { results.add(new NameSpacedRole("readOnly",SystemNamespace.get())); } } } else { /** * In case of no group found or exception found we throw empty * roles. */ System.out.println(" !!!!! NO GROUPS FOUND !!!!!"); } } catch (Exception ex) { ex.printStackTrace(); System.out.println("Error in authenticating User: {}" + new Object[] { userName }); } finally { // Customer implementation to close // ActiveDirectory/LDAP context. } return results; } @Override public void start(ConfigBean arg0) throws ConnectionException { try { // Create InitialDirContext. // Create a directory context based on the // system admin user credentials. dirContext = ImplementDirContextCreationLogicForSysAdmin(); } catch (NamingException e) { // TODO Auto-generated catch block throw new ConnectionException(e); } } }