Настройка SSH-Jumphost | Proxyjump с freeIPA и билетами Kerberos

Настройка SSH-Jumphost | Proxyjump с freeIPA и билетами Kerberos

Я хочу настроить бастион (ssh jumphost) для доступа к сети за брандмауэром. Оба сервера находятся в домене freeIPA. Клиент — это пользовательская машина, не входящая в домен IPA.

Интернет/клиент —> SSH-Jumphost —> login-node

Мой план состоит в том, чтобы войти в ssh-jumphost, используя учетные данные, чтобы получить действительный TGT, а затем подключиться по ssh к серверу входа, используя полученный билет Kerberos.

Поэтому я изменил конфигурации ssh и sshd, в которых разрешено пересылать учетные данные GSSAPI.

# IPA-related configuration changes to sshd_config

PubkeyAuthentication yes
KerberosAuthentication no
GSSAPIAuthentication yes
UsePAM yes
ChallengeResponseAuthentication yes
AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys
AuthorizedKeysCommandUser nobody

# added
PasswordAuthentication no

И конфигурация ssh:

# IPA-related configuration changes to ssh_config
#
PubkeyAuthentication yes
GlobalKnownHostsFile /var/lib/sss/pubconf/known_hosts
#VerifyHostKeyDNS yes

# assumes that if a user does not have shell (/sbin/nologin),
# this will return nonzero exit code and proxy command will be ignored
Match exec true
        ProxyCommand /usr/bin/sss_ssh_knownhostsproxy -p %p %h


#added 
GSSAPIAuthentication yes
GSSAPITrustDns yes
GSSAPIKeyExchange yes
GSSAPIRenewalForcesRekey yes
Host login
    GSSAPIDelegateCredentials yes

Если я использую ssh для входа в jumphost, я получаю действительный билет kerberos. После этого я могу войти в ssh без ввода учетных данных

 $(j@client) ssh jumphost
(USER@jumphost) password:
$(@jumphost) klist
Credential-Cache: KCM:1791600003:19884
Standard-Principal: user@REALM

Valid starting       Expires              Service principal
22.11.2022 17:45:38  23.11.2022 17:35:51  krbtgt/REALM@REALM
$(@jumphost) ssh login

$(@login) klist
Credential-Cache: KCM:1791600003:66779
Standard-Principal: user@REALM

Valid starting       Expires              Service principal
22.11.2022 17:47:51  23.11.2022 17:35:51  krbtgt/REALM@REALM

Но если я попытаюсь сделать это за один шаг, мне придется вводить свои учетные данные для каждого сервера:

$(@client) ssh -J jumphost login
(user@jumphost) Password: 
(user@login) Password: 

После этого я вошел в систему и у меня есть действительный TGT, но я не понимаю, зачем мне нужно вводить пароль дважды.

Я хочу, чтобы меня заставили ввести пароль только один раз.

Я также пробовал это с разными конфигурациями SSH на клиенте.

Host login
  User USER
  #GSSAPIAuthentication yes
  #GSSAPIDelegateCredentials yes
  HostName login
  ProxyJump USER@jumphost

С опциями GSSAPI и без них.

Host jumphost
  User USER
  HostName jumphost

Host login
  User USER
  #GSSAPIAuthentication yes
  #GSSAPIDelegateCredentials yes
  HostName login
  ProxyJump jumphost

С опциями GSSAPI и без них.

Все версии приводят к тому, что мне нужно дважды ввести свой пароль.

Что я упускаю?

Редактировать: Добавлен krb5.conf

#File modified by ipa-client-install

includedir /etc/krb5.conf.d/
includedir /var/lib/sss/pubconf/krb5.include.d/

[libdefaults]
  default_realm = RELAM
  dns_lookup_realm = true
  rdns = false
  dns_canonicalize_hostname = false
  dns_lookup_kdc = true
  ticket_lifetime = 24h
  forwardable = true
  udp_preference_limit = 0
  default_ccache_name = KEYRING:persistent:%{uid}


[realms]
  REALM = {
    pkinit_anchors = FILE:/var/lib/ipa-client/pki/kdc-ca-bundle.pem
    pkinit_pool = FILE:/var/lib/ipa-client/pki/ca-bundle.pem

  }

[domain_realm]
  .realm.com = REALM
  realm.com = REALM
  jumphost.realm.com = REALM

В каталоге /etc/krb5.conf.d находятся следующие файлы:

crypto-policies  freeipa  kcm_default_ccache  sssd_enable_idp

решение1

редактироватьПохоже, я ошибался :-)

Настройки SSH выглядят нормально. Я предполагаю, что выданный тикет не подлежит пересылке.

Цитатаman 5 krb5.conf:

Раздел Libdefaults

[...]
пересылаемый
Если этот флаг установлен, начальные тикеты по умолчанию будут пересылаемыми. Значение по умолчанию для этого флага — false.

решение2

Я думаю, вы не понимаете, что делает опция -J для ssh. Она использует хост перехода для создания сокетного соединения с конечным пунктом назначения для проксирования соединения, но это все еще исходный хост, который согласовывает ключи и аутентификацию с конечным пунктом назначения. Вам может повезти больше с чем-то вроде:

ssh -t jumphost 'ssh -t login'

Связанный контент