Mapowanie ról zewnętrznych

Edge dla chmury prywatnej w wersji 4.17.05

Mapowanie ról zewnętrznych umożliwia mapowanie własnych grup lub ról na role i grupy kontroli dostępu opartej na rolach (RBAC) utworzone w Apigee Edge. 

Wymagania wstępne

  • Aby przeprowadzić tę konfigurację, musisz być administratorem systemu Apigee chmury prywatnej z globalnymi danymi logowania administratora systemu. 
  • Musisz znać katalog główny instalacji Apigee Edge chmury prywatnej. Domyślny katalog główny to /opt. Jeśli podczas instalacji Apigee Edge Private Cloud został wybrany inny katalog główny, użyj go zamiast /opt, gdy będziesz postępować zgodnie z tymi instrukcjami.
  • Uzyskaj wymagane pliki JAR z Apigee.

Sprawdzanie, czy użytkownicy są zarejestrowani w Edge i usłudze katalogowej

Jeśli używasz mapowania ról, wszyscy użytkownicy, którzy mają dostęp do Edge, muszą istnieć zarówno w zewnętrznej usłudze katalogowej, jak i w repozytorium użytkowników Edge. Oznacza to, że gdy dodasz użytkownika do zewnętrznej usługi katalogowej, musisz też dodać tego samego użytkownika do repozytorium użytkowników Apigee.

Na przykład użytkownik a01@company.com istnieje w grupie katalogu zewnętrznego 'apiadmin'. Następnie chcesz zmapować użytkownika a01@company.com na rolę orgadmin w Edge. Dlatego użytkownik a01@company.com musi najpierw zostać dodany do grupy orgadmin w Edge. 

Więcej informacji o tworzeniu użytkowników Edge i przypisywaniu im ról znajdziesz w artykule Tworzenie użytkowników globalnych.

Konfiguracja domyślna

Mapowanie ról zewnętrznych jest domyślnie wyłączone.

Włączanie mapowania ról zewnętrznych

  1. Zanim będzie można dokończyć konfigurację, musisz utworzyć klasę Java, która implementuje interfejs ExternalRoleMapperService. Szczegółowe informacje o tej implementacji znajdziesz w przykładzie poniżej.
  2. Zaloguj się na serwerze zarządzania Apigee Edge, a następnie zatrzymaj go:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server stop
  3. Sprawdź stan serwerów. Upewnij się, że serwer zarządzania jest zatrzymany lub nie działa:
    > /opt/apigee/apigee-service/bin/apigee-all status
  4. Otwórz plik /opt/apigee/customer/application/management-server.properties w edytorze tekstu.
  5. Zmodyfikuj plik management-server.properties, wprowadzając te ustawienia: 
    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


    Ważne: klasa implementacji i nazwa pakietu, do których odwołuje się powyższy przykład, czyli ExternalRoleMapperImpl, to tylko przykład. Jest to klasa, którą musisz zaimplementować i którą możesz nazwać dowolnie. To samo dotyczy pakietu. Szczegółowe informacje o implementacji tej klasy znajdziesz w przykładzie poniżej. 
  6. Zapisz plik management-server.properties.
  7. Uruchom serwer zarządzania:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server start
  8. Sprawdź, czy serwer działa:
    > /opt/apigee/apigee-service/bin/apigee-all status

Wyłączanie autoryzacji zewnętrznej

Aby wyłączyć autoryzację zewnętrzną:

  1. Otwórz plik /opt/apigee/customer/application/management-server.properties w edytorze tekstu.
  2. Zmień magazyn użytkowników uwierzytelniania na ldap:
    conf_security_authentication.user.store=ldap
  3. Ustaw tę właściwość na wartość „false”:
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. Uruchom ponownie serwer zarządzania:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server restart

Przykładowa implementacja ExternalRoleMapperImpl

W opisanym powyżej pliku konfiguracyjnym management-server.properties zwróć uwagę na ten wiersz:

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

Ta klasa implementuje interfejs ExternalRoleMapperService i jest wymagana. Musisz utworzyć własną implementację tej klasy, która odzwierciedla Twoje grupy. Po zakończeniu umieść skompilowaną klasę w pliku JAR i umieść ten plik JAR w /<install_dir>/apigee/edge-gateway/lib/infra/libraries. 

Możesz nazwać klasę i pakiet, jak chcesz, o ile implementują one interfejs ExternalRoleMapperService, są dostępne w ścieżce klasy i są prawidłowo przywoływane w pliku konfiguracji management-server.properties. 

Poniżej znajdziesz przykładową implementację klasy ExternalRoleMapperImpl z komentarzami. Aby skompilować tę klasę, musisz odwołać się do tego pliku JAR dołączonego do 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.
    * 
    * Co<llectionNameSp>acedRole results = new< HashSetNameSp>acedRole();
    * 
    * NameSpacedRole sysNameSpace = new NameSpacedRole("sysadmin",
    * SystemNamespace.get());
    * 
    * String orgName =
    * ((OrganizationNamespace)requestedNameSpace).getOrganization();
    * 
    * NameSpacedRole orgNameSpace = new NameSpacedRole ("orgadmin",
    * requestedNameSpace);
    * 
    * results.add(sysNameSpace);
    * 
    * results.add(orgNameSpace<);
    */

pub>lic CollectionNameSpacedRole 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 ");
    }

    DirCont<ext dirContext> = null;

    Collecti<onNameSpacedRo>le results = new HashSetNameSpacedRole();

    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(SearchCon<trols.ONELEV>EL_SCOPE);
        NamingEnumerationSearchResult 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);

        }

    }

}