Мы пытаемся настроить Azkaban с помощью аутентификации LDAP в нашей производственной среде. Любые выводы о том, как это сделать? Документация говорит, что это можно сделать, добавив файл jar-файла плагина, расширив класс UserManager. Я новичок в azkaban, ища примерный код для этогоАутентификация LDAP для Azkaban
ответ
Вам нужно будет установить пользовательский плагин «пользовательский менеджер». Его можно найти на github: https://github.com/researchgate/azkaban-ldap-usermanager
Инструкции по настройке плагина пользовательского менеджера можно найти на первой странице репозитория github.
По сути дела вы должны:
- Скачать и построить плагин
- Скопируйте .jar файл, который вы построили в каталог ./extlib вашего Азкабана установки
- Редактировать azkaban.properties файл, указав user.manager.class и ряд свойств user.manager.ldap.
Мы также хотели установить аутентификацию 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