分散サービス用の Kerberos プリンシパル名

分散サービス用の Kerberos プリンシパル名

Kerberos (v5) プリンシパル名の一般的な形式は次の 2 つです。

username[/instance]@REALM
service/fully-qualified-domain-name@REALM

複数のポート上に存在する可能性があるサービスについては、次のようなものも見かけました。

service/fully-qualified-domain-name:port@REALM

現在 Kerberos 化されている社内アプリケーションがあり、サービス プリンシパルに名前を付ける方法を理解したいと思っています。サービスは分散されており、複数のサブドメインの複数のマシンのそれぞれで複数のインスタンスが実行されています。

例えば、私のドメイン名がゾンボそして、私の Kerberos 化されたサービス「tenaciousd」は、マシン「www1」から「www5」で実行されます。さらに、各マシンには、よく知られているポート (たとえば、25001 から 25010) に 10 個のインスタンスがあります。

つまり、基本的にすべて同じサーバーのインスタンスが 50 個あるので、負荷を分散したり、新しいバージョンを段階的に展開したりすることができます。

さて、Kerberos でサービス プリンシパルに名前を付けるにはどうすればよいでしょうか。最も一般的な形式であるように、サービスを実行しているホストごとに 1 つずつ名前を指定する必要がありますか。

tenaciousd/[email protected]
tenaciousd/[email protected]
tenaciousd/[email protected]
tenaciousd/[email protected]
tenaciousd/[email protected]

それとも、サービス インスタンスごとに 1 つのサービス プリンシパルを持つ方がよいのでしょうか (またその理由は何でしょうか)?

tenaciousd/www1.zombo.com:[email protected]
tenaciousd/www1.zombo.com:[email protected]
tenaciousd/www1.zombo.com:[email protected]
...
tenaciousd/www5.zombo.com:[email protected]

最後に、よりシンプルに思えますが、あまり一般的ではない、サービス プリンシパルを 1 つだけ持つ場合はどうでしょうか。

[email protected]

問題になるかどうかはわかりませんが、Kerberos 化されたサービス (およびクライアント) は、Cyrus SASL、GNU GSSAPI、および MIT Kerberos 5 を使用します。SASL API は、サービス名に加えて「完全修飾ドメイン名」パラメータを受け取りますが、これは Kerberos 以外のものもサポートしているためであり、実際の FQDN 以外のものを渡すこともできると考えられます。

私が見つけたドキュメントのほとんどは、各サービスがレルム内の単一のホストで実行されるか、少なくともクライアントがどのサービス インスタンスに接続するかを非常に重視することを前提としています。私の場合、クライアントの観点からはサービスはすべてほぼ同じなので、ここでのベスト プラクティスは何でしょうか。

答え1

一意でないもの (つまり、まったく同じ機能を実行する複製されたサービス) の場合、通常は 1 つの共通サーバー プリンシパルを共有します。これは、たとえば外部エンティティが同じドメイン名を参照する場合に、その錯覚を維持するため、うまく機能します。

また、ユーザーがインスタンス 1 からインスタンス 49 に切り替える場合、有効なチケットがすでにあるため、別の Kerberos ハンドシェイクを実行する必要はありません。インスタンスごとに新しいチケットを取得する必要なく、そのチケットを使用して任意のインスタンスに認証します。

したがって、私は次のように使用します:

tenaciousd/[email protected]

このサービスの主な名前として、www.example.com がクライアントによるこのサービスのアドレス指定方法であると仮定します。

関連情報