Mapowanie ról zewnętrznych

Edge for Private Cloud w wersji 4.17.05

Zewnętrzne mapowanie ról pozwala mapować własne grupy lub role na role i grupy kontroli dostępu oparte na rolach (RBAC) utworzone w Apigee Edge.

Wymagania wstępne

  • Aby wykonać tę konfigurację, musisz być administratorem systemu Apigee Private Cloud z danymi logowania administratora systemu globalnego.
  • Musisz znać katalog główny instalacji Apigee Edge Private Cloud. Domyślny katalog główny to /opt. Jeśli podczas instalacji Apigee Edge Private Cloud został wybrany inny katalog główny, podczas wykonywania tych czynności użyj go zamiast polecenia /opt.
  • Uzyskaj wymagane pliki JAR z Apigee.

Sprawdź, czy użytkownicy są zarejestrowani w Edge i w 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 dodajesz użytkownika do zewnętrznej usługi katalogowej, musisz też dodać go do repozytorium użytkownika Apigee.

Na przykład użytkownik a01@company.com istnieje w zewnętrznej grupie katalogu a01@company.com. Następnie musisz zmapować konto użytkownika a01@company.com na rolę administratora organizacji 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 ich do 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 ukończysz poniższą konfigurację, musisz utworzyć klasę Java, która implementuje interfejs ExternalRoleMapperService. Szczegółowe informacje o implementacji znajdziesz poniżej.
  2. Zaloguj się na serwer zarządzania brzegiem Apigee, a następnie zatrzymaj serwer zarządzania:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server stop
  3. Sprawdź stan serwerów. Sprawdź, czy serwer zarządzania jest zatrzymany lub nieuruchomiony:
    > /opt/apigee/apigee-service/bin/apigee-all status
  4. Otwórz plik /opt/apigee/customer/application/management-server.properties w edytorze tekstu.
  5. Edytuj plik management-server.properties, korzystając z następujących ustawień: 
    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, o których mowa powyżej, ExternalRoleMapperImpl, to tylko przykład – jest to klasa, którą musisz zaimplementować, a także możesz nadać jej dowolną nazwę oraz pakiet. Szczegółowe informacje o implementowaniu tej klasy znajdziesz w przykładowej implementacji poniżej.
  6. Zapisz plik management-server.properties.
  7. Uruchom serwer zarządzania:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server
  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 wartość właściwości na wartość false (fałsz):
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. Ponownie uruchom serwer zarządzania:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server restart

Informacje o przykładowej implementacji ExternalRoleMapperImpl

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

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ę tych zajęć z uwzględnieniem Twoich grup. Gdy skończysz, umieść skompilowaną klasę w pliku JAR i umieść go w katalogu /<install_dir>/apigee/edge-gateway/lib/infra/libraries.

Możesz nazwać klasę i pakiet dowolnie, o ile zaimplementowano usługę ExternalRoleMapperService, jest dostępny w ścieżce klasy i jest poprawnie przywoływany w pliku konfiguracyjnym management-server.properties.

Poniżej znajduje się dobrze skomentowana przykładowa implementacja klasy ExternalRoleMapperImpl. 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.
    * 
    * 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);

        }

    }

}