Внешнее сопоставление ролей

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 и назначении им ролей см. в разделе Создание глобальных пользователей .

Конфигурация по умолчанию

Внешнее сопоставление ролей отключено по умолчанию.

Включение внешнего сопоставления ролей

  1. Прежде чем вы сможете выполнить следующую настройку, вам необходимо создать класс Java, реализующий интерфейс ExternalRoleMapperService. Подробные сведения об этой реализации см. в примере реализации ниже.
  2. Войдите на свой сервер управления Apigee Edge, а затем остановите сервер управления:
    > /opt/apigee/apigee-service/bin/apigee-service остановка сервера Edge-Management-Server
  3. Проверьте состояние серверов. Убедитесь, что Сервер управления остановлен/не запущен:
    > /opt/apigee/apigee-service/bin/apigee-all status
  4. Откройте /opt/apigee/customer/application/management-server.properties в текстовом редакторе.
  5. Отредактируйте файл 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 , являются лишь примером — это класс, который вы должны реализовать и который вы можете назвать классом и пакетом по своему усмотрению. Подробные сведения о реализации этого класса см. в примере реализации ниже.
  6. Сохраните файл Management-server.properties .
  7. Запустите Сервер управления:
    > /opt/apigee/apigee-service/bin/apigee-service запуск сервера Edge-Management-Server
  8. Убедитесь, что сервер работает:
    > /opt/apigee/apigee-service/bin/apigee-all status

Отключение внешней авторизации

Чтобы отключить внешнюю авторизацию:

  1. Откройте /opt/apigee/customer/application/management-server.properties в текстовом редакторе.
  2. Измените хранилище пользователей аутентификации на ldap :
    conf_security_authentication.user.store=ldap
  3. Установите для следующего свойства значение false:
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. Перезапустите сервер управления:
    > /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);

        }

    }

}