viernes, 29 de enero de 2010

OpenVPN auth con ldap y perl

Hace un tiempo hice una vpn con openvpn en mi casa la cual documente en el post Creando vpns con openvpn y ahora estoy tratando de hacer que el openvpn autentique contra un directorio openldap ademas de la autenticacion tls por paquete que ya nos provee.


Encontré el plugin openvpn-auth-ldap que funcionaba bien pero que tenia un problemita no soportaba grupos posix solo grupos rf2307bis los cuales tienen que estar especificados con su basedn completo como por ejemplo: cn=grupete,ou=grupos,dc=localdomain.

Para eso estuve investigando y me encontré con un comentario en un issue de del site de google code en el cual tenemos una alternativa mucho mejor a usar este plugin.

Así que el script que aparece en ese comentario lo modifique para poder hacer un debuging de porque no me andaba y quedo así:

#!/usr/bin/perl -w
open(LOGFILE,'>>/tmp/auth-ldap.log');
use Net::LDAP;
use strict;
my $ldap;
my $result;
my $opt_host = "ldap.localdomain";
my $opt_user = $ENV{'username'};
my $opt_passwd = $ENV{'password'};
my $opt_group = "cn=sisVPN,ou=groups,dc=localdomain";
my $opt_binddn = "uid=".$opt_user.",ou=People,dc=localdomain";
print LOGFILE "User: " . $opt_user . "\n";
print LOGFILE "Group: " . $opt_group . "\n";
print LOGFILE "BindDN: " . $opt_binddn . "\n";
$ldap = Net::LDAP->new($opt_uri) or die("connect $opt_uri failed!");
$result = $ldap->bind($opt_binddn, password=>$opt_passwd);
$result->code and die($result->error);
$result = $ldap->search(base=>$opt_group, filter=>"(&(memberUid=$opt_user))");
$result->code();
my $var_count = $result->count;
print LOGFILE "Count: " . $var_count . "\n";
if ($var_count == 1) { exit 0; }
unless($var_count){ exit 1; }
close(LOGFILE);

Para poder hacerlo andar hay que instalar los paquetes perl y p5-perl-ldap, originalmente este escript lo instale en un pfsense con:

#pkg_add -r perl p5-perl-ldap

Pero para poder instalarlo en debian solo hay que ejecutar:

#apt-get install perl p5-perl-ldap

Luego el script hay que grabarlo como: /etc/openvpn/auth-ldap.pl (debian) o
/var/etc/auth-ldap.pl (pfsense) y en el archivo de configuración del servidor de nuestra vpn auntar a el con la directiva: auth-user-pass-verify /el_path_que_sea/auth-ldap.pl via-env

Tengan en cuenta que van a tener que modificar los basedn del group y del binddn que estén usando en su ldap.

Por ultimo en nuestros archivos de configuración de los clientes tenemos que agregar la directiva: auth-user-pass

Y listo el pollo!

Bookmark and Share

2 comentarios:

Anónimo dijo...

Hola.

Estoy probando el script sobre un LDAP de Novell.
No logro comprender del todo la vatiable "$opt_uri", con lo cual no se exactamente que cambio realizar allí.

Si me puede ayudar te agradecería

Daedalus dijo...

opt_uri viene de la sigla "unified resource identifier" pero en este caso se puede llamar simplemente "host", lo cambie en el post para que no quepan dudas.

Publicar un comentario en la entrada