Mapeamento de papéis externos

Edge for Private Cloud v. 4.17.05

O mapeamento de papéis externos permite associar seus próprios grupos ou papéis a papéis de controle de acesso baseado em papéis (RBAC) e grupos 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" conforme as 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, quando você adiciona um usuário ao seu serviço de diretório externo, ele também precisa ser adicionado ao repositório de usuários da Apigee.

Por exemplo, o usuário a01@company.com existe no grupo do diretório externo 'apiadmin'. Depois, mapeie o usuário a01@company.com para o papel orgadmin no Edge. Portanto, o usuário a01@company.com precisa ser adicionado primeiro ao grupo orgadmin no Edge.

Consulte Como criar usuários globais para mais informações sobre como criar usuários do Edge e atribuir papéis a eles.

Configuração padrão

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

Como ativar o mapeamento de papéis externos

  1. 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 de implementação abaixo.
  2. Faça login no Apigee Edge Management Server e interrompa o servidor de gerenciamento:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server stop
  3. 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
  4. Abra /opt/apigee/customer/application/management-server.properties em um editor de texto.
  5. 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 mencionados acima, ExternalRoleMapperImpl, são apenas um exemplo. É uma classe que você precisa implementar e que pode nomear e empacotar o que quiser. Para detalhes 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-service Edge-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. Mude a loja de autenticação do usuário para ldap:
    conf_security_authentication.user.store=ldap
  3. Defina a propriedade a seguir 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 reinicialização

Sobre a implementação de amostra 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-o em /<install_dir>/apigee/edge-gateway/lib/infra/libraries.

Você pode nomear a classe e o pacote o que quiser, desde que implemente ExternalRoleMapperService, possa ser acessado no caminho de classe e faça referência correta no arquivo de configuração management-server.properties.

Abaixo está um exemplo de implementação bem comentado de uma classe ExternalRoleMapperImpl. Para compilar essa classe, faça referência ao 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);

        }

    }

}