Harici Rol Eşleme

Edge for Private Cloud s. 4.17.05

Harici Rol Eşleme, kendi gruplarınızı veya rollerinizi Apigee Edge'de oluşturulan rol tabanlı erişim denetimi (RBAC) rolleri ve gruplarıyla eşleştirmenize olanak tanır.

Ön koşullar

  • Bu yapılandırmayı gerçekleştirmek için genel sistem yöneticisi kimlik bilgilerine sahip bir Apigee Private Cloud sistem yöneticisi olmanız gerekir.
  • Apigee Edge Private Cloud yüklemenizin kök dizinini bilmeniz gerekir. Varsayılan kök dizin /opt'dir. Apigee Edge Private Cloud kurulumu sırasında farklı bir kök dizin seçtiyseniz bu talimatları uygularken /opt yerine o dizini kullanın.
  • Gerekli JAR dosyalarını Apigee'den edinin.

Kullanıcıların Edge'de ve dizin hizmetinize kayıtlı olduğundan emin olun

Rol eşleme kullanırken Edge'e erişen tüm kullanıcılar hem harici dizin hizmetinizde hem de Edge kullanıcı deposunda bulunmalıdır. Yani harici dizin hizmetinize bir kullanıcı eklediğinizde, bu kullanıcıyı Apigee kullanıcı deposuna da eklemeniz gerekir.

Örneğin, a01@company.com adlı bir kullanıcı, a01@company.com adlı harici dizin grubunuzda bulunur. Ardından a01@company.com kullanıcısını Edge'deki orgadmin rolüyle eşlemek istiyorsunuz. Bu nedenle, a01@company.com kullanıcısı öncelikle Edge'de orgadmin grubuna eklenmelidir.

Edge kullanıcıları oluşturma ve bunları rollere atama hakkında daha fazla bilgi için Genel kullanıcı oluşturma başlıklı makaleyi inceleyin.

Varsayılan yapılandırma

Harici rol eşleme varsayılan olarak devre dışıdır.

Harici Rol Eşlemeyi Etkinleştirme

  1. Aşağıdaki yapılandırmayı tamamlamadan önce ExternalRoleMapperService arayüzünü uygulayan bir Java sınıfı oluşturmanız gerekir. Bu uygulamayla ilgili ayrıntılar için aşağıdaki örnek uygulamaya bakın.
  2. Apigee Edge Yönetim Sunucunuza giriş yapıp Yönetim Sunucusu'nu durdurun:
    > /opt/Apigee/Apigee-service/bin/potansiyel-service Edge-management-server durdurma
  3. Sunucuların durumunu kontrol edin. Yönetim Sunucusunun durdurulduğundan/çalışmadığından emin olun:
    > /opt/Apigee/Apigee-service/bin/Apigee-all durumu
  4. Bir metin düzenleyicide /opt/apigee/customer/application/management-server.properties dosyasını açın.
  5. management-server.properties dosyasını aşağıdaki ayarlarla düzenleyin: 
    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


    Önemli: Yukarıda bahsedilen uygulama sınıfı ve paket adı olan ExternalRoleMapperImpl yalnızca bir örnektir. Bu, uygulamanız gereken, sınıfı ve paketi istediğiniz gibi adlandırabileceğiniz bir sınıftır. Bu sınıfın uygulanmasıyla ilgili ayrıntılar için aşağıdaki örnek uygulamaya bakın.
  6. management-server.properties dosyasını kaydedin.
  7. Yönetim Sunucusu'nu başlatın:
    > /opt/Apigee/Apigee-service/bin/Apigee-service Edge-management-server start
  8. Sunucunun çalıştığını doğrulayın:
    > /opt/Apigee/Apigee-service/bin/Apigee-all durumu

Harici Yetkilendirmeyi Devre Dışı Bırakma

Harici yetkilendirmeyi devre dışı bırakmak için:

  1. Bir metin düzenleyicide /opt/apigee/customer/application/management-server.properties dosyasını açın.
  2. Kimlik doğrulama kullanıcı deposunu LDAP olarak değiştirin:
    conf_security_authentication.user.store=ldap
  3. Şu özelliği false olarak ayarlayın:
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. Yönetim sunucusunu yeniden başlatın:
    > /opt/Apigee/Apigee-service/bin/gelir-hizmeti uç-yönetimi-sunucusu yeniden başlatma

ExternalRoleMapperImpl örnek uygulaması hakkında

Yukarıda açıklanan management-server.properties yapılandırma dosyasında şu satıra dikkat edin:

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

Bu sınıf, ExternalRoleMapperService arayüzünü uygular ve zorunludur. Bu sınıf için, ilgili gruplarınızı yansıtan kendi uygulamanızı oluşturmanız gerekir. İşiniz bittiğinde, derlenmiş sınıfı bir JAR'a yerleştirin ve o JAR'yi /<install_dir>/apigee/edge-gateway/lib/infra/libraries konumuna yerleştirin.

Sınıfa ve pakete ExternalRoleMapperService kullandığı, sınıf yolunuzdan erişilebileceği ve management-server.properties yapılandırma dosyasında doğru bir şekilde başvuruda bulunulduğu sürece istediğiniz şekilde ad verebilirsiniz.

Aşağıda, bir ExternalRoleMapperImpl sınıfının iyi yorumlanmış bir örnek uygulamasını görebilirsiniz. Bu sınıfı derlemek için Edge'e eklenen aşağıdaki JAR dosyasına başvurmanız gerekir:

/<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);

        }

    }

}