Mapeamento de papéis externos

Edge para nuvem privada v. 4.17.05

Com o mapeamento de papéis externos, você associa os grupos ou papéis a papéis e grupos de controle de acesso baseado em papéis (RBAC) criados no Apigee Edge. 

Pré-requisitos

  • Você precisa ser um administrador do sistema de nuvem privada da Apigee com credenciais de administrador de sistema global para realizar esta 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ê tiver escolhido um diretório raiz diferente durante a instalação da nuvem privada do Apigee Edge, use-o em vez de /opt ao seguir estas instruções.
  • Consiga os arquivos JAR necessários da Apigee.

Verifique se os usuários estão registrados no Edge e no seu serviço de diretório

Ao usar o mapeamento de papéis, todos os usuários que acessam o Edge precisam existir no serviço de diretório externo e no repositório de usuários do Edge. Isso significa que, ao adicionar um usuário ao seu serviço de 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órios externos 'apiadmin'. Depois, mapeie o usuário a01@company.com para a função 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 funções.

Configuração padrão

O mapeamento de papéis externos está desativado por padrão.

Como ativar o mapeamento de papéis externos

  1. Antes de concluir a configuração a seguir, é necessário criar uma classe Java que implemente a interface ExternalRoleMapperService. Veja mais detalhes sobre essa implementação no exemplo abaixo.
  2. Faça login no Apigee Edge Management Server e pare no Servidor de gerenciamento:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server stop
  3. Verificar 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
  4. Abra /opt/apigee/customer/application/management-server.properties em um editor de texto.
  5. Edite o arquivo management-server.properties com estas 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.autorização.impl.ExternalRoleMapperImpl que o pacote que você quiser.

    Importante: o nome do pacote que você quer fazer referência, o nome da implementação que você quer implementar.
    Para saber mais sobre como implementar essa classe, consulte o exemplo de implementação abaixo. 
  6. Salve o arquivo management-server.properties.
  7. Inicie o Servidor de gerenciamento:
    > /opt/apigee/apigee-service/bin/apigee-serviceedge-management-server start
  8. 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:

  1. Abra /opt/apigee/customer/application/management-server.properties em um editor de texto.
  2. Altere o repositório do usuário de autenticação para ldap:
    conf_security_authentication.user.store=ldap
  3. Defina a seguinte propriedade como falsa:
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. Reinicie o servidor de gerenciamento:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server restart

Sobre a implementação de exemplo do 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

Esta 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 ela implemente ExternalRoleMapperService, possa ser acessada no caminho de classe e esteja referenciada corretamente no arquivo de configuração management-server.properties

Veja 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);

        }

    }

}