Получить группы 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. Если вы сделаете это, вы можете просто посмотреть список групп. Я понимаю, что все это довольно сложно.

Другие вопросы по тегам