17

JAAS を使用して、Windows Kerberos チケット キャッシュを使用する Java アプリケーションでシングル サインオンを有効にしています。jaas.conf 構成ファイルは次のようになります。

LoginJaas {
  com.sun.security.auth.module.Krb5LoginModule required
  useTicketCache=true
  doNotPrompt=true
  debug=true;
};

これにより、Jaas LoginContext を作成し、ユーザーの Kerberos チケットを正常に取得できます。このチケットを JMI を使用してサーバー アプリケーションに送信します。ただし、Kerberos チケットが実際に Active Directory によって作成されたものであることをサーバー上で確認することはできません。

現時点では、サーバー プリンシパル (KerberosTicket.getServer()) 名のレルム部分にドメイン名が含まれているかどうかを確認するだけで、非常に安全でないチケットの検証を行っています。しかしもちろん、誰でも同じレルム名で独自の Kerberos サーバーをセットアップし、そのチケットを使用してアプリケーションを開始することができます。

私が見つけたアイデアの 1 つは、Kerberos チケットを使用して Active Directory LDAP に対して認証することでした。残念ながら、Windows 7 を使用しており、Kerberos チケットを再利用して LDAP に対して認証する方法は、レジストリ エントリを設定する場合にのみ機能します ( http://java.sun.com/j2se/1.5.0/docs/guide/security/jgssを参照)。 /tutorials/Troubleshooting.htmlで allowtgtsessionkey を検索します)。これはユーザーにとって受け入れがたいことです。

Active Directory サーバーに対してチケットを検証する方法はありますか? KerberosTicket.getServer() チケットがサーバーのチケットと等しいかどうかを確認する方法があると思いますが、その方法がわかりません。更新: KerberosTicket().getServer() は、サーバー チケット名とレルムのみを含む KerberosPrincipal のみを返すため、検証には適していません。

助けてくれてありがとう、メミンガー

4

2 に答える 2

5

おっしゃったように、これを解決する適切な方法は、サービスを Kerberos 化することです。これは、Kerberos プロトコルの要点です (サーバーに対してクライアントを認証します)。チケットの再利用は、セキュリティ上の問題になるため、正確には機能しません。Kerberos サービスは「Active Directory にログイン」する必要はなく、AD との共有キーが必要なだけです。

ところで、JAAS を使用して SSO を取得するには、その allowtgtsessionkey を設定する必要があります。Windows ではそれを回避する方法はありません。

于 2010-08-25T23:28:36.917 に答える
2

誰もこれに対する答えを本当に知っているようには見えないので、サーバー アプリケーションから適切な Kerberos サービスを作成する必要があると思います。Active Directory 自体にログインし、ServicePrincipalName 属性が適切に設定されているもの。HTTP に対する SPNEGO のようなものです。そのための良い出発点は、SourceForge ( http://spnego.sourceforge.net/ )の SPNEGO サーブレット フィルターです。http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.htmlも、サービス ログオンの方法の非常に良い例です。残念ながら、これはレジストリ キーで同じ問題を引き起こすため、ネイティブ SSPI API を使用してサービスの Kerberos チケットを取得する方法が Java またはコマンドライン ユーティリティにあるという新しい質問を投稿しました。.

于 2010-02-18T15:21:52.353 に答える