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
- 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.
- Zaloguj się na serwerze zarządzania Apigee Edge, a następnie zatrzymaj go:
> /opt/apigee/apigee-service/bin/apigee-service edge-management-server stop - Sprawdź stan serwerów. Upewnij się, że serwer zarządzania jest zatrzymany lub nie działa:
> /opt/apigee/apigee-service/bin/apigee-all status - Otwórz plik /opt/apigee/customer/application/management-server.properties w edytorze tekstu.
- 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. - Zapisz plik management-server.properties.
- Uruchom serwer zarządzania:
> /opt/apigee/apigee-service/bin/apigee-service edge-management-server start - Sprawdź, czy serwer działa:
> /opt/apigee/apigee-service/bin/apigee-all status
Wyłączanie autoryzacji zewnętrznej
Aby wyłączyć autoryzację zewnętrzną:
- Otwórz plik /opt/apigee/customer/application/management-server.properties w edytorze tekstu.
- Zmień magazyn użytkowników uwierzytelniania na ldap:
conf_security_authentication.user.store=ldap - Ustaw tę właściwość na wartość „false”:
conf_security_externalized.authentication.role.mapper.enabled=false - 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); } } }