Получить группы AD с билетом Kerberos в Java
Я получаю билет Kerberos со следующим кодом:
String client = "com.sun.security.jgss.krb5.initiate";
LoginContext lc = new LoginContext(client, new CallbackHandler() {
@Override
public void handle(Callback[] arg0) throws IOException, UnsupportedCallbackException {
System.out.println("CB: " + arg0);
}
});
lc.login();
System.out.println("SUBJ: " + lc.getSubject());
Этот код работает нормально, я получаю тему, которая показывает мой идентификатор пользователя. Теперь у меня проблема в том, что мне нужно знать, принадлежит ли пользователь к определенной группе в AD. Есть ли способ сделать это отсюда?
Я видел код для получения групп пользователей, использующих LDAP, но он требует входа в систему с именем пользователя и паролем, мне нужно сделать это способом SSO.
1 ответ
Вы не можете сделать это с видом билета, который вы получаете при входе в систему. Проблема заключается в том, что Windows PAC (который содержит информацию о членстве в группе) находится в зашифрованной части заявки. Только контроллер домена знает, как расшифровать этот начальный билет.
Это можно сделать с помощью сервисного билета. Таким образом, вы можете настроить keytab, использовать jgss для аутентификации, а затем расшифровать билет, найти PAC, декодировать PAC и затем обработать SID. Я не смог найти код для большей части этого в Java, хотя он доступен в C. Посмотрите на это, как расшифровать билет. Теперь, в этот момент вы говорите о написании или поиске декодера NDR, чтении всех спецификаций о том, как соединяются PAC и sids, или переносе кода C на Java. Я бы порекомендовал другой подход. Вместо этого используйте Kerberos для входа в LDAP. Найдите библиотеку LDAP, которая поддерживает Java SASL, и вы сможете использовать билет Kerberos для входа в систему.
Если ваше приложение хочет знать группы, к которым принадлежит пользователь, для заполнения меню и тому подобного, вы можете просто войти в систему как пользователь. Однако, если вы собираетесь решить, какой доступ имеет пользователь, не входите в систему как пользователь, чтобы получить доступ к LDAP. Проблема в том, что с Kerberos злоумышленник может взаимодействовать с пользователем, чтобы выдать себя за всю инфраструктуру вашего приложения, если вы не подтвердите, что ваш билет поступил из инфраструктуры. То есть, поскольку пользователь знает свой пароль, и поскольку это единственный секрет, о котором знает ваше приложение, пользователь может сотрудничать с кем-то, притворяясь сервером LDAP и заявляя, что у него есть любой доступ, который он хочет.
Вместо этого у вашего приложения должна быть собственная учетная запись для доступа к LDAP. Если вы сделаете это, вы можете просто посмотреть список групп. Я понимаю, что все это довольно сложно.