Mappage de rôle externe

Edge pour Private Cloud version 4.17.05

Le mappage des rôles externes vous permet de mapper vos propres groupes ou rôles sur des rôles de contrôle des accès basés sur les rôles (RBAC) et des groupes créés sur Apigee Edge.

Prérequis

  • Pour effectuer cette configuration, vous devez être un administrateur système de cloud privé Apigee et disposer d'identifiants d'administrateur système globaux.
  • Vous devez connaître le répertoire racine de votre installation de cloud privé Apigee Edge. Le répertoire racine par défaut est /opt. Si vous avez choisi un répertoire racine différent lors de l'installation du cloud privé Apigee Edge, utilisez-le à la place de /opt lorsque vous suivez ces instructions.
  • Procurez-vous les fichiers JAR requis à partir d'Apigee.

Assurez-vous que les utilisateurs sont enregistrés sur Edge et dans votre service d'annuaire

Lorsque vous utilisez le mappage de rôle, tous les utilisateurs qui accèdent à Edge doivent exister à la fois dans votre service d'annuaire externe et dans le dépôt d'utilisateurs Edge. Cela signifie que lorsque vous ajoutez un utilisateur à votre service d'annuaire externe, vous devez également l'ajouter au dépôt d'utilisateurs Apigee.

Par exemple, l'utilisateur a01@company.com existe dans votre groupe d'annuaires externe a01@company.com. Vous souhaitez ensuite mapper l'utilisateur a01@company.com au rôle orgadmin dans Edge. Par conséquent, l'utilisateur a01@company.com doit d'abord être ajouté au groupe orgadmin sur Edge.

Voir Création d'utilisateurs globaux pour plus d'informations sur la création d'utilisateurs Edge et leur attribution à des rôles.

Configuration par défaut

Le mappage de rôles externe est désactivé par défaut.

Activer le mappage des rôles externes

  1. Avant de pouvoir effectuer la configuration suivante, vous devez créer une classe Java qui implémente l'interface ExternalRoleMapperService. Pour en savoir plus sur cette implémentation, consultez l'exemple ci-dessous.
  2. Connectez-vous à votre serveur de gestion Apigee Edge, puis arrêtez-le:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server arrêter
  3. Vérifiez l'état des serveurs. Assurez-vous que le serveur de gestion est arrêté/non en cours d'exécution:
    > /opt/apigee/apigee-service/bin/apigee-all statut
  4. Ouvrez /opt/apigee/customer/application/management-server.properties dans un éditeur de texte.
  5. Modifiez le fichier management-server.properties à l'aide des paramètres suivants: 
    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


    Important: La classe d'implémentation et le nom de package référencés ci-dessus, ExternalRoleMapperImpl, ne sont qu'un exemple. Il s'agit d'une classe que vous devez implémenter, et que vous pouvez nommer et empaqueter comme vous le souhaitez. Pour en savoir plus sur l'implémentation de cette classe, consultez l'exemple d'implémentation ci-dessous.
  6. Enregistrez le fichier management-server.properties.
  7. Démarrez le serveur de gestion:
    > /opt/apigee/apigee-service/bin/apigee-service début de gestion du serveur périphérique
  8. Vérifiez que le serveur est en cours d'exécution:
    > /opt/apigee/apigee-service/bin/apigee-all statut

Désactivation de l'autorisation externe

Pour désactiver les autorisations externes:

  1. Ouvrez /opt/apigee/customer/application/management-server.properties dans un éditeur de texte.
  2. Remplacez le magasin de l'utilisateur d'authentification par ldap:
    conf_security_authentication.user.store=ldap
  3. Définissez la propriété suivante sur "false" :
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. Redémarrez le serveur de gestion:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server restart

À propos de l'implémentation de l'exemple ExternalRoleMapperImpl

Dans le fichier de configuration management-server.properties décrit ci-dessus, notez la ligne suivante:

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

Cette classe, qui est obligatoire, implémente l'interface ExternalRoleMapperService. Vous devez créer votre propre implémentation de cette classe reflétant vos groupes respectifs. Lorsque vous avez terminé, placez la classe compilée dans un fichier JAR, puis placez ce fichier dans /<install_dir>/apigee/edge-gateway/lib/infra/libraries.

Vous pouvez nommer la classe et le package comme bon vous semble, à condition qu'il implémente ExternalRoleMapperService, qu'il soit accessible dans votre chemin de classe et qu'il soit correctement référencé dans le fichier de configuration management-server.properties.

Vous trouverez ci-dessous un exemple d'implémentation bien commenté d'une classe ExternalRoleMapperImpl. Pour compiler cette classe, vous devez référencer le fichier JAR suivant inclus avec 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);

        }

    }

}