2015-07-15 1 views
2

Мы пытаемся настроить Azkaban с помощью аутентификации LDAP в нашей производственной среде. Любые выводы о том, как это сделать? Документация говорит, что это можно сделать, добавив файл jar-файла плагина, расширив класс UserManager. Я новичок в azkaban, ища примерный код для этогоАутентификация LDAP для Azkaban

ответ

2

Вам нужно будет установить пользовательский плагин «пользовательский менеджер». Его можно найти на github: https://github.com/researchgate/azkaban-ldap-usermanager

Инструкции по настройке плагина пользовательского менеджера можно найти на первой странице репозитория github.

По сути дела вы должны:

  1. Скачать и построить плагин
  2. Скопируйте .jar файл, который вы построили в каталог ./extlib вашего Азкабана установки
  3. Редактировать azkaban.properties файл, указав user.manager.class и ряд свойств user.manager.ldap.
1

Мы также хотели установить аутентификацию LDAP в azkaban, но проект с открытым исходным кодом, упомянутый в первом ответе, имеет очень ограниченные возможности и не позволяет запускать переговоры TLS после установления соединения с сервером LDAP.

Мы написали совершенно новый класс Java, чтобы заботиться о следующих сценариях:

  • Установить соединение LDAP ненадежно (порт 389)
  • Start TLS Response и TLS вести переговоры
  • А потом аутентифицировать учетные данные пользователя.

При таком подходе нам также не нужно создавать пользователя службы в LDAP только для azkaban.

Посмотрите в блоке образец кода

@Override 
public User getUser(String username, String password) throws UserManagerException { 
    if (username == null || username.trim().isEmpty()) { 
     throw new UserManagerException("Username is empty."); 
    } else if (password == null || password.trim().isEmpty()) { 
     throw new UserManagerException("Password is empty."); 
    } 

    String email = null; 
    String groups = null; 
    StringBuilder url = new StringBuilder("ldap://").append(ldapHost).append(":").append(ldapPort); 

    Hashtable<String, String> env = new Hashtable<String, String>(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
    env.put(Context.PROVIDER_URL, url.toString()); 

    try { 
     // Create initial context 
     LdapContext ctx = new InitialLdapContext(env, null); 
     // Start TLS 
     StartTlsResponse tls = (StartTlsResponse) ctx.extendedOperation(new StartTlsRequest()); 
     SSLSession sess = tls.negotiate(); 

     // Adding username and password to environment 
     StringBuilder sb = new StringBuilder("uid=").append(username).append(",").append(ldapUserBase); 
     ctx.addToEnvironment(Context.SECURITY_AUTHENTICATION, "simple"); 
     ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, sb.toString()); 
     ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password); 

     // Search the user in a LDAP directory 
     final LdapCtx x = (LdapCtx) ctx.lookup(sb.toString()); 

     // Lookup is successful - creating an Azkaban user 
     User user = new User(username); 

     // Searching LDAP directory to get email and group 
     SearchControls ctls = new SearchControls(); 
     String[] attributes = { "cn", "memberOf", "mail" }; 
     ctls.setReturningAttributes(attributes); 

     NamingEnumeration<?> answer = ctx.search(ldapUserBase, "(uid=" + username + ")", ctls); 

     Boolean isAdmin = false; 
     // Search user email and groups 
     while (answer.hasMore()) { 
      SearchResult rslt = (SearchResult) answer.next(); 
      Attributes attrs = rslt.getAttributes(); 
      groups = attrs.get("memberof").toString().split(":")[1].trim(); 
      if (attrs.get("memberof") != null && attrs.get("memberof").toString().split(":").length > 0) { 
       groups = attrs.get("memberof").toString().split(":")[1].trim(); 
       for (String group : groups.split(",")) { 
        if (ldapAdminGroups.contains(group)) 
         isAdmin = true; 
       } 
      } 
      if (attrs.get("mail") != null) { 
       email = attrs.get("mail").toString().split(":")[1].trim(); 
       user.setEmail(email); 
      } 
     } 

     // Assign the correct role 
     if (isAdmin) 
      user.addRole("admin"); 
     else 
      user.addRole("read"); 
     ctx.close(); 
     return user; 
    } catch (NamingException e) { 
     throw new UserManagerException("LDAP error: " + e.getMessage(), e); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     throw new UserManagerException("IO error", e); 
    } 
} 

Примечание: Я не сделал много обработки исключений в этом - вы должны сделать это в соответствии с вашими потребностями.

Как сделать, чтобы он работал в Азкабан:

  • Построить Maven или Gradle проекта.
  • не требуется дополнительная библиотека (кроме Азкабана - т.е. com.linkedin.azkaban)
  • Есть новый класс, который будет наследовать «azkaban.user.UserManager»
  • Создание и скопировать банку в Азкабан/extlibs
  • В azkaban.properties - установите «user.manager.class =», а также все необходимые свойства, такие как данные узла, порта и ldap userbase (ou = Пользователи, dc = stackoverflow, dc = com).

И вы должны быть хорошо, чтобы аутентифицировать пользователей через LDAP.

Happy Coding !!

Thanks, Hussain Bohra