2017-01-20 17 views
2

Я построил приложение Java, которое запускает команду через ssh. В первой попытке я аутентифицировался через имя пользователя и пароль, и все работало нормально.JSch не может подключиться через файл Kerberos keytab

Теперь я хочу использовать файл ключа Kerberos для аутентификации, но это создает проблемы!

Вот несколько слов моей конфигурации:

  • KDC сервер: my-server.de
  • Имя Realm: MYREALM.DE
  • Keytab имя пользователя: keytabuser
  • KDC = Сервер: работает на CentOS 7
  • мой клиент: Windows 8.1 (x64) со всеми настройками по умолчанию, Kerberos for Windows установлен
  • мое имя пользователя на клиенте: Daniel
  • kinit -kt ..., кажется, работает хорошо, так что файл Keytab должен также быть хорошо

То, что я до сих пор этот фрагмент кода:

public static void main(String[] args) { 
     String host = "my-server.de"; 
     String user = "keytabuser"; 
     String command = "ls -l"; 

     JSch jsch = new JSch(); 
     jsch.setLogger(new MyLogger()); 

     System.setProperty("java.security.krb5.conf", "C:\\ProgramData\\MIT\\Kerberos5\\krb5.ini"); 
     System.setProperty("java.security.auth.login.config", "C:\\ProgramData\\MIT\\Kerberos5\\jaas.conf"); 
     System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); 

     //to enable kerberos debugging mode 
     System.setProperty("sun.security.krb5.debug", "true"); 

     try { 
      Session session = jsch.getSession(user, host, 22); 
      Properties config = new java.util.Properties(); 
      config.put("StrictHostKeyChecking", "no"); 
      config.put("PreferredAuthentications", "gssapi-with-mic"); 

      session.setConfig(config); 
      session.connect(20000); 

      Channel channel = session.openChannel("exec"); 
      ... // Do the commands 

      channel.disconnect(); 
      session.disconnect(); 
      System.out.println("DONE"); 

     } catch (JSchException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
} 

Это мой jaas.conf файл:

com.sun.security.jgss.krb5.initiate { 
    com.sun.security.auth.module.Krb5LoginModule required 
    doNotPrompt=true 
    principal="[email protected]" 
    useKeyTab=true 
    keyTab="C:\ProgramData\MIT\Kerberos5\keytabuser.keytab" 
    storeKey=true; 
}; 

А вот мой krb5.ini файла:

[libdefaults] 
    default_realm = MYREALM.DE 

[realms] 
    MYREALM.DE = { 
    admin_server = my-server.de 
    kdc = my-server.de 
    } 

Когда я запускаю это приложение, я получаю следующий результат:

ОБНОВЛЕНО: Новый консольный вывод после того, как новый JSch зависимости 0.1.54

INFO: Connecting to my-server.de port 22 
INFO: Connection established 
INFO: Remote version string: SSH-2.0-OpenSSH_6.6.1 
INFO: Local version string: SSH-2.0-JSCH-0.1.54 
INFO: CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256 
INFO: aes256-ctr is not available. 
INFO: aes192-ctr is not available. 
INFO: aes256-cbc is not available. 
INFO: aes192-cbc is not available. 
INFO: CheckKexes: diffie-hellman-group14-sha1,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521 
INFO: CheckSignatures: ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521 
INFO: SSH_MSG_KEXINIT sent 
INFO: SSH_MSG_KEXINIT received 
INFO: kex: server: [email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 
INFO: kex: server: ssh-rsa,ecdsa-sha2-nistp256,ssh-ed25519 
INFO: kex: server: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,[email protected],[email protected],[email protected],aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,[email protected] 
INFO: kex: server: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,[email protected],[email protected],[email protected],aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,[email protected] 
INFO: kex: server: [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-md5,hmac-sha1,[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,[email protected],hmac-sha1-96,hmac-md5-96 
INFO: kex: server: [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-md5,hmac-sha1,[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,[email protected],hmac-sha1-96,hmac-md5-96 
INFO: kex: server: none,[email protected] 
INFO: kex: server: none,[email protected] 
INFO: kex: server: 
INFO: kex: server: 
INFO: kex: client: ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1 
INFO: kex: client: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521 
INFO: kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc 
INFO: kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc 
INFO: kex: client: hmac-md5,hmac-sha1,hmac-sha2-256,hmac-sha1-96,hmac-md5-96 
INFO: kex: client: hmac-md5,hmac-sha1,hmac-sha2-256,hmac-sha1-96,hmac-md5-96 
INFO: kex: client: none 
INFO: kex: client: none 
INFO: kex: client: 
INFO: kex: client: 
INFO: kex: server->client aes128-ctr hmac-md5 none 
INFO: kex: client->server aes128-ctr hmac-md5 none 
INFO: SSH_MSG_KEX_ECDH_INIT sent 
INFO: expecting SSH_MSG_KEX_ECDH_REPLY 
INFO: ssh_rsa_verify: signature true 
WARN: Permanently added 'my-server.de' (RSA) to the list of known hosts. 
INFO: SSH_MSG_NEWKEYS sent 
INFO: SSH_MSG_NEWKEYS received 
INFO: SSH_MSG_SERVICE_REQUEST sent 
INFO: SSH_MSG_SERVICE_ACCEPT received 
INFO: Authentications that can continue: gssapi-with-mic 
INFO: Next authentication method: gssapi-with-mic 
INFO: Disconnecting from my-server.de port 22 
com.jcraft.jsch.JSchException: Auth fail 
    at com.jcraft.jsch.Session.connect(Session.java:519) 
    at kerberos.JschKerberos.main(JschKerberos.java:49) 

Есть ли что-то неправильно с моей конфигурацией? Существуют ли какие-либо условия между локальным (пользователем, доменом и т. Д.) И удаленным?

+0

Мои 2 цента: чтобы получить все отладочные трассы, добавьте в командной строке '-Dsun.security.krb5.debug = true -Djava.security.debug = gssloginconfig, configfile, configparser, logincontext' в командной строке, чтобы убедиться, что вы не пропустите ни одной инициализации setp –

+0

Также установите 'useTicketCache = false' и' storeKey = false', чтобы убедиться, что вы не страдаете побочными эффектами из кеша. Поскольку вы предоставляете keytab для JAAS, вы можете сохранить свой билет в своем Java-процессе. –

+0

Хорошо, я попробую позже, спасибо за помощь до сих пор. Jaas.conf и krb5.ini в порядке или я что-то пропустил? –

ответ

1

Я наконец нашел решение! Это был недостающий сервис keytab для сервиса sshd! Некоторые серверы служб не генерируются автоматически сервером Kerberos. Так что это должно быть сделано вручную с помощью kadmin, так как служба sshd также должна пройти аутентификацию против Kerberos! Это делается директором host/[email protected].

Важно: здесь «хост» является фиксированной строкой (!), Я всегда заменяю ее именем хоста моего сервера OpenSSH ... Итак, нужно заменить только «fqdn» и «REALM.COM» по вашим данным!

Так что это были необходимые шаги для меня, чтобы получить работу приложения :

  1. Set GSSAPIAuthentication yes в /etc/ssh/sshd_conf конфигурационном файле сервера OpenSSH
  2. Set Host * [...] GSSAPIAuthentication yes в /etc/ssh/ssh_conf файле конфигурации клиента SSH
  3. Проверьте jaas.conf и krb5.conf (или .ini) файлы на клиенте правильные настройки (см блоки кода в разделе вопросов выше)
  4. На сервере Kerberos , открытый kadmin.local и тип ktadd host/my-server.de
  5. Дополнительно: Добавить пользователя принципала (если она еще не существует): ktadd keytabuser
  6. Сделать kinit keytabuser (с паролем) или kinit -kt /path/to/file.keytab keytabuser (нормальная команда Kerberos)
  7. Проверьте, если пользователь проходит проверку подлинности с помощью klist
  8. Запустите приложение или SSH непосредственно с помощью консоли ssh [email protected]
  9. Вы должны быть зарегистрированы в кэшированных билет!

Конечно, пользователь keytabuser должен быть пользователем на машине ssh-server!

+2

Duh. Таким образом, вы пробовали Kerberos auth в SSH, без первой привязки * глобально * вашего сервера Linux к Kerberos (через 'sssd' и по умолчанию'/etc/krb5.keytab'). И вы не знали о синтаксисе Kerberos SPN (Service Principal Name). Похоже, вы получили результат против всех разногласий, поздравлений ... –

 Смежные вопросы

  • Нет связанных вопросов^_^