Reprise en ligne de sécurité fondée sur plusieurs serveurs LDAP
La sécurité de WebSphere Application Server peut être configurée de manière à ce que des tentatives de reprise en ligne soient effectuées entre plusieurs hôtes LDAP (Lightweight Directory Access Protocol).
Si le serveur LDAP actif n'est pas disponible, la sécurité de WebSphere Application Server tente d'effectuer un basculement vers le premier hôte LDAP disponible dans la liste des hôtes spécifiés. Les différents serveurs LDAP peuvent être des répliques du même serveur LDAP maître ou correspondre à n'importe quel hôte LDAP doté du même schéma qui contient des données importées à partir du même fichier LDIF (LDAP Data Interchange Format).
A chaque fois qu'une reprise en ligne se produit, la sécurité de WebSphere Application Server utilise toujours le premier serveur LDAP disponible dans la liste des hôtes spécifiés. Par exemple, si quatre serveurs LDAP sont configurés, soit dans l'ordre, L1, L2, L3 et L4, L1 est considéré comme étant le serveur LDAP principal. La préférence de connexion va de L1 à L4. Si, par exemple, la sécurité de WebSphere Application Server est connectée à L4 et qu'un basculement ou une reconnexion est nécessaire, cette fonction tente d'abord d'établir une connexion avec le serveur L1, puis avec le serveur L2 et enfin avec le serveur L3 jusqu'à ce que la connexion aboutisse.
Le nom d'hôte LDAP en cours est consigné dans le message SECJ0419I contenu dans le fichier journal de WebSphere Application Server, SystemOut.log. Si vous souhaitez vous reconnecter à l'hôte LDAP principal, exécutez la méthode de MBean WebSphere Application Server resetLDAPBindInfo avec null,null comme entrée.
Pour configurer la reprise en ligne LDAP sur plusieurs hôtes LDAP, vous devez utiliser wsadmin ou ConfigService pour inclure l'hôte LDAP de secours qui n'est pas limité en nombre. L'hôte LDAP qui s'affiche dans la console d'administration est l'hôte LDAP principal et le premier élément répertorié dans la liste des hôtes LDAP contenue dans le fichier security.xml.
Le nom de domaine de sécurité de WebSphere Application Server correspond par défaut au nom de l'hôte LDAP principal qui s'affiche dans la console d'administration. Il se termine par un signe deux-points et il est associé à un numéro de port (si ce dernier est défini). Toutefois, la propriété personnalisée com.ibm.websphere.security.ldap.logicRealm peut être ajoutée en remplacement du nom de domaine de sécurité par défaut. Utilisez le nom logicRealm pour configurer chaque cellule de sorte qu'elle possède son propre hôte LDAP pour l'interopérabilité et la compatibilité amont et qu'elle offre la souplesse nécessaire pour l'ajout ou la suppression dynamique de l'hôte LDAP. Si vous effectuez une migration à partir d'une installation précédente, le nouveau nom logicRealm n'est effectif qu'une fois la sécurité administrative réactivée. Pour être compatible avec une édition antérieure qui ne prend pas en charge le domaine logique, le nom logicRealm doit être identique à celui utilisé par l'installation précédente (le nom d'hôte LDAP suivi d'un signe deux-points associé à un numéro de port).
Quand la reprise en ligne LDAP est configurée en associant un seul nom d'hôte à plusieurs adresses IP via l'utilisation d'un équilibrage de charge (qui effectue cette conversion de façon transparente au niveau de WebSphere Application Server), la saisie d'un mot de passe non valide peut causer de multiples nouvelles tentatives de liaison LDAP. WebSphere Application Server fait une nouvelle tentative et l'équilibrage de charge achemine les demandes vers plusieurs serveurs secondaires. Avec les paramètres par défaut, le nombre de nouvelles tentatives de liaison LDAP est égal au nombre d'adresses IP associées plus un. Cela signifie qu'une seule tentative de connexion non valide peut causer le verrouillage du compte LDAP. Si la propriété personnalisée com.ibm.websphere.security.registry.ldap.singleLDAP est associée à la valeur false, les appels de liaison LDAP ne font pas l'objet d'une nouvelle tentative.
Lorsque la reprise en ligne LDAP est configurée via l'enregistrement de noms d'hôte de serveur LDAP dorsaux avec la commande wsadmin, associez la propriété com.ibm.websphere.security.ldap.retryBind à la valeur false.
#---------------------------------------------------------------
# Main
# Il s'agit d'un script bimodal : il peut être inclus dans
# l'appel de la commande wsadmin comme suit :
# wsadmin -f LDAPAdd.jacl ldaphost 800
#
# ou le script peut être obtenu à partir de la ligne de commande wsadmin :
# wsadmin> source LDAPAdd.jacl
# wsadmin> LDAPAdd ldaphost 800
#
# Le script attend des paramètres :
# 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
}
#---------------------------------------------------------------
# Ajout du nom d'hôte et du port LDAP
# wsadmin -f LDAPAdd.py arg1 arg2
#
# Le script attend des paramètres :
# arg1 - nom d'hôte du serveur LDAP
# arg2 - numéro de port du serveur LDAP
#---------------------------------------------------------------
import java
#-------------------------------------------------------
# obtention du séparateur de ligne et utilisation de celui-ci pour l'analyse
# étant donné qu'ils diffèrent selon les plateformes
lineSeparator = java.lang.System.getProperty('line.separator')
#-------------------------------------------------------------------------------
# ajout de l'hôte LDAP
#-------------------------------------------------------------------------------
def LDAPAdd (ldapServer, ldapPort):
global AdminConfig, lineSeparator, ldapUserRegistryId
try:
ldapObject = AdminConfig.list("LDAPUserRegistry")
if len(ldapObject) == 0:
print "LDAPUserRegistry ConfigId introuvable\n"
return
ldapUserRegistryId = ldapObject.split(lineSeparator)[0]
print "LDAPUserRegistry ConfigId obtenu " + ldapUserRegistryId + "\n"
except:
print "AdminConfig.list('LDAPUserRegistry') a détecté une exception\n"
try:
secMbeans = AdminControl.queryNames('WebSphere:type=SecurityAdmin,*')
if len(secMbeans) == 0:
print "Security Mbean introuvable\n"
return
secMbean = secMbeans.split(lineSeparator)[0]
print "Security Mbean obtenu " + secMbean + "\n"
except:
print "AdminControl.queryNames('WebSphere:type=SecurityAdmin,*') a détecté une exception\n"
attrs2 = [["hosts", [[["host", ldapServer], ["port", ldapPort]]]]]
try:
AdminConfig.modify(ldapUserRegistryId, attrs2)
try:
AdminConfig.save()
print "Définition de valeurs d'attributs terminée pour le registre utilisateur LDAP"
print "Mise à jour enregistrée\n"
except:
print "AdminConfig.save() a détecté une exception\n"
except:
print "AdminConfig.modify(" + ldapUserRegistryId + ", " + attrs2 + ") a détecté une exception\n"
return
#-------------------------------------------------------------------------------
# Point d'entrée principal
#-------------------------------------------------------------------------------
if len(sys.argv) < 2 or len(sys.argv) > 3:
print("LDAPAdd: ce script requiert deux paramètres : le nom du serveur LDAP et le numéro de port du serveur LDAP\n")
print("par ex.: LDAPAdd ldaphost 389\n")
sys.exit(1)
else:
ldapServer = sys.argv[0]
ldapPort = sys.argv[1]
LDAPAdd(ldapServer, ldapPort)
sys.exit(0)