web-dev-qa-db-ja.com

KerberosはSSHとどのように連携しますか?

ラップトップ、サーバー1、サーバー2、Kerberosサーバーの4台のコンピューターがあるとします。

  • PuTTYまたはSSHを使用してLからS1にログインし、ユーザー名/パスワードを指定します
  • S1からS2にSSHで接続します。 Kerberosが私を認証するのでパスワードは必要ありません

すべての重要なSSHおよびKRB5プロトコル交換について説明します。「Lはユーザー名をS1に送信します」、「Kは...をS1に送信します」など。

(この質問はコミュニティで編集することを目的としています。改善してください非専門家の読者向け。)

22
Phil

最初のログイン:

  • LはS1にユーザー名とSSH認証要求を送信します
  • S1は、「パスワード」をその1つとして使用可能なSSH認証メカニズムを返します。
  • Lは「パスワード」を選択し、プレーンなパスワードをS1に送信します
  • S1はPAMスタックにユーザー名とパスワードを提供します。
  • S1では、PAM(通常はpam_krb5またはpam_sss)がKerberos KDCにTGT(チケット許可チケット)を要求します。
    1. S1はTGTを取得します。
      • 古いスタイル(事前認証なし):S1はAS-REQを送信し、TGTを含むAS-REPを受信します。
      • 新しいスタイル(事前認証あり):S1はパスワードを使用して現在のタイムスタンプを暗号化し、それをAS-REQに添付します。サーバーはタイムスタンプを復号化し、それが許可されたタイムスキュー内にあることを確認します。復号化に失敗した場合、パスワードはすぐに拒否されます。それ以外の場合、TGTはAS-REPで返されます。
    2. S1は、パスワードから生成されたキーを使用してTGTを復号化しようとします。復号化が成功した場合、パスワードは正しいものとして受け入れられます。
    3. TGTは、新しく作成された資格情報キャッシュに保管されます。 ($KRB5CCNAME環境変数を調べてccacheを見つけるか、klistを使用してその内容を一覧表示できます。)
  • S1はPAMを使用して承認チェックを実行し(構成に依存)、セッションを開きます。
    • 承認段階でpam_krb5が呼び出されると、~/.k5loginが存在するかどうかが確認されます。存在する場合は、クライアントのKerberosプリンシパルをリストする必要があります。それ以外の場合、許可されるプリンシパルはusername@DEFAULT-REALMのみです。

2回目のログイン:

  • S1はS2にユーザー名とSSH認証リクエストを送信します
  • S2は利用可能な認証メカニズムを返します。そのうちの1つは「gssapi-with-mic」です。 1
  • S1は、TGTを含むTGS-REQをKDCに送信し、そこからサービスチケットを含むTGS-REPを受信することにより、Host/s2.example.com@EXAMPLE.COMのチケットを要求します。
  • S1は「AP-REQ」(認証要求)を生成し、それをS2に送信します。
  • S2は要求の復号化を試みます。成功すると、認証が行われます。 (PAMは認証に使用されません。)
    • LDAPなどの他のプロトコルは、リクエストに含まれていた「セッションキー」を使用して、さらにデータ転送を暗号化することを選択できます。ただし、SSHはすでに独自の暗号化レイヤーをネゴシエートしています。
  • 認証が成功した場合、S2はS1と同様に、PAMを使用して承認チェックを実行し、セッションを開きます。
  • 資格情報の転送が有効になっていて、TGTに「転送可能」フラグがある場合、S1はユーザーのTGTのコピーを要求し(「転送済み」フラグが設定されている)、それをS2に送信し、新しいccacheに格納されます。これにより、再帰的なKerberos認証ログインが可能になります。

ローカルでTGTを取得することもできます。 Linuxでは、kinitを使用してこれを実行してから、ssh -Kを使用して接続できます。 Windowsの場合、Windows ADドメインにログインすると、Windowsがそれを行います。それ以外の場合は、 MIT Kerberos を使用できます。 PuTTY 0.61は、Windows(SSPI)とMIT(GSSAPI)の両方の使用をサポートしていますが、手動で転送(委任)を有効にする必要があります。


1gssapi-keyexも可能ですが、公式OpenSSHには受け入れられませんでした。

28
user1686

要するに、Kerberosチケットは、kinitコマンドを使用するか、いわゆる「シングルサインオン」設定のローカルログインシーケンスの一部として、ターミナル(L)で取得するのが理想的です。 。リモートシステム(S1、S2)は、パスワードプロンプトなしでアクセスできます。連鎖アクセス(L→S1→S2)は、「チケット転送」として知られる手法を採用することで可能になります。このような設定では、特に、KDCが端末(L)から直接アクセスできる必要があります。

grawityによる他の回答は、このアプローチを詳細に説明しています。

0
yrk