web-dev-qa-db-fra.com

Comment Kerberos travaille-t-il avec SSH?

Supposons que j'ai quatre ordinateurs, ordinateur portable, serveur1, serveur2, serveur Kerberos:

  • Je me connecte à l'aide de Puty ou SSH de L à S1, donnant mon nom d'utilisateur/mot de passe
  • De S1, SSH SSH à S2. Aucun mot de passe n'est nécessaire car Kerberos vous authentifie

Décrivez tous les échanges importants de protocole SSH et KRB5: "l envoie le nom d'utilisateur à S1", "k envoie ... à S1", etc.

(Cette question est destinée à être modifiée par la communauté; veuillez l'améliorer pour le lecteur non expert.)

22
Phil

Premier identifiant:

  • L Envoie une demande d'authentification Nom d'utilisateur et SSH à S1
  • S1 renvoie des mécanismes d'authentification SSH disponibles, avec "mot de passe" comme l'un d'entre eux
  • L choix "mot de passe" et envoie le mot de passe simple à S1
  • S1 donne le nom d'utilisateur et le mot de passe à PAM Stack.
  • Sur S1, PAM (généralement pam_krb5 ou pam_sss) demande un ticket TGT (billetterie de billets) auprès de Kerberos KDC.
    1. S1 obtient un TGT.
      • Ancien style (sans prétorage): S1 envoie un AS-req et reçoit une AS-REP contenant le TGT.
      • Nouveau style (avec PRUETH): S1 utilise votre mot de passe pour chiffrer l'horodatage actuel et la fixe à l'AS-req. Le serveur décrypte l'horodatage et vérifie qu'il se trouve dans les délais impartis. Si le décryptage échoue, le mot de passe est immédiatement rejeté. Sinon, une TGT est renvoyée dans la AS-REP.
    2. S1 tente de déchiffrer la TGT en utilisant une clé générée à partir de votre mot de passe. Si le décryptage réussit, le mot de passe est accepté comme correct.
    3. Le TGT est stocké dans un cache de transmission nouvellement créé. (Vous pouvez inspecter le $KRB5CCNAME variable d'environnement pour trouver le CCACHE ou utiliser klist pour répertorier son contenu.)
  • S1 utilise PAM pour effectuer des contrôles d'autorisation (dépendants de la configuration) et ouvrez la session. [.____]
    • Si pam_krb5 est appelé en phase d'autorisation, il vérifie si ~/.k5login existe. Si tel est le cas, il doit énumérer le client du client Kerberos. Sinon, le seul directeur autorisé est username@DEFAULT-REALM.

Deuxième connexion:

  • S1 envoie Nom d'utilisateur et demande SSH Authn à S2
  • S2 renvoie les auteurs Mechs, l'un d'entre eux étant "GSSAPI-with-Mic" 1
  • S1 demande un billet pour Host/s2.example.com@EXAMPLE.COM, en envoyant un TGS-Req avec le TGT au KDC et en recevant une TGS-REP avec le ticket de service.
  • S1 génère une "demande AP-REQ" (demande d'authentification) et l'envoie à S2.
  • S2 tente de décrypter la demande. Si cela réussit, l'authentification est terminée. (PAM n'est pas utilisé pour l'authentification.)
    • D'autres protocoles tels que LDAP peuvent choisir de chiffrer davantage de transmission de données avec une "clé de session" qui a été incluse avec la demande; Cependant, SSH a déjà négocié sa propre couche de cryptage.
  • Si l'authentification réussit, S2 utilise PAM pour effectuer des contrôles d'autorisation et ouvrir la session, comme S1.
  • Si le renvoi de capitalisation a été activé et que le TGT a le drapeau "transférable", S1 demande une copie de la TGT de l'utilisateur (avec l'ensemble de drapeau "transféré") et l'envoie à S2, où il est stocké sur un nouveau CCACHE. Cela permet de récursive les connexions authentifiées par Kerberos.

Notez que vous pouvez également obtenir des TGT localement. Sur Linux, vous pouvez le faire en utilisant kinit, puis connectez-vous à l'aide de ssh -K. Pour Windows, si vous êtes connecté à un domaine de l'annonce Windows, Windows vous fait pour vous; Sinon, mit kerberos peut être utilisé. Puty 0.61 prend en charge à l'aide des deux fenêtres (SSPI) et MIT = == (GSSAPI), bien que vous ne comprenez manuellement (délégation) manuellement.


1gssapi-keyex est également possible mais n'a pas été accepté dans OpenSSH officiel.

28
user1686

Pour mettre la longue histoire courte: idéalement, les billets Kerberos doivent être obtenus sur votre terminal (L), avec la commande kinit ou dans le cadre de la séquence de connexion locale dans une configuration dite "Single Sign-On". . Les systèmes distants (S1, S2) seraient alors accessibles sans invites de mot de passe. Un accès en chaîne (L → S1 → S2) serait possible en utilisant une technique appelée "transfert de ticket". Une telle configuration nécessite notamment que la KDC soit directement accessible à partir du terminal (L).

L'autre réponse par Grawity explique cette approche en détail.

0
yrk