Externe Rollenzuordnung

Edge for Private Cloud Version 4.17.05

Mit der externen Rollenzuordnung können Sie Ihre eigenen Gruppen oder Rollen rollenbasierten Zugriffssteuerungsrollen (RBAC) und Gruppen zuordnen, die in Apigee Edge erstellt wurden. 

Voraussetzungen

  • Sie müssen ein Apigee Private Cloud-Systemadministrator mit globalen Anmeldedaten des Systemadministrators sein, um diese Konfiguration durchzuführen. 
  • Sie müssen das Stammverzeichnis Ihrer Apigee Edge Private Cloud-Installation kennen. Das Standardstammverzeichnis ist /opt. Wenn Sie während der Installation von Apigee Edge Private Cloud ein anderes Stammverzeichnis ausgewählt haben, verwenden Sie dieses anstelle von „/opt“, wenn Sie dieser Anleitung folgen.
  • Rufen Sie die erforderlichen JAR-Dateien von Apigee ab.

Achten Sie darauf, dass Nutzer in Edge und in Ihrem Verzeichnisdienst registriert sind

Wenn Sie die Rollenzuordnung verwenden, müssen alle Nutzer, die auf Edge zugreifen, sowohl in Ihrem externen Verzeichnisdienst als auch im Edge-Nutzer-Repository vorhanden sein. Wenn Sie also einen Nutzer zu Ihrem externen Verzeichnisdienst hinzufügen, müssen Sie diesen Nutzer auch dem Apigee-Nutzer-Repository hinzufügen.

Der Nutzer a01@company.com ist beispielsweise in der externen Verzeichnisgruppe 'apiadmin' vorhanden. Anschließend ordnen Sie den Nutzer a01@company.com der Rolle orgadmin in Edge zu. Daher muss der Nutzer a01@company.com zuerst der Gruppe orgadmin in Edge hinzugefügt werden. 

Weitere Informationen zum Erstellen von Edge-Nutzern und Zuweisen von Rollen finden Sie unter Globale Nutzer erstellen.

Standardkonfiguration

Die Zuordnung externer Rollen ist standardmäßig deaktiviert.

Externe Rollenzuordnung aktivieren

  1. Bevor Sie die folgende Konfiguration abschließen können, müssen Sie eine Java-Klasse erstellen, die die ExternalRoleMapperService-Schnittstelle implementiert. Weitere Informationen zu dieser Implementierung finden Sie unten in der Beispielimplementierung.
  2. Melden Sie sich bei Ihrem Apigee Edge Management Server an und beenden Sie den Management Server:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server stop
  3. Prüfen Sie den Status der Server. Achten Sie darauf, dass der Verwaltungsserver beendet ist/nicht ausgeführt wird:
    > Status /opt/apigee/apigee-service/bin/apigee-all
  4. Öffnen Sie /opt/apigee/customer/application/management-server.properties in einem Texteditor.
  5. Bearbeiten Sie die Datei management-server.properties mit den folgenden Einstellungen: 
    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


    Wichtig: External RoleMapperImpl Weitere Informationen zur Implementierung dieser Klasse finden Sie in der Beispielimplementierung unten. 
  6. Speichern Sie die Datei management-server.properties.
  7. Starten Sie den Verwaltungsserver:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server start
  8. Prüfen Sie, ob der Server ausgeführt wird:
    > Status /opt/apigee/apigee-service/bin/apigee-all

Externe Autorisierung deaktivieren

So deaktivieren Sie die externe Autorisierung:

  1. Öffnen Sie /opt/apigee/customer/application/management-server.properties in einem Texteditor.
  2. Ändern Sie den Datenspeicher der Authentifizierung in ldap:
    conf_security_authentication.user.store=ldap
  3. Legen Sie das folgende Attribut auf „false“ fest:
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. Starten Sie den Verwaltungsserver neu:
    > /opt/apigee/apigee-service/bin/apigee-service-Edge-management-server-Neustart

Informationen zur Beispielimplementierung „ExternalRoleMapperImpl“

Notieren Sie sich in der oben beschriebenen Konfigurationsdatei management-server.properties die folgende Zeile:

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

Diese Klasse implementiert die Schnittstelle ExternalRoleMapperService und ist erforderlich. Sie müssen Ihre eigene Implementierung dieser Klasse erstellen, die Ihre jeweiligen Gruppen widerspiegelt. Speichern Sie anschließend die kompilierte Klasse in einer JAR-Datei und speichern Sie diese in /<install_dir>/apigee/edge-gateway/lib/infra/libraries

Sie können der Klasse und dem Paket einen beliebigen Namen geben, solange ExternalRoleMapperService implementiert ist, in Ihrem Klassenpfad darauf zugegriffen werden kann und in der Konfigurationsdatei management-server.properties korrekt darauf verwiesen wird. 

Unten finden Sie eine gut kommentierte Beispielimplementierung einer ExternalRoleMapperImpl-Klasse. Um diese Klasse zu kompilieren, müssen Sie auf die folgende in Edge enthaltene JAR-Datei verweisen:

/<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);

        }

    }

}