La herramienta ldapwhoami implementa la operación whoami a través de LDAP. Esta función, que tal vez parezca algo trivial, simplemente muestra el DN (Distinguished Name) efectivo del usuario con el cual se ha autenticado en un servidor LDAP. Sin embargo, más allá de esto puede ser de gran utilidad para verificar el correcto funcionamiento de un servidor LDAP y comprobar la validez de las credenciales de un determinado usuario.



Supongamos que deseamos verificar el funcionamiento de un servidor OpenLDAP y su mecanismo de autenticación de usuarios. La herramienta ldapwhoami admite las mismas opciones que todas las herramientas del paquete openldap. Esto significa que con la opción -H se puede especificar la URI correspondiente al servidor LDAP y con -D el DN del usuario con el que se desea autenticar:

root@debian8:~# ldapwhoami -H ldap://localhost:389 -W -D "uid=test,ou=people,dc=linuxito,dc=com"
Enter LDAP Password: 
dn:uid=test,ou=people,dc=linuxito,dc=com
root@debian8:~# echo $?
0

La opción -W indica que la contraseña del usuario se solicite de manera interactiva. Esto es útil para evitar que se divulgue la contraseña en el historial (por ejemplo ~/.bash_history), lo cual es peligroso, tal como sucede cuando se utiliza la opción -w en su lugar, con la contraseña como parámetro.

Se observa que el código de retorno en caso de éxito es 0, y la salida es simplemente el DN del usuario con el cual se ha autenticado.

En caso de ingresar una contraseña incorrecta, o utilizar un usuario inexistente, la respuesta es la misma (código de retorno 49):

root@debian8:~# ldapwhoami -H ldap://localhost:389 -W -D "uid=test,ou=people,dc=linuxito,dc=com"
Enter LDAP Password: 
ldap_bind: Invalid credentials (49)
root@debian8:~# echo $?
49
root@debian8:~# ldapwhoami -H ldap://localhost:389 -W -D "uid=xxx,ou=people,dc=linuxito,dc=com"
Enter LDAP Password: 
ldap_bind: Invalid credentials (49)
root@debian8:~# echo $?
49

Salida verbosa

La opción -v produce una salida más verbosa:

root@debian8:~# ldapwhoami -v -H ldap://localhost:389 -W -D "uid=test,ou=people,dc=linuxito,dc=com"
ldap_initialize( ldap://localhost:389/??base )
Enter LDAP Password: 
dn:uid=test,ou=people,dc=linuxito,dc=com
Result: Success (0)

Modo debug

Para obtener aún más información y detalle acerca de la conexión, bind y operación whoami, lo que permitiría diagnosticar en profundidad todo el circuito en caso de fallos, es posible recurrir al modo "debug", especificando un nivel de debug.

Por ejemplo, la misma conexión exitosa con nivel de debug 1:

root@debian8:~# ldapwhoami -d 1 -v -H ldap://localhost:389 -W -D "uid=test,ou=people,dc=linuxito,dc=com"
ldap_url_parse_ext(ldap://localhost:389)
ldap_initialize( ldap://localhost:389/??base )
ldap_create
ldap_url_parse_ext(ldap://localhost:389/??base)
Enter LDAP Password: 
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP localhost:389
ldap_new_socket: 3
ldap_prepare_socket: 3
ldap_connect_to_host: Trying 127.0.0.1:389
ldap_pvt_connect: fd: 3 tm: -1 async: 0
attempting to connect: 
connect success
ldap_open_defconn: successful
ldap_send_server_request
ber_scanf fmt ({it) ber:
ber_scanf fmt ({i) ber:
ber_flush2: 58 bytes to sd 3
ldap_result ld 0x64d750 msgid 1
wait4msg ld 0x64d750 msgid 1 (infinite timeout)
wait4msg continue ld 0x64d750 msgid 1 all 1
** ld 0x64d750 Connections:
* host: localhost  port: 389  (default)
  refcnt: 2  status: Connected
  last used: Thu Apr  5 09:25:32 2018


** ld 0x64d750 Outstanding Requests:
 * msgid 1,  origid 1, status InProgress
   outstanding referrals 0, parent count 0
  ld 0x64d750 request count 1 (abandoned 0)
** ld 0x64d750 Response Queue:
   Empty
  ld 0x64d750 response count 0
ldap_chkResponseList ld 0x64d750 msgid 1 all 1
ldap_chkResponseList returns ld 0x64d750 NULL
ldap_int_select
read1msg: ld 0x64d750 msgid 1 all 1
ber_get_next
ber_get_next: tag 0x30 len 12 contents:
read1msg: ld 0x64d750 msgid 1 message type bind
ber_scanf fmt ({eAA) ber:
read1msg: ld 0x64d750 0 new referrals
read1msg:  mark request completed, ld 0x64d750 msgid 1
request done: ld 0x64d750 msgid 1
res_errno: 0, res_error: <>, res_matched: <>
ldap_free_request (origid 1, msgid 1)
ldap_parse_result
ber_scanf fmt ({iAA) ber:
ber_scanf fmt (}) ber:
ldap_msgfree
ldap_extended_operation
ldap_send_initial_request
ldap_send_server_request
ber_scanf fmt ({it) ber:
ber_scanf fmt ({) ber:
ber_flush2: 32 bytes to sd 3
ldap_result ld 0x64d750 msgid -1
wait4msg ld 0x64d750 msgid -1 (timeout 100000 usec)
wait4msg continue ld 0x64d750 msgid -1 all 1
** ld 0x64d750 Connections:
* host: localhost  port: 389  (default)
  refcnt: 2  status: Connected
  last used: Thu Apr  5 09:25:32 2018


** ld 0x64d750 Outstanding Requests:
 * msgid 2,  origid 2, status InProgress
   outstanding referrals 0, parent count 0
  ld 0x64d750 request count 1 (abandoned 0)
** ld 0x64d750 Response Queue:
   Empty
  ld 0x64d750 response count 0
ldap_chkResponseList ld 0x64d750 msgid -1 all 1
ldap_chkResponseList returns ld 0x64d750 NULL
ldap_int_select
read1msg: ld 0x64d750 msgid -1 all 1
ber_get_next
ber_get_next: tag 0x30 len 55 contents:
read1msg: ld 0x64d750 msgid 2 message type extended-result
ber_scanf fmt ({eAA) ber:
read1msg: ld 0x64d750 0 new referrals
read1msg:  mark request completed, ld 0x64d750 msgid 2
request done: ld 0x64d750 msgid 2
res_errno: 0, res_error: <>, res_matched: <>
ldap_free_request (origid 2, msgid 2)
ldap_parse_result
ber_scanf fmt ({iAA) ber:
ber_scanf fmt (x) ber:
ber_scanf fmt (}) ber:
ldap_parse_extended_result
ber_scanf fmt ({eAA) ber:
ber_scanf fmt (O) ber:
dn:uid=test,ou=people,dc=linuxito,dc=com
ldap_msgfree
ldap_err2string
Result: Success (0)
ldap_free_connection 1 1
ldap_send_unbind
ber_flush2: 7 bytes to sd 3
ldap_free_connection: actually freed

Los niveles de debug no funcionan como en la mayoría de las aplicaciones, donde a mayor nivel mayor cantidad de información, sino que diferentes niveles vuelcan diferente información. La tabla 7.1 de la Guía de Administración de OpenLDAP detalla el tipo de información que muestra cada nivel de debug soportado:

NivelDescripción
-1toda la información disponible
0debug deshabilitado
1traza de llamadas a funciones
2manejo de paquetes
4debug de trazas en profundidad
8manejo de conexiones
16paquetes enviados y recibidos
32procesamiento de filtros de búsqueda
64procesamiento de configuraciones
128procesamiento de ACLs
256estadísticas sobre conexiones/operaciones/resultados
512estadísticas sobre logs
1024comunicación con shells
2048procesamiento de entradas (parsing)
16384procesamiento de sincronización de réplicas
32768sólo mensajes enviados al log

Referencias


Tal vez pueda interesarte


Compartí este artículo