Asignación de roles externa

Edge para nube privada v. 4.17.05

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

Requisitos previos

  • Debes ser un administrador del sistema de Apigee Private Cloud con credenciales de administrador del sistema global para realizar esta configuración. 
  • Debes conocer el directorio raíz de tu instalación de la nube privada de Apigee Edge. El directorio raíz predeterminado es /opt. Si elegiste un directorio raíz diferente durante la instalación de Apigee Edge para la nube privada, ú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 se usa la asignación de roles, todos los usuarios que acceden 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 agregar a ese mismo usuario 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, primero se debe agregar el usuario a01@company.com al grupo orgadmin en Edge. 

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

Configuración predeterminada

La asignación de roles externos está inhabilitada de forma predeterminada.

Habilita la asignación de roles externos

  1. Antes de completar la siguiente configuración, debes crear una clase de Java que implemente la interfaz ExternalRoleMapperService. Para obtener detalles sobre esta implementación, consulta el ejemplo que se incluye a continuación.
  2. Accede a tu servidor de administración de Apigee Edge y, luego, detenlo:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server stop
  3. Verifica el estado de los servidores. Asegúrate de que el servidor de administración esté detenido o no se esté ejecutando:
    > /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.ExternalRoleMapperImpl


    Importante: La clase de implementación y el nombre del paquete a los que se hace referencia antes, ExternalRoleMapperImpl, son solo un ejemplo; es una clase que debes implementar y que puedes nombrar la clase y el paquete como desees. 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 esté en ejecución:
    > /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 como falsa:
    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 describió antes, observa esta 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 grupos respectivos. Cuando termines, coloca la clase compilada en un JAR y colócala en /<install_dir>/apigee/edge-gateway/lib/infra/libraries. 

Puedes asignar el nombre que desees a la clase y al paquete, siempre que implemente ExternalRoleMapperService, sea accesible en tu ruta de clase y se haga referencia a él correctamente en el archivo de configuración management-server.properties. 

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

        }

    }

}