Auth4openvpn pour openvpn

Auth4openvpn pour openvpn - VB/VBA/VBS - Programmation

Marsh Posté le 18-03-2013 à 13:47:52    

Salut à tous,
 
je viens à votre rencontre car j'ai un problème avec le plugin auth4openvpn.
Ce plugin sert à faire de l'authentification LDAP pour OpenVPN.
 
Mon problème, c'est que lorsque le plugin est appelé par openvpn lors de la connexion de l'utilisateur, j'ai une erreur dans l'observateur d’événement, tandis que si je lance le plugin via un cmd, pas de problème, l'observateur d’événement m'affiche une info avec le nom d'utilisateur.
 
Dans tous les cas l'authentification se fait bien.
 
Voici le détail de l'erreur :

Code :
  1. - <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  2. - <System>
  3.   <Provider Name="WSH" />
  4.   <EventID Qualifiers="49152">1</EventID>
  5.   <Level>2</Level>
  6.   <Task>0</Task>
  7.   <Keywords>0x80000000000000</Keywords>
  8.   <TimeCreated SystemTime="2013-03-18T10:28:52.000000000Z" />
  9.   <EventRecordID>6977</EventRecordID>
  10.   <Channel>Application</Channel>
  11.   <Computer>srv2008R2Hyperv</Computer>
  12.   <Security />
  13.   </System>
  14. - <EventData>
  15.   <Data>Auth4OpenVPN: 424, Objet requis</Data>
  16.   </EventData>
  17.   </Event>


 
J'ai tenté de contacter le créateur du plugin mais j'ai pas eu de réponse.
 
Voici le code du plugin :  

Code :
  1. '.............................................................................
  2. '  Auth4OpenVPN.vbs
  3. '  Jose Ortega,
  4. '  (C)2007.
  5. http://amigo4life.googlepages.com/openvpn
  6. '
  7. '.............................................................................
  8. Option Explicit
  9. Const SEVERITY_INFO = &H00
  10. Const SEVERITY_ERROR = &H01
  11. Const SEVERITY_WARNING = &H02
  12. Const ADS_SECURE_AUTHENTICATION = &H01
  13. Const ADS_USE_ENCRYPTION = &H02
  14. Const ADS_SERVER_BIND = &H0200
  15. Const ADS_SCOPE_SUBTREE = &H02
  16. Const cfgFilePath = "auth4openvpn.ini"
  17. 'Const cfgFilePath = "c:\program files\openvpn\config\auth4openvpn.ini"
  18. Dim fileContent, parameters,ovUser, ovPass
  19. '.............................................................................
  20. sub LogEvent(EventDescription, EventType)
  21.         Dim objShell
  22. Set objShell = Wscript.CreateObject("Wscript.Shell" )
  23. objShell.LogEvent EventType, EventDescription
  24.         Set objShell = nothing
  25. end sub
  26. '.............................................................................
  27. Sub Prn(textToPrint)
  28.     wscript.echo textToPrint
  29. end sub
  30. '.............................................................................
  31. Function LogError (byVal ErrNumber)
  32.          if errnumber = 0 then
  33.             LogError = FALSE
  34.             exit function
  35.          end if
  36.          Select Case ErrNumber
  37.                 case -2147217911, -2147023570
  38.                      LogEvent "Auth4OpenVPN: Incorrect credentials." & _
  39.                               vbNewline & _
  40.                               "Username: " & Ucase(ovUser), SEVERITY_WARNING
  41.                 case -2147217865
  42.                      LogEvent "Auth4OpenVPN: Cannot find server" & _
  43.                               " or LDAP path supplied.", SEVERITY_ERROR
  44.                 case else
  45.                      LogEvent "Auth4OpenVPN: " & errnumber & ", " & _
  46.                               err.description, SEVERITY_ERROR
  47.          end Select
  48.          LogError = TRUE
  49. end Function
  50. '.............................................................................
  51. Function IsAuthOK()
  52. Dim adoConn, AdoCmd, rsUserDN, rsGroupDN, userDN, groupDN, adUser
  53. Dim userGroupsArray, group
  54. Dim oDSP, myDSP, root
  55. Dim server, domain, ldapPath, adGroup, logging
  56. server = parameters(0) : domain = parameters(1)
  57.         ldapPath = parameters(2) : adGroup = parameters(3)
  58.         logging = parameters(4)
  59.         '------------------------------------------------------------------------
  60.         'check credentials
  61.         Set myDSP = GetObject("LDAP:" )
  62.         On Error Resume Next
  63.         Set root = myDSP.OpenDSObject("LDAP://" & server & "/" & _
  64.                                        "RootDSE", domain & "\" & ovUser, _
  65.                                        ovPass, ADS_SERVER_BIND AND _
  66.                                        ADS_USE_ENCRYPTION)
  67.         if LogError(err.number) then
  68.            on error goto 0    'disable on error resume
  69.            IsAuthOK = FALSE
  70.            Exit Function
  71.         end if
  72.         Set root = nothing
  73.        '------------------------------------------------------------------------
  74. Set adoConn = CreateObject("ADODB.Connection" )
  75. Set adoCmd = CreateObject("ADODB.Command" )
  76. with adoConn
  77.  .Provider = "ADsDSOObject"
  78.  .Properties("User ID" ) = domain & "\" & ovUser
  79.  .Properties("Password" ) = ovPass
  80.  .Properties("Encrypt Password" ) = TRUE
  81.  .Properties("ADSI Flag" ) = &H01
  82.  .Properties("Timeout" ) = 10
  83.                 .Open "Active Directory Provider"
  84. end with
  85.     with adoCmd
  86.  Set .ActiveConnection = adoConn
  87.  .Properties("Page Size" ) = 10
  88.  .Properties("Cache Results" ) = FALSE
  89.  .Properties("Searchscope" ) =  ADS_SCOPE_SUBTREE
  90.  '----------------------------------------------------------------
  91.  .CommandText = "SELECT distinguishedName FROM 'LDAP://" & _
  92.                                server & "/" & ldapPath & "' " & _
  93.                                "WHERE objectClass='user' " & _
  94.                                "AND saMaccountName='" & ovUser & "'"
  95.                 on error resume next
  96.                 Set rsUserDN = .Execute
  97.                 if LogError(err.number) then
  98.                    on error goto 0    'disable on error resume
  99.                    adoConn.Close
  100.                    Set adoConn = nothing
  101.                    Set AdoCmd = nothing
  102.                    IsAuthOK = FALSE
  103.                    Exit Function
  104.                 end if
  105.                 if rsUserDn.EOF then
  106.                    IsAuthOK = FALSE
  107.                    LogEvent "Auth4OpenVPN: Cannot find user under LDAP path" & _
  108.                             " set in Auth4OpenVPN.ini file.", SEVERITY_ERROR
  109.                    adoConn.Close
  110.                    Set adoConn = nothing
  111.                    Set AdoCmd = nothing
  112.                    Exit Function
  113.                 end if
  114.                 userDN = rsUserDN.Fields(0)
  115.  '----------------------------------------------------------------
  116.  .CommandText = "SELECT distinguishedName " & _
  117.     "FROM 'LDAP://" & _
  118.                                         server & "/" & ldapPath & "' " & _
  119.     "WHERE objectClass='group' " & _
  120.     "AND name='" & adGroup & "'"
  121.  Set rsGroupDN = .Execute
  122.  if rsGroupDN.EOF then
  123.                    IsAuthOK = FALSE
  124.                    LogEvent "Auth4OpenVPN: Cannot find Group under LDAP path" & _
  125.                             " set in Auth4OpenVPN.ini file.", SEVERITY_ERROR
  126.                    adoConn.Close
  127.                    Set adoConn = nothing
  128.                    Set AdoCmd = nothing
  129.                    Exit Function
  130.                 end if
  131.  groupDN=rsGroupDN.fields(0)
  132.  .CommandText = "SELECT distinguishedName " & _
  133.     "FROM 'LDAP://" & _
  134.                                         server & "/" & ldapPath & "' " & _
  135.     "WHERE objectClass='group' " & _
  136.     "AND name='" & adGroup & "'" & _
  137.     "AND member='" & userDN & "'"
  138.  Set rsGroupDN = .Execute
  139.  if not rsGroupDN.EOF then
  140.                    if Ucase(logging) = "ON" then
  141.                       LogEvent "Auth4OpenVPN: " & _
  142.                                "Authentication successful." & vbNewline & _
  143.                                "Username: " & Ucase(ovUser), SEVERITY_INFO
  144.                    end if
  145.                    IsAuthOK = TRUE
  146.                    adoConn.Close
  147.                    Set adoConn = nothing
  148.                    Set AdoCmd = nothing
  149.                    Exit Function
  150.  end if
  151. End With
  152. '--------------------------------------------------------------------
  153.         IsAuthOK = FALSE
  154.         LogEvent "Auth4OpenVPN: User is not a member of the group: " & _
  155.                  Ucase(adGroup) & vbNewline & "Username: " & _
  156.                  Ucase(ovUser), SEVERITY_WARNING
  157.         Set adUser = nothing
  158.         Set oDSP = nothing
  159. end Function
  160. '.............................................................................
  161. Function IsSettingsFileOK()
  162.         Dim objFSO, openFile
  163. Set objFSO = CreateObject("Scripting.FileSystemObject" )
  164. If objFSO.FileExists(cfgFilePath) Then
  165.    On Error Resume Next
  166.         set openFile = objFSO.OpenTexTFile(cfgFilePath)
  167.         if err.number then
  168.            IsSettingsFileOK = FALSE
  169.               LogEvent "Auth4OpenVPN: Cannot read Auth4OpenVPN.ini file.", _
  170.                        SEVERITY_ERROR
  171.               On Error Goto 0  'disable On Error Resume
  172.               Set objFSO = nothing
  173.               Exit Function
  174.         end if
  175.    fileContent = openFile.ReadAll
  176.    openFile.Close
  177.         Else
  178.             IsSettingsFileOK = FALSE
  179.             LogEvent "Auth4OpenVPN: The Auth4OpenVPN.ini file is missing.", _
  180.                      SEVERITY_ERROR
  181.             Set objFSO = nothing
  182.             Exit Function
  183. End If
  184. Set objFSO = nothing
  185. IsSettingsFileOK = TRUE
  186. end Function
  187. '.............................................................................
  188. Function GetFirstMatch(PatternToMatch, StringToSearch)
  189.     Dim regEx, CurrentMatch, CurrentMatches
  190.     Set regEx = New RegExp
  191.     with regEx
  192.          .Pattern = PatternToMatch
  193.          .IgnoreCase = TRUE
  194.          .Global = TRUE
  195.          .MultiLine = TRUE
  196.          Set CurrentMatches = .Execute(StringToSearch)
  197.     end with
  198.     GetFirstMatch = ""
  199.     If CurrentMatches.Count >= 1 Then
  200.         Set CurrentMatch = CurrentMatches(0)
  201.         If CurrentMatch.SubMatches.Count >= 1 Then
  202.             GetFirstMatch = CurrentMatch.SubMatches (0)
  203.         End If
  204.     End If
  205.     Set regEx = Nothing
  206. End Function
  207. '.............................................................................
  208. Function AreSettingsOK()
  209.     Dim pattern
  210.     Dim i
  211.     parameters = Array ("SERVER", "DOMAIN", "DN", "GROUP", "LOGGING" )
  212.     For i = 0 to 4
  213.         pattern = ".*\r\n\s*" & parameters(i) & "\s*\=\s*\""(.*)\"""
  214.         parameters(i) = Trim(getFirstMatch(pattern, fileContent))
  215.         if Len(parameters(i)) = 0 then
  216.            AreSettingsOK = FALSE
  217.            LogEvent "Auth4OpenVPN: Missing settings in Auth4OpenVPN.ini" & _
  218.                     " file.", SEVERITY_ERROR
  219.            Exit Function
  220.         end if
  221.     Next
  222.     AreSettingsOK = TRUE
  223. End Function
  224. '.............................................................................
  225. Function AreCredentialsOK()
  226.          if Wscript.Arguments.Count = 0 then
  227.             'no cmd args, read OpenVPN supplied credentials
  228.             Dim myObj
  229.             Set myObj = Wscript.CreateObject("Wscript.Shell" )
  230.             ovUser = myObj.ExpandEnvironmentStrings("%username%" )
  231.             ovPass = myObj.ExpandEnvironmentStrings("%password%" )
  232.             Set myObj = nothing
  233.             if Len(ovUser)=0 or Len(ovPass)=0 then
  234.                AreCredentialsOK = FALSE
  235.                LogEvent "Auth4OpenVPN: Empty username or password " & _
  236.                         "are not allowed.", SEVERITY_ERROR
  237.                Exit Function
  238.             end if
  239.             AreCredentialsOK = TRUE
  240.             Exit Function
  241.          '-------------------------------------------------------------------
  242.          Elseif Wscript.Arguments.Count = 2 then
  243.             'cmd args present, read user and pass provided for testing.
  244.             ovUser = Trim(Wscript.Arguments(0))
  245.             OvPass = Trim(Wscript.Arguments(1))
  246.             if Len(ovUser)=0 or Len(ovPass)=0 then
  247.                AreCredentialsOK = FALSE
  248.                LogEvent "Auth4OpenVPN: Empty username or password " & _
  249.                         "are not allowed.", SEVERITY_ERROR
  250.                Exit Function
  251.             end if
  252.             AreCredentialsOK = TRUE
  253.             Exit Function
  254.          Else
  255.             LogEvent "Auth4OpenVPN: Invalid number of arguments.", _
  256.                      SEVERITY_ERROR
  257.             AreCredentialsOK = FALSE
  258.          End If
  259. End Function
  260. '.............................................................................
  261. Sub Main
  262.     If AreCredentialsOk then
  263.     if IsSettingsFileOK then
  264.     if AreSettingsOK then
  265.     if IsAuthOk then
  266.        if Wscript.Arguments.Count = 0 then
  267.           wscript.quit(0)
  268.        else
  269.           Prn "Authentication successful." & vbNewline
  270.           wscript.quit(0)
  271.        end if
  272.     end if
  273.     end if
  274.     end if
  275.     end if
  276.     if Wscript.Arguments.Count = 0 then
  277.        wscript.quit(1)
  278.     else
  279.        Prn "Authentication failed." & vbNewline & _
  280.            "Check the Application logs for details." & vbNewline
  281.        wscript.quit(1)
  282.     end if
  283. end sub
  284. '.............................................................................
  285. Main
  286. '.............................................................................


 
Merci à vous tous
 
PS : Si je me suis trompé de catégorie. Mea Culpa.

Reply

Marsh Posté le 18-03-2013 à 13:47:52   

Reply

Marsh Posté le 20-03-2013 à 09:37:10    

Y'a personne qui s'y connait dans ce domaine ?
 
edit le 20/03/2012 à 18h06
 
j'ai continué de chercher dans les logs d'openvpn, et là je suis tombé sur cette ligne d'erreur :
c:\Progra~1\openvpn\config\Auth4OpenVPN.vbs(122, 20) Erreur d'éxécution Microsoft VBScript: Objet requis: 'adoConn'
 
Si ça vous parle plus qu'à moi, n'hésitez pas à me dire quoi corriger sur mon serveur vpn  :jap:


Message édité par Maitre Jedi le 20-03-2013 à 18:13:16
Reply

Marsh Posté le 23-03-2013 à 17:20:04    

up

Reply

Marsh Posté le 24-03-2013 à 16:10:24    

met le chemin complet vers ton fichier de config

Reply

Marsh Posté le 24-03-2013 à 18:56:48    

avec l'un ou l'autre chemin, même erreur...  :cry:


Message édité par Maitre Jedi le 24-03-2013 à 18:57:10
Reply

Marsh Posté le 27-03-2013 à 18:15:03    

up

Reply

Marsh Posté le 27-03-2013 à 19:29:04    

 
              Tu peux ajouter une centaine d'up, il n'y aura pas plus de réponse vu le détail de l'erreur
              et la précision du 20 dernier :   il manque des objets, sans cela ne peut pas fontionner ‼
 

Reply

Marsh Posté le 08-04-2013 à 18:01:56    

coucou,
 
j'ai enfin 5 minutes pour revenir sur ce projet
 
J'ai bien compris qu'il manquait des objets mais c'est juste lorsque l'appel est effectué depuis openvpn. Si je lance ce script depuis une invite de commande en mettant en paramètre le nom d'utilisateur et le mot de passe, par exemple : auth4openvpn.vbs user motdepasse, ça fonctionne...
 
C'est plus ça mon problème. Connaissez vous un moyen de débugger ce genre de problème ?
 
Merci à tous

Reply

Marsh Posté le 10-04-2013 à 15:29:39    

Bon j'avance dans mon projet...
 
plusieurs semaines après avoir envoyé un mail à l'auteur, j'ai enfin reçu une réponse de sa part. Il se dit étonné et m'a donné quelques pistes à explorer...
 
Après quelques heures passées, il s'avère que le problème intervient après la sortie d'Openvpn 2.1.4. Le script fonctionne parfaitement avec OpenVPN 2.0.9.
J'ai poussé plus loin l'exploration et j'en suis venu à la conclusion suivante :
Avec la version 2.0.9, le paramètre script-security n'est pas reconnu, il faut l'enlever tandis qu'à partir de la version 2.1.4, le paramètre est obligatoire pour pouvoir lancer des scripts. Donc je pense que mon problème se situe içi. Maintenant comment modifier le script pour que celui-ci refonctionne complètement comme avant. Aucune idée !!
 
Sur ces grandes avancées, je me replonge dedans et la moindre de vos idées est la bienvenue...

Reply

Marsh Posté le 09-04-2014 à 21:45:20    

Bonjour
 
J'ai un prb un peu similaire en tentant de le monter sur un W2012 (openvpn 2.3.2 - client 3.0.0)
 
Message dans log Application de W2012 : Auth4OpenVPN: -2147221164, Classe non enregistrée
Ca fonctionne parfaitement en ligne de commande.
 
Avez-vous trouvé une solution a votre problème ?
 
Merci d'avance

Reply

Marsh Posté le 09-04-2014 à 21:45:20   

Reply

Marsh Posté le 18-03-2015 à 00:19:12    

Bonjour Maitre Jedi,
 
I noticed the same problem on my Windows 2008 server.  
 
Apparently when running Auth4OpenVPN.vbs some environment variables are not set. Here is a solution from someone else who created a wrapper script to set the variables and then calls the authentication script. It now works ok for me.
 
https://forums.openvpn.net/topic17787.html
 
Wrapper:
 

Code :
  1. set LOCALAPPDATA=C:\Users\%USERNAME%\AppData\Local
  2. set CommonProgramFiles=C:\Program Files\Common Files
  3. set CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
  4. set CommonProgramW6432=C:\Program Files\Common Files
  5. C:\Windows\System32\cscript.exe "C:\Program Files\OpenVPN\config\Auth4OpenVPN.vbs"
  6. exit %errorlevel%


 
Then set this as the script in your .ovpn file:
 

Code :
  1. script-security 3
  2. auth-user-pass-verify Auth4OpenVPN-64bitWrapper.cmd via-env


 
 
This solution is now also listed on the orginal author's website: https://sites.google.com/site/amigo4life2/openvpn

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed