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
- 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.
- 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 - 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 - Abre /opt/apigee/customer/application/management-server.properties en un editor de texto.
- 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. - Guarda el archivo management-server.properties.
- Inicia el servidor de administración:
> /opt/apigee/apigee-service/bin/apigee-service Edge-management-server start - 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:
- Abra /opt/apigee/customer/application/management-server.properties en un editor de texto.
- Cambia el almacén de usuarios de autenticación a ldap:
conf_security_authentication.user.store=ldap - Establece la siguiente propiedad como falsa:
conf_security_externalized.authentication.role.mapper.enabled=false - 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); } } }