Mappatura dei ruoli esterna

Edge per Private Cloud v. 4.17.05

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

Prerequisiti

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

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

Consulta Creazione di utenti globali per ulteriori informazioni sulla creazione di utenti Edge e sull'assegnazione dei ruoli.

Configurazione predefinita

La mappatura dei ruoli esterni è disattivata 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, vedi l'implementazione di esempio riportata di seguito.
  2. Accedi a Apigee Edge Management Server e 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.authorization.impl.ExternalRoleMapperImpl


    Importante: la classe di implementazione e il nome del pacchetto a cui si fa riferimento in precedenza, ExternalRoleMapperImpl, sono solo un esempio. Si tratta di una classe che devi implementare e che puoi assegnare alla classe e al pacchetto come preferisci. Per maggiori dettagli sull'implementazione di questa classe, vedi l'implementazione di esempio 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 riavvio

Informazioni sull'implementazione di esempio di ExternalRoleMapperImpl

Nel file di configurazione management-server.properties descritto in precedenza, 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 una tua implementazione di questa classe che rifletta i tuoi rispettivi gruppi. Al termine, inserisci la classe compilata in un JAR e inserisci quel JAR in /<install_dir>/apigee/edge-gateway/lib/infra/libraries.

Puoi assegnare il nome che preferisci alla classe e al pacchetto, purché implementi ExternalRoleMapperService, sia accessibile nel tuo classpath e vi faccia riferimento 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);

        }

    }

}