Active Directory を使用した Java アプリケーション認証

Active Directory を使用した Java アプリケーション認証

私は、Active Directory を使用してユーザーを認証する必要があるサードパーティの Java アプリケーションに取り組んでいます。

このアプリケーションは RHEL 6.5 でホストされており、LDAP を使用して Windows Active Directory で認証します。AD サーバーはセットアップされており、アプリケーションの以前のバージョン (統合を有効にするように構成されていた) で正常に動作しています。

新しいバージョンでは、ベンダーは、AD サーバーに接続するためにアプリケーション ファイルを変更/構成するためのいくつかの手順を示しており、認証に役立つことが期待されています。

アプリケーションには CAS というコンポーネントがあり、現在、認証ハンドラーとしてデータベースを使用するように構成されています。資格情報 (ユーザー名: abcd、パスワード: samplepswd) を入力すると、正常にログインできます。

ビジネス要件は、LDAP を使用した Active Directory による認証であるため、CAS プロパティ ファイルを変更する必要があります。製品ベンダーの指示に従って、ldap を使用するために次のプロパティを変更しました。

authenticationHandler.type=ldap
ldapSSLConfig.enabled=false
ldapContextSource.url=ldap://sample.ADserver.example.net:389
ldapContextSource.userDn=abcd
ldapContextSource.password=samplepswd
ldapAuthenticationHandler.filter=uid=%u
ldapAuthenticationHandler.searchBase=OU=DEF,OU=PQR,OU=XYZ,DC=ADserver,DC=example,DC=net

また、casAuthConfig xml ファイルで次のプロパティを変更する必要があります (匿名検索はサポートされていないため)。1. anonymousReadOnly、値は false に設定 2. java.naming.security.authentication、値は simple に設定

SSL 経由で ldap を使用することもできますが、現在は使用していません。ただし、SSL を使用する場合は、次のプロパティに追加の変更を加える必要があります。

ldapSSLConfig.enabled=true
ldapSSLConfig.trustStorePath=/home/dir1/subdir1/subdir2/keystorename.keystore
ldapSSLConfig.trustStoreType=jceks

これらは、私たち (クライアント) 側で行われた唯一の構成変更であり、実際に行われた唯一の変更です。別のユーザーを除いて、サーバー (AD サーバー) には何も追加/変更されていませんが、既存のセットアップには影響しません。

変更を反映するために cas を再起動すると、入力した値は正しいにもかかわらず、資格情報が間違っているというエラーが発生します。

2015-09-16 12:12:30,558 INFO [com.pqr.cas.authentication.support.DelegatingAuthenticationHandler] - Authenticating credential using handler 
com.pqr.cas.adaptors.ldappwd.BindLdapAuthenticationHandler 
2015-09-16 12:12:30,558 DEBUG [com.pqr.cas.authentication.support.DelegatingAuthenticationHandler] - credentials.getUsername() = abcd
2015-09-16 12:12:30,672 INFO [com.pqr.cas.adaptors.ldappwd.BindLdapAuthenticationHandler] - Search for cn=abcd returned 0 results. 
2015-09-16 12:12:30,672 INFO [org.jasig.cas.authentication.AuthenticationManagerImpl] - AuthenticationHandler: 

com.pqr.cas.authentication.support.DelegatingAuthenticationHandler failed to authenticate the user which provided the following credentials: 

[username: abcd] 
2015-09-16 12:12:30,676 ERROR [org.jasig.cas.integration.restlet.TicketResource] - error.authentication.credentials.bad 
org.jasig.cas.ticket.TicketCreationException: error.authentication.credentials.bad 
at org.jasig.cas.CentralAuthenticationServiceImpl.createTicketGrantingTicket_aroundBody10(CentralAuthenticationServiceImpl.java:423) 

どなたかこの問題を解決できる方はいらっしゃいますか? あるいは正しい方向を指し示していただけますか? どのようなご助力でも大歓迎です。

ありがとう。

答え1

設定にいくつか潜在的な問題があるようです。

ldapContextSource.userDn と .password は、アプリケーションにログインするすべてのユーザー アカウントを読み取る権限を持つ AD のアカウントの資格情報である必要があります。.userDn 値は実際には LDAP DN 文字列 (.searchBase の場合と同様) になることを意図していますが、Active Directory の場合は代わりに userPrincipalName (UPN) 属性を使用できます (通常、これは[メールアドレス])。したがって、不正な資格情報エラーは、ユーザー名を何も修飾していないことが原因である可能性があります。アカウントは AD 内で移動でき、アプリケーションは気にしないため (変更される DN とは異なります)、LDAP 統合には常に UPN を使用することを好みます。

それが解決されると仮定すると、.filter 値もおそらく問題になるでしょう。uid 属性は Active Directory に存在しますが、通常はデフォルトで設定されていません。ユーザーがユーザー名だけでログインできるようにしたい場合は、代わりに sAMAccountName に変更する必要があります。

LDAP over SSL (LDAPS) を有効にするには、Java アプリケーションが信頼するドメイン コントローラに TLS 証明書が必要です。自己署名証明書の場合は、その証明書をドキュメントで参照されているキーストアに入れる必要があります。パブリックまたは内部 PKI インフラストラクチャから生成された証明書の場合は、そのインフラストラクチャの CA 証明書チェーンを追加する必要があります。また、LDAP サーバーの URI を ldap に変更する必要があります。s:// およびポート 636 (またはグローバル カタログ検索の場合は 3269)。

関連情報