#java #ssh #single-sign-on #kerberos #gssapi
#java #ssh #единый вход #kerberos #gssapi
Вопрос:
В настоящее время я могу аутентифицировать пользователей в приложении Java, используя JAAS и получая запрос на получение билета, который отправляется с сервера Windows, на котором запущен Active Directory. Это легко сделать с Krb5LoginModule
помощью java.
Теперь я хотел бы запустить команду ssh из моего java-приложения и использовать мой TGT, чтобы позволить ssh не запрашивать пароль. Я видел несколько руководств (OpenSSH и Kerberos) по настройке ssh для работы с kerberos, но они используют kinit
для получения своего TGT, а билет хранится в /tmp/krbcc_XXX . Затем, после создания билета, они могут свободно использовать ssh.
Я мог бы записать TGT на диск и сохранить его в /tmp/krbcc_XXX или я мог бы запустить команду ssh в a PrivilegedAction
, однако я не знаю, сработает ли это. Есть ли принятый способ сделать это?
В принципе, я хотел бы вызвать что-то подобное, и чтобы оно не запрашивало у меня пароль:
// Create Command.
List<String> arguments = new ArrayList<String>();
arguments.addAll(Arrays.asList("ssh", "user@host", "xterm"));
// Run SSH command.
ProcessBuilder process = new ProcessBuilder(arguments).start();
Ответ №1:
Сначала вы должны уточнить, кто будет инициировать запрос SSH. Java или базовая система Linux / Unix. Если вы выберете последнее, это не кроссплатформенный и не Java-способ. Вы должны использовать Java SSH impl, который поддерживает Keberos. Все должно пройти гладко. JSch — это чистый Java-интерфейс с gss-api-with-mic
поддержкой.
С другой стороны, вы можете попытаться получить личные учетные данные из Subject
созданного с LoginContext
помощью и записать их в расположение файла CC по умолчанию.. После того, как вы это сделаете, попробуйте klist
. Если он считывает файл cc, все готово. Если это не сработает, вы можете изучить код Sun CC reader и отменить его. Вероятно, sun.security.krb5.internal.ccache.FileCredentialsCache
это интересный вариант вместе с его методами обновления и сохранения. Задача состоит в том, чтобы учетные данные частного субъекта были совместимы с желаемым классом sun.security.krb5.internal.ccache.Credentials
. Примечание: Это решение полностью зависит от Sun. Я бы выбрал первый подход, или вы предпочитаете kinit
сначала запустить.