複数の LDAP サーバー間のセキュリティー・フェイルオーバー
WebSphere® Application Server セキュリティーは、複数の Lightweight Directory Access Protocol (LDAP) ホスト間のフェイルオーバーを試行するように構成することができます。
カレント・アクティブ LDAP サーバーが使用不可である場合、WebSphere Application Server セキュリティーは指定されているホスト・リストの最初の使用可能な LDAP ホストに対してフェイルオーバー を試みます。 複数の LDAP サーバーは、同じマスター LDAP サーバーのレプリカであってもかまいません。または、同じ LDAP データ交換フォーマット (LDIF) ファイルからインポートしたデータを含む、同じスキーマを持つ任意の LDAP ホ ストであってもかまいません。
フェイルオーバーが起こる場合は常に、WebSphere Application Server セキュリティーは指定されているホスト ・リスト の最初の使用可能な LDAP サーバーを使用します。例えば、4 つの LDAP サーバーが、L1、L2、L3、L4 の順で構成されている場合、L1 がプ ライマリー LDAP サーバーとして処理されます。接続の優先順位は、L1 から L4 です。例えば、WebSphere Application Server セキュリティーが現在 L4 に接続されており、フェイルオーバーまたは再接続が必要な場合、WebSphere Application Server セキュリティーは まず、L1、L2、その後に L3 の順で、接続が成功するまで接続を試みます。
現行の LDAP ホスト名は WebSphere Application Server のログ・ファイル SystemOut.log のメッセージ SECJ0419I に記録されます。プライマリー LDAP ホストに再 接続したい場合は、WebSphere Application Server MBean メソッド resetLDAPBindInfo を、入力データに null,null を使用して実行します。
複数の LDAP ホスト間で LDAP のフェイルオーバーを構成するには、wsadmin または ConfigService を使用して、 バックアップ LDAP ホストを含める必要があります。含めることのできるバックアップ LDAP ホストの数には制限はありません。 管理コンソールに表示される LDAP ホストは、プライマリー LDAP ホストで、これは、security.xml の LDAP ホスト・リストの最初の項目です。
WebSphere Application Server セキュリティーのデフォルトのレルム名は、管理コンソールに表示されるプライマリー LDAP ホスト名です。このレルム名には、末尾にコロンとポート番号 (ポート番号がある場合) が付いています。ただし、カスタム・プロパティーの com.ibm.websphere.security.ldap.logicRealm を追加して、デフォルトのセキュリティー・レルム名をオーバーライドすることができます。 logicRealm 名を使用して、インターオペラビリティーと後方互換性を実現するために、セルごとに独自の LDAP ホストを構成し、LDAP ホストの動的追加や除去を柔軟に実行できるようにします。 前のインストールからのマイグレーションを行う場合、 新しい logicRealm 名は 管理セキュリティー が 再度使用可能になるまで有効になりません。 論理レルムをサポートしない前のリリースとの互換性を確保するために、 logicRealm 名は前のインストールで使用したものと同じである必要があります (末尾のコロンとポート番号を含む LDAP ホスト名)。
ロード・バランサー (WebSphere Application Server への変換を透過的に実行する) を使用して単一ホスト名を複数の IP アドレスに関連付けることにより LDAP フェイルオーバーが構成された場合、無効なパスワードを入力すると、LDAP バインドの再試行が複数回発生する場合があります。WebSphere Application Server は再試行し、ロード・バランサーは要求を複数のレプリカにルーティングします。 デフォルト設定では、LDAP バインドの再試行の回数は関連付けられる IP アドレスの数より 1 回多くなります。 これは、単一の無効なログインの試行により LDAP アカウントがロックされる場合があることを示します。com.ibm.websphere.security.registry.ldap.singleLDAP カスタム・プロパティーが false に設定されている場合には、LDAP バインド呼び出しは再試行されません。
wsadmin コマンドを使用してバックエンド LDAP サーバー・ホスト名を登録することで LDAP フェイルオーバーが構成されている場合には、 com.ibm.websphere.security.ldap.retryBind プロパティーに false を設定します。
#---------------------------------------------------------------
# Main
# This is a bi-modal script: it can be included in the wsadmin
# command invocation like this:
# wsadmin -f LDAPAdd.jacl ldaphost 800
#
# or the script can be sourced from the wsadmin command line:
# wsadmin> source LDAPAdd.jacl
# wsadmin> LDAPAdd ldaphost 800
#
# The script expects some parameters:
# arg1 - LDAP Server host name
# arg2 - LDAP Server port number
#---------------------------------------------------------------
if { !($argc == 2)} {
puts ""
puts "LDAPAdd: This script requires 2 parameters: LDAP server host name and LDAP server port number"
puts "For example: LDAPAdd ldaphost 389"
puts ""
return;
}
else {
set ldapServer [lindex $argv 0]
set ldapPort [lindex $argv 1]
LDAPAdd $ldapServer $ldapPort
return;
}
proc LDAPAdd {ldapServer ldapPort args} {
global AdminConfig AdminControl ldapServer ldapPort
set ldapServer lindex $args 0
set ldapPort lindex $args 1
global ldapUserRegistryId
# Get the LDAP user registry object from the security configuration
if { catch {$AdminConfig list LDAPUserRegistry} result } {
puts stdout "¥$AdminConfig list LDAPUserRegistry caught an exception $result¥n"
return
}
else {
if {$result != {}} {
set ldapUserRegistryId lindex $result 0
}
else {
puts stdout "¥$AdminConfig list LDAPUserRegistry caught an exception $result¥n"
return;
}
}
# Set the host and port values in Attrs2
set Attrs2 list list hosts list list list host
$ldapServer
list port $ldapPort
# Modify the LDAP configuration host object
$AdminConfig modify $ldapUserRegistryId $Attrs2
$AdminConfig save
}
#---------------------------------------------------------------
# Add ldap hostname and port
# wsadmin -f LDAPAdd.py arg1 arg2
#
# The script expects some parameters:
# arg1 - LDAP Server hostname
# arg2 - LDAP Server portnumber
#---------------------------------------------------------------
import java
#-------------------------------------------------------
# get the line separator and use to do the parsing
# since the line separator on different platform are different
lineSeparator = java.lang.System.getProperty('line.separator')
#-------------------------------------------------------------------------------
# add LDAP host
#-------------------------------------------------------------------------------
def LDAPAdd (ldapServer, ldapPort):
global AdminConfig, lineSeparator, ldapUserRegistryId
try:
ldapObject = AdminConfig.list("LDAPUserRegistry")
if len(ldapObject) == 0:
print "LDAPUserRegistry ConfigId was not found¥n"
return
ldapUserRegistryId = ldapObject.split(lineSeparator)[0]
print "Got LDAPUserRegistry ConfigId is " + ldapUserRegistryId + "¥n"
except:
print "AdminConfig.list('LDAPUserRegistry') caught an exception¥n"
try:
secMbeans = AdminControl.queryNames('WebSphere:type=SecurityAdmin,*')
if len(secMbeans) == 0:
print "Security Mbean was not found¥n"
return
secMbean = secMbeans.split(lineSeparator)[0]
print "Got Security Mbean is " + secMbean + "¥n"
except:
print "AdminControl.queryNames('WebSphere:type=SecurityAdmin,*') caught an exception¥n"
attrs2 = [["hosts", [[["host", ldapServer], ["port", ldapPort]]]]]
try:
AdminConfig.modify(ldapUserRegistryId, attrs2)
try:
AdminConfig.save() print "Done setting up attributes values for LDAP User Registry"
print "Updated was saved successfully¥n"
except:
print "AdminConfig.save() caught an exception¥n"
except:
print "AdminConfig.modify(" + ldapUserRegistryId + ", " + attrs2 + ") caught an exception¥n"
return
#-------------------------------------------------------------------------------
# Main entry point
#-------------------------------------------------------------------------------
if len(sys.argv) < 2 or len(sys.argv) > 3:
print("LDAPAdd: this script requires 2 parameters: LDAP server hostname and LDAP server port number¥n")
print("e.g.: LDAPAdd ldaphost 389¥n")
sys.exit(1)
else:
ldapServer = sys.argv[0]
ldapPort = sys.argv[1]
LDAPAdd(ldapServer, ldapPort)
sys.exit(0)