Externe Rollenzuordnung

Edge for Private Cloud Version 4.17.05

Mit der externen Rollenzuordnung können Sie Ihre eigenen Gruppen oder Rollen Rollen der rollenbasierten Zugriffssteuerung (Role-Based Access Control, RBAC) und Gruppen zuordnen, die in Apigee Edge erstellt wurden.

Vorbereitung

  • Sie müssen ein Apigee Private Cloud-Systemadministrator mit globalen Systemadministrator-Anmeldedaten 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, während 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 Benutzer, die auf Edge zugreifen, sowohl in Ihrem externen Verzeichnisdienst als auch im Edge-Benutzer-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 möchten Sie den Nutzer a01@company.com der Rolle orgadmin in Edge zuordnen. Daher muss der Nutzer a01@company.com zuerst der Gruppe orgadmin in Edge hinzugefügt werden.

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

Standardkonfiguration

Die externe Rollenzuordnung 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 Verwaltungsserver:
    > /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 bzw. 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: Die oben genannte Implementierungsklasse und der Paketname ExternalRoleMapperImpl sind nur ein Beispiel. Es handelt sich um eine Klasse, die implementiert werden muss und die Sie die Klasse und das Paket nach Belieben benennen können. Weitere Informationen zur Implementierung dieser Klasse finden Sie unten in der Beispielimplementierung.
  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üfe, 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 Speicher des Nutzers für die 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

Über die Beispielimplementierung „ExternalRoleMapperImpl“

In der oben beschriebenen Konfigurationsdatei management-server.properties steht diese 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. Wenn Sie fertig sind, platzieren Sie die kompilierte Klasse in einer JAR-Datei und platzieren Sie diese JAR-Datei in /<install_dir>/apigee/edge-gateway/lib/infra/libraries.

Sie können die Klasse und das Paket beliebig benennen, solange sie ExternalRoleMapperService implementiert, in Ihrem Klassenpfad zugänglich sind und in der Konfigurationsdatei management-server.properties korrekt referenziert werden.

Im Folgenden 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);

        }

    }

}