# Copyright SG6 - Soluciones Globales en Seguridad de la Informacion # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys import ldap #----------------------------- INFORMACION A MODIFICAR ------------------# #Nombre del grupo de usuarios que podran tener acceso a la conexion por VPN grupovpn="vpnusers" #Nombre del dominio de la organizacion, es decir DC=example,DC=com dominio="example.com" #Ruta del directorio donde se encuentran alojados los grupos, se podria utilizar la raiz del #directorio pero de esta manera es mas rapido. Tambien se puede usar la raiz si se desconoce #la ruta de los grupos y usuarios basegrupo="CN=Groups,DC=example,DC=com" #Ruta del directorio donde se enctran alojados los usuarios baseusuario="CN=Users,DC=example,DC=com" #Direccion del servidor controlador de dominio nombredc="server.example.com" #-------------------------- FIN INFORMACION A MODIFICAR ------------------# #El nombre del fichero con usuario y password se pasa como argumento por #parte de OpenVpn f=open(sys.argv[1],'r') contenido=f.readlines() f.close() #Se quita el \n porque si no, no se realizan correctamente las busquedas usuario=contenido[0][:-1] password=contenido[1][:-1] try: l = ldap.open(nombredc) #Conectando de esta manera se evitan problemas de que el CN del usuario #contenga acentos, ya que en el nombre de usuario no deben haber l.simple_bind_s(usuario+"@"+dominio,password) #El alcance de la busqueda es de subarbol scope=ldap.SCOPE_SUBTREE #Primero se obtiene el nombre completo del grupo del tipo CN=nombregrupo,CN=... filter = "(&(objectCategory=Group)(cn="+grupovpn+"))" res=l.search_s(basegrupo,scope,filter) #Se extrae la ruta del grupo a partir del record devuelto por la busqueda grupotemp=res[0][0] #Ahora el filtro busca entradas en el directorio con el nombre de usuario y que sea #miembro del grupo de usuarios de vpn filter="(&(objectCategory=user)(sAMAccountName="+usuario+")(memberOf="+grupotemp+"))" res=l.search_s(baseusuario,scope,filter) #Si ha encontrado entradas permite la conexion if len(res)==0: sys.exit(1) sys.exit(0); except ldap.LDAPError, error_message: sys.exit(1);