Java と Linux またはその他のプラットフォーム上の Active Directory の間で認証を実行するために使用できる 3 つの認証プロトコルがあります (これらは HTTP サービスに固有のものではありません)。
Kerberos - Kerberos はシングル サインオン (SSO) と委任を提供しますが、Web サーバーは IE を介して SSO を受け入れるために SPNEGO サポートも必要とします。
NTLM - NTLM は、IE (および適切に構成されている場合は他のブラウザー) を介した SSO をサポートします。
LDAP - LDAP バインドは、アカウント名とパスワードを単純に検証するために使用できます。
また、Windows SSP を呼び出す SAML を使用して Web サイトに SSO を提供する「ADFS」と呼ばれるものもあるため、実際には、上記の他のプロトコルのいずれかを使用するための回り道です。
各プロトコルには利点がありますが、経験則として、最大の互換性を得るには、一般的に「Windows と同じようにする」ことを試みる必要があります。それで、Windowsは何をしますか?
まず、サーバーが DC と通信する必要がなく、クライアントが Kerberos チケットをキャッシュできるため、2 台の Windows マシン間の認証では Kerberos が優先されます (また、Kerberos は委任をサポートするため)。
ただし、認証側の両方がドメイン アカウントを持っていない場合、またはクライアントが DC と通信できない場合は、NTLM が必要です。したがって、Kerberos と NTLM は相互に排他的ではなく、NTLM が Kerberos によって廃止されることはありません。実際、いくつかの点で、NTLM は Kerberos よりも優れています。Kerberos と NTLM について言及するときは、SPENGO と Integrated Windows Authentication (IWA) についても言及する必要があることに注意してください。IWA は、基本的に Kerberos または NTLM または SPNEGO が Kerberos または NTLM をネゴシエートすることを意味する単純な用語です。
資格証明を検証する方法として LDAP バインドを使用するのは効率的ではなく、SSL が必要です。しかし、最近まで Kerberos と NTLM の実装は困難であったため、LDAP をその場しのぎの認証サービスとして使用することが続いてきました。しかし、この時点では一般的に避けるべきです。LDAP は情報のディレクトリであり、認証サービスではありません。本来の目的で使用してください。
では、どのように Kerberos または NTLM を Java で、特に Web アプリケーションのコンテキストで実装するのでしょうか?
Quest Software や Centrify のように、特に Java に言及したソリューションを提供する大企業は数多くあります。これらは全社的な「アイデンティティ管理ソリューション」であるため、私は実際にコメントすることはできません.そのため、彼らのウェブサイトでマーケティングスピンを見るだけでは、どのプロトコルがどのように使用されているかを正確に知ることは困難です. 詳細については、彼らに連絡する必要があります。
標準 Java ライブラリは org.ietf.gssapi クラスを通じて Kerberos をサポートしているため、Java での Kerberos の実装はそれほど難しくありません。ただし、最近まで大きなハードルがありました。IE は未加工の Kerberos トークンを送信せず、SPNEGO トークンを送信します。しかし、Java 6 では SPNEGO が実装されています。理論的には、IE クライアントを認証できる GSSAPI コードを記述できるはずです。しかし、私はそれを試していません。Sun による Kerberos の実装は、何年にもわたってエラーの連続でした。そのため、この分野での Sun の実績に基づいて、その鳥を手にするまで SPENGO の実装について約束することはできません。
NTLM の場合、NTLM HTTP 認証サーブレット フィルターを持つ JCIFS と呼ばれる無料の OSS プロジェクトがあります。ただし、中間者方式を使用して、NTLMv2 で動作しない SMB サーバーで資格情報を検証します (これは徐々に必要なドメイン セキュリティ ポリシーになりつつあります)。そのため、JCIFS の HTTP フィルター部分は削除される予定です。JCIFS を使用して同じ手法を実装する多くのスピンオフがあることに注意してください。したがって、NTLM SSO をサポートすると主張している他のプロジェクトを見つけた場合は、詳細を確認してください。
Active Directory で NTLM クレデンシャルを検証する唯一の正しい方法は、セキュア チャネルを使用して NETLOGON 経由で NetrLogonSamLogon DCERPC 呼び出しを使用することです。そのようなことはJavaに存在しますか?はい。ここにあります:
http://www.ioplex.com/jespa.html
Jespa は、NTLMv2、NTLMv1、完全な整合性と機密性オプション、および前述の NETLOGON 資格情報の検証をサポートする 100% Java NTLM 実装です。また、HTTP SSO フィルター、JAAS LoginModule、HTTP クライアント、SASL クライアントとサーバー (JNDI バインディングを使用)、カスタム NTLM サービスを作成するための一般的な「セキュリティ プロバイダー」などが含まれます。
マイク