Edge для частного облака v. 4.17.05
Внешнее сопоставление ролей позволяет сопоставлять ваши собственные группы или роли с ролями и группами управления доступом на основе ролей (RBAC), созданными в Apigee Edge.
Предварительные условия
- Для выполнения этой настройки вы должны быть системным администратором Apigee Private Cloud с учетными данными глобального системного администратора.
- Вам необходимо знать корневой каталог вашей установки Apigee Edge Private Cloud. Корневой каталог по умолчанию — /opt. Если во время установки Apigee Edge Private Cloud вы выбрали другой корневой каталог, используйте его вместо /opt, следуя этим инструкциям.
- Получите необходимые файлы JAR от Apigee.
Убедитесь, что пользователи зарегистрированы в Edge и в вашей службе каталогов.
При использовании сопоставления ролей все пользователи, имеющие доступ к Edge, должны существовать как в вашей внешней службе каталогов, так и в репозитории пользователей Edge. Это означает, что когда вы добавляете пользователя во внешнюю службу каталогов, вы также должны добавить этого же пользователя в хранилище пользователей Apigee.
Например, пользователь a01@company.com существует в вашей внешней группе каталогов apiadmin . Затем вы хотите сопоставить пользователя a01@company.com с ролью orgadmin в Edge. Поэтому пользователя a01@company.com необходимо сначала добавить в группу orgadmin в Edge.
Дополнительные сведения о создании пользователей Edge и назначении им ролей см. в разделе Создание глобальных пользователей .
Конфигурация по умолчанию
Внешнее сопоставление ролей отключено по умолчанию.
Включение внешнего сопоставления ролей
- Прежде чем вы сможете выполнить следующую настройку, вам необходимо создать класс Java, реализующий интерфейс ExternalRoleMapperService. Подробные сведения об этой реализации см. в примере реализации ниже.
- Войдите на свой сервер управления Apigee Edge, а затем остановите сервер управления:
> /opt/apigee/apigee-service/bin/apigee-service остановка сервера Edge-Management-Server - Проверьте состояние серверов. Убедитесь, что Сервер управления остановлен/не запущен:
> /opt/apigee/apigee-service/bin/apigee-all status - Откройте /opt/apigee/customer/application/management-server.properties в текстовом редакторе.
- Отредактируйте файл Management-server.properties со следующими настройками:
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
Важно : указанный выше класс реализации и имя пакета, ExternalRoleMapperImpl , являются лишь примером — это класс, который вы должны реализовать и который вы можете назвать классом и пакетом по своему усмотрению. Подробные сведения о реализации этого класса см. в примере реализации ниже. - Сохраните файл Management-server.properties .
- Запустите Сервер управления:
> /opt/apigee/apigee-service/bin/apigee-service запуск сервера Edge-Management-Server - Убедитесь, что сервер работает:
> /opt/apigee/apigee-service/bin/apigee-all status
Отключение внешней авторизации
Чтобы отключить внешнюю авторизацию:
- Откройте /opt/apigee/customer/application/management-server.properties в текстовом редакторе.
- Измените хранилище пользователей аутентификации на ldap :
conf_security_authentication.user.store=ldap - Установите для следующего свойства значение false:
conf_security_externalized.authentication.role.mapper.enabled=false - Перезапустите сервер управления:
> /opt/apigee/apigee-service/bin/apigee-service перезапуск сервера Edge-Management-Server
О примере реализации ExternalRoleMapperImpl
В описанном выше файле конфигурации Management-server.properties обратите внимание на следующую строку:
conf_security_externalized.authentication.role.mapper.implementation.class=com.customer.authorization.impl.ExternalRoleMapperImpl
Этот класс реализует интерфейс ExternalRoleMapperService и является обязательным. Вам необходимо создать собственную реализацию этого класса, отражающую ваши соответствующие группы. По завершении поместите скомпилированный класс в JAR и поместите этот JAR в /<install_dir>/apigee/edge-gateway/lib/infra/libraries .
Вы можете назвать класс и пакет как угодно, если он реализует ExternalRoleMapperService , доступен в вашем пути к классам и на него правильно ссылаются в файле конфигурации Management-server.properties .
Ниже приведен хорошо прокомментированный пример реализации класса ExternalRoleMapperImpl . Чтобы скомпилировать этот класс, вы должны сослаться на следующий файл JAR, включенный в 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); } } }