Asignación de roles externa

Edge for Private Cloud v. 4.17.05

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

Requisitos previos

  • Para realizar esta configuración, debes ser un administrador de sistema de Apigee Private Cloud con credenciales de administrador del sistema global.
  • Debes conocer el directorio raíz de tu 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 a medida que 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 en tu servicio de directorio externo y 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 directorios externos 'apiadmin'. Luego, debes 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 externa

  1. Antes de completar la siguiente configuración, debes crear una clase Java que implemente la interfaz de ExternalRoleMapperService. Para obtener detalles sobre esta implementación, consulta el siguiente ejemplo de implementación.
  2. Accede a tu servidor de administración de Apigee Edge y, luego, detén el servidor de administración:
    > /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:
    > Estado de /opt/apigee/apigee-service/bin/apigee-all
  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 hizo referencia anteriormente, ExternalRoleMapperImpl, es solo un ejemplo; es una clase que debes implementar y que puedes asignar a la clase y al paquete como desees. Para obtener detalles sobre cómo implementar esta clase, consulta el siguiente ejemplo de implementació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:
    > Estado de /opt/apigee/apigee-service/bin/apigee-all

Inhabilita la autorización externa

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

  1. Abra /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

Información acerca de la implementación de muestra de ExternalRoleMapperImpl

En el archivo de configuración management-server.properties que se describió antes, anota 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 respectivos grupos. Cuando termines, coloca la clase compilada en un archivo JAR y colócalo en /<install_dir>/apigee/edge-gateway/lib/infra/libraries.

Puedes nombrar la clase y el paquete como desees, siempre que se implemente ExternalRoleMapperService, se pueda acceder a él en la ruta de clase y se haga referencia correctamente en el archivo de configuración management-server.properties.

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

        }

    }

}