Asignación de roles externa

Edge para nube privada v. 4.17.05

La asignación de roles externa te permite asignar tus propios grupos o roles a roles de control de acceso basado en roles (RBAC) y grupos creados en Apigee Edge. 

Requisitos previos

  • Para realizar esta configuración, debes ser administrador del sistema de Apigee Private Cloud con credenciales de administrador del sistema globales. 
  • Debes conocer el directorio raíz de la instalación de Apigee Edge Private Cloud. El directorio raíz predeterminado es /opt. Si elegiste un directorio raíz diferente durante la instalación de Apigee Edge Private Cloud, úsalo en lugar de /opt mientras sigues estas instrucciones.
  • Obtén los archivos JAR necesarios de Apigee.

Asegúrate de que los usuarios estén registrados en Edge y en tu servicio de directorio

Cuando uses la asignación de roles, todos los usuarios que accedan a Edge deben existir tanto en tu servicio de directorio externo como en el repositorio de usuarios de Edge. Esto significa que cuando agregas un usuario a tu servicio de directorio externo, también debes agregarlo al repositorio de usuarios de Apigee.

Por ejemplo, el usuario a01@company.com existe en tu grupo de directorio externo 'apiadmin'. Luego, quieres asignar el usuario a01@company.com al rol orgadmin en Edge. Por lo tanto, el usuario a01@empresa.com primero debe agregarse al grupo administrador de la organización en Edge. 

Consulta Crea usuarios globales para obtener más información sobre cómo crear usuarios de Edge y asignarlos a funciones.

Configuración predeterminada

La asignación de funciones externas está inhabilitada de forma predeterminada.

Habilita la asignación de funciones externas

  1. Para poder completar la siguiente configuración, debes crear una clase Java que implemente la interfaz ExternalRoleMapperService. Para obtener detalles sobre esta implementación, consulta el ejemplo de implementación a continuación.
  2. Accede al servidor de administración de Apigee Edge y, luego, detén el servidor de administración:
    > /opt/apigee/apigee-service/bin/apigee-service perimetral-management-server stop
  3. Verifica el estado de los servidores. Asegúrate de que el servidor de administración esté detenido o no en ejecución:
    > /opt/apigee/apigee-service/bin/apigee-all status
  4. Abre /opt/apigee/customer/application/management-server.properties en un editor de texto.
  5. Edita el archivo management-server.properties con la siguiente configuración:
    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.ExternalRoleMapper --Role


    Para obtener detalles sobre cómo implementar esta clase, consulta el ejemplo de implementación que se incluye a continuación. 
  6. Guarda el archivo management-server.properties.
  7. Inicia el servidor de administración:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server start
  8. Verifica que el servidor se esté ejecutando:
    > /opt/apigee/apigee-service/bin/apigee-all status

Inhabilita la autorización externa

Para inhabilitar la autorización externa, sigue estos pasos:

  1. Abre /opt/apigee/customer/application/management-server.properties en un editor de texto.
  2. Cambia el almacén de usuarios de autenticación a ldap:
    conf_security_authentication.user.store=ldap
  3. Establece la siguiente propiedad en false:
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. Reinicia el servidor de administración:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server restart

Acerca de la implementación de muestra de ExternalRoleMapperImpl

En el archivo de configuración management-server.properties que se describe anteriormente, ten en cuenta la siguiente línea:

conf_security_externalized.authentication.role.mapper.implementation.class=com.customer.authorization.impl.ExternalRoleMapperImpl

Esta clase implementa la interfaz ExternalRoleMapperService y es obligatoria. Debes crear tu propia implementación de esta clase que refleje tus respectivos grupos. Cuando termines, coloca la clase compilada en un JAR y colócalo en /<install_dir>/apigee/edge-gateway/lib/infra/libraries

Puedes asignar el nombre que desees a la clase y al paquete, siempre y cuando implemente ExternalRoleMapperService, se pueda acceder en la ruta de clase y se pueda hacer referencia de forma correcta en el archivo de configuración management-server.properties

A continuación, se muestra un ejemplo de implementación de una clase ExternalRoleMapperImpl bien comentado. Para compilar esta clase, debes hacer referencia al siguiente archivo JAR incluido con 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);

        }

    }

}