martes, 27 de marzo de 2012

Exportando M$ Active Directory a MySQL

El siguiente script me ayudo para exportar las cuentas de Active Directoy a una base de datos en MySql. El problema y/o interés surgió debido a la implementación de otrs, una solución para la gestión de servicios IT y help desk, donde se pretendía centralizar las cuentas locales de Active Directory como clientes en el contexto de la aplicación (otrs).
Para la solución de este problema (pensando en la automatización) había que hacer dos cosas, llenar la tabla de clientes con los datos de cada cuenta en la base de datos y cambiar el tipo de autentificación usando ldap.

Requisitos:
  • awk
  • openLdap
  • mysql-client

Script: ldap2mysql.sh

#!/bin/bash
# Martin Edmundo 2012
# Orden del listado AD: sn, givename, userPrincipalName

#Inicialización de variables
dbUser="otrs";
dbPasswd="/Gvxsn1CFaj5Q";
dbName="otrs";
let _i=0;

searchBase="DC=PGJ,DC=MICH";
bindDistinguishedName="account@domain";
ldapPasswd="AcbjdaIQ6P/9g";
ldapHost="ldap://172.16.1.2";

apellido="";
nombre="";
user="";

#Leemos el arbol completo de usuarios
tree=`ldapsearch -x -z 0 -b $searchBase -D $bindDistinguishedName -w $ldapPasswd "(objectclass=user)" -H $ldapHost | egrep "userPrincipalName|givenName|sn\: "`

#Leemos el ultimo customer_id que se tiene en la BD, sobre ese se incrementaran los siguientes INSERT
let lastCustomer=`mysql -u $dbUser -p$dbPasswd --database=$dbName --execute="select max(customer_id) as a from customer_user" | awk 'BEGIN{FS="\n"; RS="\n\n";}{print $2}' `

echo "$tree" | (
while read linea;
do
te_conozco=`echo $linea | cut -c1-2`
if [ "$te_conozco" = "sn" ]; then
apellido=`echo $linea | cut -f2 -d" "`;
fi
if [ "$te_conozco" = "gi" ]; then
nombre=`echo $linea | cut -f2 -d" "`;
fi
if [ "$te_conozco" = "us" ]; then
user=`echo $linea | cut -f2 -d" "`;
if [ "$apellido" != "" -a "$nombre" != "" ]; then
let lastCustomer+=1;
uid=`echo $user | cut -f1 -d"@"`
daleDale=`mysql -u $dbUser -p$dbPasswd --database=$dbName --execute="select login from customer_user where login='$uid'" | awk 'BEGIN{FS="\n"; RS="\n\n";}{print $2}'`

#Si la cuenta no esta ya registra en DB, se hace el INSERT
if [ "$daleDale" == "" ]; then
let _i+=1;
sqlStm="INSERT INTO customer_user (login, email, customer_id, pw, title, first_name, last_name, valid_id, create_time, create_by, change_time, change_by) VALUES ('$uid', 'informaticapgjmich@gmail.com',$lastCustomer, '', 'Importado por openLdap', '$nombre', '$apellido', 1, '2012-03-23 20:00:00', 1, '2012-03-23 20:00:00', 1)";
#echo "$sqlStm"
mysql -u $dbUser -p$dbPasswd --database=$dbName --execute="$sqlStm";
echo "*** Importado ($_i): $uid"
fi

fi
apellido="";
nombre="";
fi
done
)

3 comentarios:

Anónimo dijo...

Y como configuraste el otrs para que autenticara a través del AD??

Martin Edmundo dijo...

hola

Disculpa la tardanza, segui el siguiente manual:
http://doc.otrs.org/1.3/en/html/ldap-integration.html

$Self->{'AuthModule::LDAP::Host'} = '[AD_server]';
Ahi puse la IP del AD

$Self->{'AuthModule::LDAP::BaseDN'} = '[base_dn]';
El dominio algo en forma de 'dc=example, dc=com';

$Self->{'AuthModule::LDAP::UID'} = 'sAMAccountName';
Identico

$Self->{'AuthModule::LDAP::SearchUserDN'} = '[user_dn]';
$Self->{'AuthModule::LDAP::SearchUserPw'} = '[password]';
Usuario y contraseña

Unknown dijo...

Excelente tu post, lo he probado y si funciona, solo tengo una pequeña pregunta: al realizar la consulta LDAP con ldapsearch solo me devuelve 43 usuarios y mi directorio activo tiene cerda de 2100 usuarios. Como podría hacer que me devuelva el total de usuarios a la variable tree?
Gracias de entemano.