IBM Integration Bus - Seguridad de Servicios Web - Autenticación utilizando LDAP

...

En este artículo detallaremos el procedimiento para configurar el mecanismo de autenticación de un Servicio de Integración (SOAP) desarrollado con IBM Integration Toolkit valiéndonos de la información alojada en un servicio de directorio LDAP.

Información del servicio de directorio

Antes de comenzar con las configuraciones dentro del servidor Integration Bus, será necesario establecer y validar la información requerida para acceder al servicio LDAP, en nuestro caso utilizaremos un servicio de Microsoft Active Directorio en Windows 2012, pero se podría utilizar cualquier otro servicio compatible con LDAP V3 como OpenLDAP.

Parámetro Valor Observaciones
Nombre de host msad12.mgdevelopers.com Nombre de host donde se encuentra instalado el servicio de Active Directory.
Puerto 349 Puerto de acceso al servicio LDAP, el puerto estándar del protocolo es 349.
Base DN OU=Blog, DC=mgdevelopers, DC=com Nombre distinguido que define la posición del "árbol" del servicio de directorio que se deben tener en cuenta para esta configuración.
Grupo de usuarios autorizados CN=Autorizados, OU=Grupos, OU=Blog, DC=mgdevelopers, DC=com Nombre distinguido (DN) correspondiente al grupo cuyos miembros serán quienes tengan permisos para consumir el Servicio Web.
Nombre de usuario de acceso al directorio CN=ldap_binduser, OU=Cuentas de Servicio, OU=Blog, DC=mgdevelopers, DC=com Nombre distinguido (DN) del usuario que será utilizado por el Integration Bus para establecer la conexión con el servicio de directorio.
Contraseña password Contraseña correspondiente al usuario de acceso al directorio.

Con el fin de validar la información de acceso definida previamente se considera conveniente realizar una conexión de prueba al servicio de directorio utilizando un cliente LDAP.

Pantalla 1 - Conexión de prueba al servicio de directorio utilizando un cliente LDAP
Conexión de prueba al servicio de directorio utilizando un cliente LDAP

Creación de un perfil de seguridad en Integration Bus 9

Antes de habilitar la seguridad en un flujo de mensajes es necesario crear un Perfil de Seguridad ("Security Profile") en el nodo de integración, que en nuestro caso nos permitirá definir un servicio de directorio LDAP como proveedor de seguridad externo con fines de autenticación y autorización.

Creación del perfil de seguridad utilizando Integration Explorer

Seguiremos los siguientes pasos para crear un nuevo perfil de seguridad asociado a un servicio de directorio LDAP:

  1. Acceder a la propiedades del nodo de integración.
  2. Seleccionar la sección Security and Policy en el panel izquierdo.
  3. Presionar el botón Security Profiles.
  4. Propiedades del nodo de integración
    Pantalla 2 - Propiedades del nodo de integración
  5. Presionar Add para agregar un nuevo perfil
  6. Perfiles de seguridad
    Pantalla 3 - Perfiles de seguridad
  7. Seleccionar el nombre del perfil y presionar la techa de función F2 para editar y asignarle un nuevo nombre, en nuestro caso el nombre será MGDevelopersLDAP.
  8. Completar los campos del nuevo perfil de seguridad de acuerdo a los valores de acceso al servicio de directorio, el valor de los atributos se resumen en la siguiente tabla:
  9. Parámetro Valor Observaciones
    Authentication LDAP Estableciendo este atributo con el valor LDAP se indica que los requerimientos hacia los flujos de mensajes (o nodos de entrada) que utilicen este perfil deberán ser autenticados utilizando un servicio de directorio LDAP.
    AuthenticationConfig Este valor se establecerá automáticamente.
    Mapping NONE Este atributo se suele establecer en otro valor cuando es necesario realizar una correlación de información para llamar al proveedor externo de seguridad, por ejemplo cuando se utilizan extensiones de WS-Security como WS-Trust.
    MappingConfig No aplica
    Authorization LDAP Estableciendo este atributo con el valor LDAP se indica que los usuarios que realizan los requerimientos deben ser parte de un grupo determinado.
    AuthorizationConfig Este valor se establecerá automáticamente.
    Propagation TRUE Especifica si la propagación de identidades se realizará en los nodos de entrada y de salida.
    Reject Empty Password TRUE Especifica si es necesario rechazar la autenticación de un requerimiento con contraseña vacía, sin pasarla al servicio de directorio LDAP.
    Password Value PLAIN Especifica cómo se tratan las contraseñas cuando entran dentro del flujo de mensajes.
    LDAP Host ldap://msad12.mgdevelopers.com:389 Se debe establecer un valor con el formato ldap[s]://server[:port], donde:
    • ldap: es un valor fijo que especifica el protocolo
    • s: (valor opcional) se debe especificar si se accederá al servicio de directorio LDAP utilizando SSL
    • server: nombre del host o dirección IP del servidor LDAP que se va a contactar.
    • port: (valor opcional) se debe especificar el puerto donde atiende el servicio LDAP. El valor predeterminado es 389 (no SSL). Para servidores LDAP con SSL habilitado, normalmente el puerto es 636.
    LDAP baseDN OU=Blog, DC=mgdevelopers, DC=com Se debe establecer el nombre distinguido (DN) a partir del cual se construirá el nombre de usuario o se realizará la búsqueda del usuarios en el servicio de directorio.
    LDAP uid attr sAMAccountName Permite definir el atributo del esquema LDAP con el que se debe correlacionar el nombre de usuario.
    LDAP search scope [En blanco - Toma valor por omisión] Especifica si se debe realizar una búsqueda base o de subárbol. Si se define base, la autenticación es más rápida porque el nombre distinguido (DN) del usuario se construirá a partir de los valores atr_uid, el nombre de usuario y baseDN. Si se selecciona sub, se debe realizar una búsqueda para poder resolver el nombre distinguido (DN) de los usuarios. El valor predeterminado es sub.
    LDAP group baseDN CN=Autorizados, OU=Grupos, OU=Blog, DC=mgdevelopers, DC=com Se debe establecer con el nombre distinguido (DN) del grupo del que los usuarios deben ser miembros para que se los considere autorizados.
    LDAP group member attr [En blanco - Toma valor por omisión] El atributo del grupo utilizado para filtrar la búsqueda. De manera predeterminada se buscan los miembros en los atributos member y uniquemember.

    Nuevo perfil de seguridad MGDevelopersLDAP
    Pantalla 4 - Nuevo perfil de seguridad MGDevelopersLDAP
  10. Presionar Finish en el diálogo de configuración de perfiles de seguridad para el nodo seleccionado.
  11. Presionar Ok en el diálogo de propiedades del nodo seleccionado.
  12. Reiniciar el nodo de integración para estar seguros de que se tomarán los cambios realizados en la configuración.

Verificar los valores del perfil de seguridad creado

Luego de creado el perfil de seguridad ejecutaremos el comando mqsireportproperties para verificar los valores ingresados en la configuración:

mqsireportproperties <integration_node> -c SecurityProfiles -o <security_profile> -r

Donde integration_node debe ser el nombre del nodo de integración utilizado (IB9NODE) y security_profile será el nombre del perfil de seguridad creado anteriormente (MGDevelopersLDAP), el resultado de la ejecución del comando debería ser similar al siguiente:

[root@localhost bin]# mqsireportproperties IB9NODE -c SecurityProfiles -o MGDevelopersLDAP -r

SecurityProfiles
  MGDevelopersLDAP
    authentication='LDAP'
    authenticationConfig='ldap://msad12.mgdevelopers.com:389/OU=Blog,DC=mgdevelopers,DC=com?sAMAccountName'
    authorization='LDAP'
    authorizationConfig='ldap://msad12.mgdevelopers.com:389/CN=Autorizados,OU=Grupos,OU=Blog,DC=mgdevelopers,DC=com'
    idToPropagateToTransport='Message ID'
    keyStore='Reserved for future use'
    mapping='NONE'
    mappingConfig=''
    passwordValue='PLAIN'
    propagation='TRUE'
    rejectBlankpassword='TRUE'
    transportPropagationConfig=''
    trustStore='Reserved for future use'

BIP8071I: Successful command completion.

Configuración de la identidad utilizada para acceder al servicio de directorio LDAP

En general los servicios de directorio no permiten ser consultados por usuarios anónimos, por ello será necesario configurar las credenciales de un usuario autorizado para acceder al mismo utilizando el protocolo LDAP. Para llevar a cabo esta tarea utilizaremos el comando mqsisetdbparms de la siguiente forma:

mqsisetdbparms <integration_node> -n ldap::<servidor_ldap> -u <nombre_usuario_DN> -p <contraseña>

Donde integration_node debe ser nuevamente el nombre del nodo de integración utilizado (IB9NODE), servidor_ldap debe ser el nombre de host donde atiende el servicio de directorio (msad12.mgdevelopers.com) y nombre_usuario_DN será el nombre distinguido (DN) de un usuario con permiso de lectura en el directorio (CN=ldap_binduser, OU=Cuentas de Servicio, OU=Blog, DC=mgdevelopers, DC=com) cuya contraseña se deberá indicar en el parámetro contraseña.

Nota: es posible especificar el valor LDAP reemplazando el nombre de host en el parámetro servidor_ldap, de esta forma se estará definiendo las credenciales por omisión que utilizará un flujo de integración cuando requiera acceso a un servicio de directorio y no se hayan configurado credenciales específicas.

[root@localhost bin]# mqsisetdbparms IB9NODE -n ldap::msad12.mgdevelopers.com -u "CN=ldap_binduser,OU=Cuentas de Servicio,OU=Blog,DC=mgdevelopers,DC=com" -p password
BIP8071I: Successful command completion.

Crear un Servicio de Integración de pruebas

A continuación, y pensando en que el lector podría estar dando sus primeros pasos en la plataforma, describiremos la secuencia de pasos para crear un Servicio de Integración que luego utilizaremos para probar el funcionamiento del mecanismo de autenticación:

  1. Iniciar IBM Integration Toolkit en un nuevo Workspace.
  2. Seleccionar la opción New Integration Service para iniciar el asistente de creación de un nuevo servicio de integración.
  3. Definir un nombre para el servicio (MGDevelopersService) e indicar que se creará una nueva interfaz mediante la opción Create a new service interface.
  4. Presionar Finish para crear el servicio.
  5. Creación de un nuevo servicio de integración
    Pantalla 5 - Creación de un nuevo servicio de integración
  6. Mantendremos la definición de servicio creada por el asistente ya que aunque es simple nos servirá para probar el mecanismo de autenticación, luego abriremos la operación operation1.
  7. Definición del nuevo servicio
    Pantalla 6 - Definición del nuevo servicio
  8. Agregaremos un nodo de transformación del tipo Mapping lo uniremos a los nodos de entrada y de salida como muestra la siguiente imagen.
  9. Flujo de integración correspondiente a operation1
    Pantalla 7 - Flujo de integración correspondiente a operation1
  10. Al intentar abrir el nodo Mapping se presenta un asistente para crear un archivo de correlación con el cual trabaja este tipo de nodos, mantendremos los valores por defecto y presionaremos Next.
  11. Asistente para nuevo nodo de correlación
    Pantalla 8 - Asistente para nuevo nodo de correlación
  12. En la próxima pantalla del asistente indicaremos operation1 como mensaje de entrada y operation1Response como mensaje de salida, de esta forma podremos retornar una salida como transformación de la entrada, luego presionaremos Finish para concluir con el asistente.
  13. Selección de los mensajes de entrada y salida
    Pantalla 9 - Selección de los mensajes de entrada y salida
  14. En la interfaz de correlación agregaremos una función de concatenación (fn:concat) y uniremos el elemento input1 con la entrada de la función y output1 con la salida.
  15. Adición de función de concatenación
    Pantalla 10 - Adición de función de concatenación
  16. Luego como muestra la siguiente imagen, agregaremos el elemento IdentitySourceToken como otra entrada a la función fn:concat, el elemento IdentitySourceToken albergará el nombre de usuario luego que configuremos la seguridad en el flujo de mensajes.
  17. Adición del elemento IdentitySourceToken a la función de concatenación
    Pantalla 11 - Adición del elemento IdentitySourceToken a la función de concatenación
  18. Para finalizar la configuración del nodo, configuraremos los parámetros de la función de acuerdo a la siguiente imagen, el objetivo es retornar a la salida una transformación de los datos de entrada que incluya el nombre de usuario utilizado para autenticar el requerimiento.
  19. Configuración de la función de concatenación
    Pantalla 12 - Configuración de la función de concatenación
  20. Grabar el archivo de correlación y luego el flujo de integración.

Crear un archivo BAR para alojar al Servicio de Integración

Una vez creado el Servicio de Integración tendremos que crear un archivo BAR que lo contenga para poder desplegarlo en un servidor de integración:

  1. Crear un nuevo archivo BAR utilizando la acción File > New > BAR file.
  2. Creación de un nuevo archivo BAR
    Pantalla 13 - Creación de un nuevo archivo BAR
  3. Especificar en la solapa Prepare del archivo BAR el servicio MGDevelopersService creado anteriormente.
  4. Presionar Build an Save... para crear el archivo de despliegue y grabarlo.
  5. Construcción del archivo BAR
    Pantalla 14 - Construcción del archivo BAR
  6. Presionar el botón derecho sobre el archivo BAR y presionar Deploy... para desplegar el diálogo de despliegue.
  7. Seleccionar el servidor de integración (default) donde se desea desplegar el servicio y presionar Finish para dar comienzo al proceso de despliegue.
  8. Despliegue del Servicio de Integración
    Pantalla 15 - Despliegue del Servicio de Integración

Prueba del Servicio de Integración antes de requerir autenticación

Antes de configurar la seguridad del flujo de integración será conveniente probar el funcionamiento del Servicio de Integración utilizando un cliente de Servicios Web como SoapUI.

Si el Integration Bus se encuentra configurado por omisión, entonces podremos acceder a la definición del servicio utilizando la url http://server:7800/nombre-servicio?wsdl, en nuestro caso la dirección será http://iib9.mgdevelopers.com:7800/MGDevelopersService?wsdl.

Pantalla 16 - Definición del servicio publicado por el Integration Bus
Definición del servicio publicado por el Integration Bus

Luego crearemos un proyecto en SoapUI utilizando la definición del servicio verificada anteriormente y dejando que se creen los requerimientos de ejemplo para las operaciones.

Pantalla 17 - Creación del proyecto en SoapUI
Creación del proyecto en SoapUI

Una vez creado el proyecto ejecutaremos un requerimiento sobre el servicio y deberíamos obtener un respuesta similar a la siguiente:

Pantalla 18 - Requerimiento de prueba sobre el Servicio de Integración
Requerimiento de prueba sobre el Servicio de Integración

Configuración de la seguridad en el archivo BAR

Es momento de configurar la seguridad en el flujo de integración, para ello será necesario editar el archivo BAR creado anteriormente y luego abrir la solapa Manage.

Cuando se crea un Nodo de Integración, se generan de manera predeterminada un conjunto de políticas (Provider Policy Set) y enlaces (Provider Policy Set Binding) denominados WSS10Default. Estas configuraciones contienen una política de seguridad que especifica que un token correspondiente al nombre de usuario está presente en los requerimientos de entrada al Servicio de Integración, mas específicamente a los nodos SOAPInput del flujo de mensajes asociado al Servicio de Integración.

Seleccionaremos el flujo de integración que posee el nombre del servicio (MGDevelopersService > Resources > MGDevelopersService .msgflow) y estableceremos las propiedades Provider Policy Set, Provider Policy Set Binding y Security Profile Name con los valores de la siguiente tabla:

Parámetro Valor Observaciones
Provider Policy Set WSS10Default Conjunto de políticas predeterminado.
Provider Policy Set Binding WSS10Default Enlaces de conjunto de políticas predeterminado.
Security Profile Name MGDevelopersLDAP Nombre del perfil de seguridad que se encuentra asociado al servicio de directorio LDAP.
Pantalla 19 - Configuración de seguridad dentro del archivo BAR
Creación del proyecto en SoapUI

Una vez realizada la modificación en el archivo BAR será necesario guardar los cambios y desplegarlo nuevamente en el servidor de integración.

Error de seguridad al intentar ejecutar el Servicio de Integración

Sin realizar modificaciones en el proyecto creado en SoapUI para realizar pruebas sobre el Servicio de Integración nos encontraremos con un error de seguridad al intentar ejecutar el requerimiento que anteriormente funcionaba correctamente:

Requerimiento de prueba sobre el Servicio de Integración
Pantalla 20 -Requerimiento fallido sobre el Servicio de Integración que requiere autenticación

Configuración de seguridad en SoapUI para llamar al servicio

Una vez que configuramos la seguridad en el Servicio de Integración ya no podremos comunicarnos sin especificar credenciales válidas.

Tendremos que seguir los próximos pasos para configurar el proyecto SoapUI y poder enviar una solicitud válida al Servicio de Integración:

  1. En primer lugar tendremos que abrir el proyecto SoapUI (MGDevelopersProject en nuestro caso), abrir la solapa WS-Security Configurations y presionar el botón + para agregar una nueva configuración de seguridad aplicable a los requerimientos.
  2. En el diálogo de nueva configuración especificaremos un nombre (MGDevelopersSecurity) y presionaremos OK para agregar la configuración.
  3. Nueva configuración de seguridad saliente (WS-Security)
    Pantalla 21 - Nueva configuración de seguridad saliente (WS-Security)
  4. Seleccionaremos la configuración creada anteriormente y presionaremos el botón + para agregar una nueva entrada en la configuración.
  5. En el diálogo de nueva entrada especificaremos el valor Username como tipo de entrada y presionaremos OK para agregarla a la configuración.
  6. Diálogo de nueva entrada de la configuración de seguridad (WS-Security)
    Pantalla 22 - Diálogo de nueva entrada de la configuración de seguridad (WS-Security)
  7. En la nueva entrada especificaremos el nombre de usuario en el campo Username y su contraseña en el campo Password, luego será necesario especificar el valor PasswordText en el campo PasswordType para que la contraseña sea visible en el requerimiento.
  8. Configuración de las credenciales en la entrada de seguridad
    Pantalla 23 - Configuración de las credenciales en la entrada de seguridad
  9. Luego será necesario ir a la configuración del requerimiento, abrir la solapa de autorización (Auth) en el panel inferior y seleccionar Add New Authorization... para establecer la configuración de seguridad utilizada por el requerimiento.
  10. Configuración de seguridad a nivel de requerimiento
    Pantalla 24 - Configuración de seguridad a nivel de requerimiento
  11. En el diálogo se debe seleccionar el valor Basic como tipo de seguridad y luego se debe presionar Ok para establecer la configuración.
  12. Diálogo para agregar configuraciones de seguridad al requerimiento
    Pantalla 25 - Diálogo para agregar configuraciones de seguridad al requerimiento
  13. Luego será necesario seleccionar la configuración creada anteriormente (MGDevelopersSecurity) en el campo Outgoing WSS de la configuración de seguridad propia del requerimiento.
  14. Configuración de seguridad saliente del requerimiento
    Pantalla 26 - Configuración de seguridad saliente del requerimiento

Ejecución del servicio utilizando la configuración de seguridad

Luego de realizadas todas las configuraciones precedentes, estamos en condiciones de ejecutar un requerimiento al Servicio de Integración, esperar que nos valide las credenciales y nos retorne el resultado.

Pantalla 27 - Ejecución del requerimiento en SoapUI incorporando las credenciales del usuario
Ejecución del requerimiento en SoapUI incorporando las credenciales del usuario

Conclusiones

En este artículo describimos el procedimiento detallado para configurar la autenticación de un Servicio de Integración de manera que se requiera la incorporación de credenciales válidas en las peticiones de los clientes. Para validar las credenciales se realizó la configuración de un perfil de seguridad dentro de Integration Bus asociado a un servicio de directorio LDAP versión 3.

Es importante destacar que, al realizar la configuración de seguridad para requerir la autenticación de los requerimientos, no se afectó de ninguna forma la implementación del Servicio de Integración, de esta forma la configuración de seguridad se mantiene a nivel de protocolo separada de las tareas de construcción y diseño dentro del Toolkit.

Referencias


Modificado por última vez en Domingo, 05 Julio 2015 05:02