Mappatura dei ruoli esterna

Edge for Private Cloud v. 4.17.05

La mappatura dei ruoli esterni ti consente di mappare i tuoi gruppi o ruoli ai ruoli e ai gruppi di controllo degli accessi basato su ruoli (RBAC) creati su Apigee Edge. 

Prerequisiti

  • Per eseguire questa configurazione, devi essere un amministratore di sistema di Apigee Private Cloud con credenziali di amministratore di sistema globale. 
  • Devi conoscere la directory root dell'installazione di Apigee Edge Private Cloud. La directory root predefinita è /opt. Se hai scelto una directory root diversa durante l'installazione di Apigee Edge Private Cloud, utilizza quella anziché /opt quando segui queste istruzioni.
  • Ottieni i file JAR richiesti da Apigee.

Assicurati che gli utenti siano registrati su Edge e nel tuo servizio di directory

Quando utilizzi la mappatura dei ruoli, tutti gli utenti che accedono a Edge devono esistere sia nel servizio di directory esterno sia nel repository degli utenti Edge. Ciò significa che quando aggiungi un utente al servizio di directory esterno, devi aggiungere lo stesso utente anche al repository degli utenti Apigee.

Ad esempio, l'utente a01@company.com esiste nel gruppo della directory esterna "apiadmin". Quindi, vuoi mappare l'utente a01@company.com al ruolo orgadmin in Edge. Pertanto, l'utente a01@company.com deve prima essere aggiunto al gruppo orgadmin su Edge. 

Per saperne di più sulla creazione di utenti Edge e sull'assegnazione dei ruoli, consulta Creazione di utenti globali.

Configurazione predefinita

La mappatura dei ruoli esterni è disattivata per impostazione predefinita.

Abilitazione della mappatura dei ruoli esterni

  1. Prima di poter completare la seguente configurazione, devi creare una classe Java che implementi l'interfaccia ExternalRoleMapperService. Per i dettagli su questa implementazione, consulta l'esempio di implementazione riportato di seguito.
  2. Accedi al server di gestione di Apigee Edge, quindi arrestalo:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server stop
  3. Controlla lo stato dei server. Assicurati che il server di gestione sia arrestato/non in esecuzione:
    > /opt/apigee/apigee-service/bin/apigee-all status
  4. Apri /opt/apigee/customer/application/management-server.properties in un editor di testo.
  5. Modifica il file management-server.properties con le seguenti impostazioni: 
    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 classe di implementazione e il nome del pacchetto a cui si fa riferimento sopra, ExternalRoleMapperImpl, sono solo un esempio. Si tratta di una classe che devi implementare e che puoi denominare come preferisci. Per informazioni dettagliate sull'implementazione di questa classe, consulta l'implementazione di esempio riportata di seguito. 
  6. Salva il file management-server.properties.
  7. Avvia il server di gestione:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server start
  8. Verifica che il server sia in esecuzione:
    > /opt/apigee/apigee-service/bin/apigee-all status

Disattivazione dell'autorizzazione esterna

Per disattivare l'autorizzazione esterna:

  1. Apri /opt/apigee/customer/application/management-server.properties in un editor di testo.
  2. Cambia l'archivio utenti di autenticazione in ldap:
    conf_security_authentication.user.store=ldap
  3. Imposta la seguente proprietà su false:
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. Riavvia il server di gestione:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server restart

Informazioni sull'implementazione di esempio ExternalRoleMapperImpl

Nel file di configurazione management-server.properties descritto sopra, tieni presente questa riga:

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

Questa classe implementa l'interfaccia ExternalRoleMapperService ed è obbligatoria. Devi creare la tua implementazione di questa classe che rifletta i rispettivi gruppi. Al termine, inserisci la classe compilata in un JAR e inserisci il JAR in /<install_dir>/apigee/edge-gateway/lib/infra/libraries. 

Puoi assegnare alla classe e al pacchetto il nome che preferisci, purché implementi ExternalRoleMapperService, sia accessibile nel tuo classpath e sia referenziato correttamente nel file di configurazione management-server.properties. 

Di seguito è riportato un esempio ben commentato di implementazione di una classe ExternalRoleMapperImpl. Per compilare questa classe, devi fare riferimento al seguente file JAR incluso in 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);

        }

    }

}