Mappatura dei ruoli esterna

Edge per Private Cloud v. 4.17.05

La mappatura dei ruoli esterni consente di mappare i tuoi gruppi o ruoli a ruoli di controllo dell'accesso basato sui ruoli (RBAC) e gruppi creati su Apigee Edge. 

Prerequisiti

  • Per eseguire questa configurazione, devi essere un amministratore di sistema del cloud privato Apigee con credenziali di amministratore di sistema globali. 
  • Devi conoscere la directory radice dell'installazione del cloud privato Apigee Edge. La directory principale predefinita è /opt. Se hai scelto una directory root diversa durante l'installazione del cloud privato Apigee Edge, utilizzala al posto di /opt mentre segui queste istruzioni.
  • Recupera 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 esterna sia nel repository degli utenti periferici. Ciò significa che quando aggiungi un utente al servizio di directory esterna, devi anche aggiungere lo stesso utente al repository utente Apigee.

Ad esempio, l'utente a01@azienda.com esiste nel gruppo di directory esterne 'apiadmin'. Quindi vuoi mappare l'utente a01@company.com al ruolo orgadmin in Edge. Di conseguenza, l'utente a01@azienda.com deve prima essere aggiunto al gruppo orgadmin su Edge. 

Consulta Creazione di utenti globali per saperne di più sulla creazione di utenti Edge e sull'assegnazione ai ruoli.

Configurazione predefinita

La mappatura dei ruoli esterni è disabilitata per impostazione predefinita.

Abilitazione della mappatura dei ruoli esterni

  1. Prima di poter completare la configurazione seguente, devi creare una classe Java che implementi l'interfaccia ExternalRoleMapperService. Per maggiori dettagli su questa implementazione, consulta l'esempio di implementazione riportato di seguito.
  2. Accedi al server di gestione Apigee Edge e poi arresta il server di gestione:
    > /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:
    > stato /opt/apigee/apigee-service/bin/apigee-all
  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.authentication.impl.ExternalRoleMapperImpl


    Importante: il pacchetto di implementazione a cui si fa riferimento in precedenza. Per maggiori dettagli sull'implementazione di questo corso, 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:
    > stato /opt/apigee/apigee-service/bin/apigee-all

Disabilitazione dell'autorizzazione esterna

Per disabilitare 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 reboot

Informazioni sull'implementazione di esempio di ExternalRoleMapperImpl

Nel file di configurazione management-server.properties descritto sopra, tieni presente quanto segue:

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

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

Puoi assegnare un nome alla classe e al pacchetto come preferisci, purché implementi ExternalRoleMapperService, sia accessibile nel percorso della classe e venga indicato correttamente nel file di configurazione management-server.properties

Di seguito è riportato un esempio di implementazione ben commentata 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);

        }

    }

}