Esta página explica cómo configurar el Servidor de O3 para utilizar un servidor LDAP o Active Directory como soporte para la definición de usuarios y roles, así como manejar la autenticación al sistema.
Se asume que se tienen conocimientos básicos del protocolo LDAP, así como conocimientos de cómo configurar el servidor LDAP o Active Directory que se desea utilizar.
Se presentan algunos ejemplos que deben tomarse simplemente como guía ya que las estructuras de directorios presentadas pueden variar dependiendo del servidor LDAP utilizado.
Este instructivo se aplica a versiones 4.0.400 o posteriores
La seguridad del O3 Server
La seguridad del Servidor de O3 se basa sobre un módulo comúnmente conocido como RBAC (Role Based Access Control).
Este módulo define un conjunto de repositorios que son los encargados de almacenar los diferentes elementos involucrados en la seguridad del servidor - usuarios, roles, atributos, asociaciones entre ellos, etc.
Es posible elegir diferentes implementaciones de estos repositorios de modo que los datos puedan ser leídos desde diferentes servidores y utilizando tecnologías diferentes.
O3 incluye una implementación de este módulo para poder conectarse a servidores de directorio tales como LDAP y Active Directory.
Configurando el Servidor de O3
La elección de qué implementación de los repositorios de RBAC usar se realiza en el archivo GServer.properties que puede encontrarse en la carpeta <O3>/jboss/server/default/ideasoft-o3
Este archivo define un conjunto de properties que permiten indicar el repositorio que debe utilizarse.
#RBAC Repositories Configuration #rbac.roleRepository = com.ideasoft.rbac.repository.impl.jndi.JndiRoleRepository #rbac.userRepository = com.ideasoft.rbac.repository.impl.jndi.JndiUserRepository #rbac.raAssignmentRepository = com.ideasoft.rbac.repository.impl.jndi.JndiRAAssignmentRepository #rbac.loginService = com.ideasoft.rbac.repository.impl.jndi.JndiLoginService
La distribución de O3 incluye estas properties comentadas, tal como puede verse por los caracteres "#" al principio de cada línea. Para poder activar el uso de LDAP o Active Directory es necesario quitar esos caracteres del principio de cada línea de modo que queden de la siguiente forma:
#RBAC Repositories Configuration rbac.roleRepository = com.ideasoft.rbac.repository.impl.jndi.JndiRoleRepository rbac.userRepository = com.ideasoft.rbac.repository.impl.jndi.JndiUserRepository rbac.raAssignmentRepository = com.ideasoft.rbac.repository.impl.jndi.JndiRAAssignmentRepository rbac.loginService = com.ideasoft.rbac.repository.impl.jndi.JndiLoginService
Nota
Si lo único que se desea es validar los usuarios contra LDAP o Active Directory, teniendo los roles definidos en la base de datos de O3, sólo deberá descomentarse las líneas que especifican el rbac.loginService y rbac.userRepository. Si no se habilita el rbac.userRepository todos los usuarios deberán existir tanto en LDAP como en la base de datos de O3.
Además de habilitar el uso de implementaciones alternativas de los repositorios de RBAC, es necesario configurar una serie de parámetros que cada mecanismo (LDAP o Active Directory) requieren para su correcto funcionamiento.
Estas configuraciones específicas para cada servidor se indican en un archivo adicional que se encuentra en la carpeta <O3>/jboss/server/default/ideasoft-o3/config/rbac
El nombre del archivo de configuración a utilizar se indica también en el GServer.properties que puede encontrarse en la carpeta <O3>/jboss/server/default/ideasoft-o3 mediante la siguiente property:
jndi.cfg.filename = JndiConfiguration-SunONE.properties
La distribución de O3 incluye dos archivos de ejemplo JndiConfiguration-MS.properties y JndiConfiguration-SunONE.properties para Microsoft Active Directory y SunONE Directory Server respectivamente. Al final de este documento se pueden ver estos ejemplos.
Estos archivos definen los siguientes parámetros:
Parámetro |
Descripción |
---|---|
java.naming.provider.url |
Indica la ruta al servidor donde se encuentran los repositorios. Esta ruta es de la forma ldap://<host>:<port> |
java.naming.factory.initial |
Indica el nombre de la clase java que implementa el Contexto Inicial. Este es un parámetro del sistema que no debe cambiarse a menos que se indique lo contrario. El valor por defecto de esta property es "com.sun.jndi.ldap.LdapCtxFactory" |
java.naming.security.authentication |
Indica el mecanismo de autenticación. Este es un parámetro del sistema que no debe cambiarse a menos que se indique lo contrario. El valor por defecto de esta property es "simple" |
browseUserDN |
Distinguished Name del usuario que utiliza el sistema para obtener las listas de usuarios, roles, etc. |
browseUserPassword.plain |
Contraseña del usuario indicado en el parámetro browseUserDN. El valor de esta property se ingresa como texto plano y una vez que el servidor se reinicia ésta es cambiada por la property browseUserPassword cuyo valor será encriptado en forma automática por el servidor |
roleDefAttributeID |
Nombre del atributo que deben tener las entradas en el directorio que representan roles |
roleDefValueAttributeID |
Valor que debe tener el atributo roleDefAttributeID para ser considerado un rol |
roleNameAttributeID |
Atributo que se va a utilizar para recuperar el nombre del rol |
roleSearchBaseDN |
DN a partir del cual se buscarán los roles |
userDefAttributeID |
Nombre del atributo que deben tener las entradas en el directorio que representan usuarios |
userDefValueAttributeID |
Valor que debe tener el atributo userDefAttributeID para ser considerado un usuario |
userNameAttributeID |
Atributo que se va a utilizar para recuperar el nombre del usuario |
userSearchBaseDN |
DN a partir del cual se buscarán los usuarios |
userRolesAttributeID |
Nombre del atributo multivaluado que contiene la lista de los roles que tiene asignado el usuario |
Nota
Para el caso en que la lista de roles indicada por la property userRolesAttributeID sea una lista de DN (Distinguished Name) en lugar de los nombres de los roles directamente, es necesario especificar el atributo dereferenceRoleAttribute, el cual indica el atributo a partir del cual se va a obtener el nombre del rol. En este caso, el valor de dereferenceRoleAttribute y el de roleNameAttributeID deben coincidir para que funcione correctamente la asignación de roles a usuarios.
Nota
Para que la validación de usuarios sea exitosa es necesario que éstos tengan definidos el atributo "dn"
Ejemplos de Archivos de Configuración
Ejemplo de Archivo de configuración para Microsoft Active Directory
#Microsoft - Active Directoy Configuation file java.naming.provider.url = ldap://dataserver:389 userRolesAttributeID = memberOf dereferenceRoleAttribute = cn #Browse user's DN (used to bind to the Directory) #Option 1: User Principal Name (username@domain) #browseUserDN = o3user@radiusserver.ideasoft.com #browseUserPassword.plain = ???????? #Option 2: DN (Distinguished Name) browseUserDN = CN=O3User, OU=People, DC=radiusserver, DC=ideasoft, DC=com browseUserPassword.plain = ???????? #Roles's Entry definition roleDefAttributeID = objectclass roleDefValueAttributeID = group roleNameAttributeID = cn roleSearchBaseDN = ou=Roles, dc=radiusserver, dc=ideasoft, dc=com #User's Entry definition userDefAttributeID = objectclass userDefValueAttributeID = user userNameAttributeID = sAMAccountName userSearchBaseDN = ou=People, dc=radiusserver, dc=ideasoft, dc=com
Ejemplo de Archivo de configuración para SunONE Directory Server
#Sun ONE Directory Server Configuation file java.naming.provider.url = ldap://dataserver:51685 userRolesAttributeID = nsrole dereferenceRoleAttribute = cn #Browse user's DN (used to bind to the Directory) browseUserDN = uid=admin, cn=directory administrators, dc=ideasoft browseUserPassword.plain = ???????? #Roles's Entry definition roleDefAttributeID = objectclass roleDefValueAttributeID = ldapsubentry roleNameAttributeID = cn roleSearchBaseDN = ou=People, dc=ideasoft #User's Entry definition userDefAttributeID = objectclass userDefValueAttributeID = person userNameAttributeID = uid userSearchBaseDN = ou=People, dc=ideasoft