Impossible de faire un OpenVPN avec une base user MySql

Bonjour,
Après une journée à m’arracher les cheveux dessus ce problème, je viens vous l’exposer.
Je cherche simplement à faire un OpenVPN avec une authentification liée à une base de donnée MySql qui contient tous les logins et passwords.
Le problème est qu’à chaque fois, je tombe sur :

WRRWRWRWWWWRWRWWWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRRRRWRWRWRWWWRRWRWRWRAUTH-PAM: BACKGROUND: received command code: 0 AUTH-PAM: BACKGROUND: USER: xyz AUTH-PAM: BACKGROUND: my_conv[0] query='Password:' style=1 AUTH-PAM: BACKGROUND: user 'xyz' failed to authenticate: Permission denied Mon Jul 9 17:11:52 2012 us=829936 xxx.xxx.xxx.xxx:44015 PLUGIN_CALL: POST /usr/lib/openvpn/openvpn-auth-pam.so/PLUGIN_AUTH_USER_PASS_VERIFY status=1 Mon Jul 9 17:11:52 2012 us=829958 xxx.xxx.xxx.xxx:44015 PLUGIN_CALL: plugin function PLUGIN_AUTH_USER_PASS_VERIFY failed with status 1: /usr/lib/openvpn/openvpn-auth-pam.so Mon Jul 9 17:11:52 2012 us=829983 xxx.xxx.xxx.xxx:44015 TLS Auth Error: Auth Username/Password verification failed for peer WWWRRMon Jul 9 17:11:53 2012 us=42859 xxx.xxx.xxx.xxx:44015 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA

Les passwords sont en SHA1 qui est calculé suite à une insertion en php (il s’agit d’un intranet/extranet avec exclusivement par OpenVPN SSL).

Voici les fichiers de paramètres (la dernière version en date) :
client.ovpn

client port 1194 proto tcp dev tun remote abc.abc.com resolv-retry infinite ca ca.crt tls-auth ta.key 1 cipher AES-256-CBC comp-lzo verb 3 nobind persist-key persist-tun mute-replay-warnings auth-user-pass ns-cert-type server mute 20
server.conf

port 1194 proto tcp dev tun ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/server.crt key /etc/openvpn/keys/server.key dh /etc/openvpn/keys/dh2048.pem tls-auth /etc/openvpn/keys/ta.key 0 cipher AES-256-CBC server 10.8.0.0 255.255.255.0 #push route 192.168.0.0 255.255.255.0 #push redirect-gateway def1 ifconfig-pool-persist ipp.txt duplicate-cn keepalive 10 120 comp-lzo persist-key persist-tun verb 3 mute 20 client-cert-not-required username-as-common-name plugin /usr/lib/openvpn/openvpn-auth-pam.so openvpn

/etc/pam.d/openvpn

auth optional pam_mysql.so user=dbuser passwd=dbpass host=localhost db=dbname table=dbtable usercolumn=login passwdcolumn=password where=active=1 sqllog=no crypt=4 verbose=0 account required pam_mysql.so user=dbuser passwd=dbpass host=localhost db=dbname table=dbtable usercolumn=login passwdcolumn=password where=active=1 sqllog=no crypt=4 verbose=0

Merci beaucoup

Salut,

C’est un “simple” problème de “query” sur mysql, non ?
Arrives-tu à faire une requête sql avec les identifiants ?

Tu as suivi un tuto ?
C’est quoi le lien ?

Effectivement, ce n’est pas très clair ou est le problème.
Si j’ai bien compris le scénario:

  • connexion au réseau local via openVPN (connexion sur un serveur)
  • ensuite accès à la base

C’est bien ça ?
Ou est ce que ça coince ?

Si je comprends bien, la ligne
auth-user-pass
du clietnlui demande de s’authentifier par mot de passe et
la ligne
plugin /usr/lib/openvpn/openvpn-auth-pam.so openvpn
dis à openvpn d’utiliser le plugin openvpn-auth-pam.so pour s’authentifer.

Celui ci se connecte en tant que dbuser avec un mot de pass dbpass à mysql pour vérifier le mot de passe, il utilise la base dbname et la table dbtable qui contient au moins 3 champs
usercolumn
passwdcolumn
active

J’espère que les mots de passe dbuser/dbpass ne sont pas les bons, c’est un peu faible :slightly_smiling:.

Peux tu accéder à cette table en tant que dbuser/dbpass?

(
mysql -u dbuser -p
use dbname;
select * from dbtables;
)

Ça sent tout de même la base non configurée…

[quote=“fran.b”]Si je comprends bien, la ligne
auth-user-pass
du clietnlui demande de s’authentifier par mot de passe et
la ligne
plugin /usr/lib/openvpn/openvpn-auth-pam.so openvpn
dis à openvpn d’utiliser le plugin openvpn-auth-pam.so pour s’authentifer.

Celui ci se connecte en tant que dbuser avec un mot de pass dbpass à mysql pour vérifier le mot de passe, il utilise la base dbname et la table dbtable qui contient au moins 3 champs
usercolumn
passwdcolumn
active

J’espère que les mots de passe dbuser/dbpass ne sont pas les bons, c’est un peu faible :slightly_smiling:.

Peux tu accéder à cette table en tant que dbuser/dbpass?

(
mysql -u dbuser -p
use dbname;
select * from dbtables;
)

Ça sent tout de même la base non configurée…[/quote]

Bonjour,
C’est tout à fait ça au niveau de comment ça fonctionne.
En ligne de commande, il n’y a aucun problème, ça fonctionne avec le login, password et dbname.

Le vpn ne doit autoriser l’accès que si le active = ‘1’ et que le login + password sont correct.
Les colonnes ont pour nom :
login : varchar
password : varchar
active : enum(‘0’,‘1’)
comme c’est mentionné ici :

Cette même configuration de table fonctionne avec les mêmes login/password pour y accéder (testé cette nuit) sur la config pure-ftpd-mysql donc le problème est bien présent au niveau du vpn/pam_mysql.

Au niveau du tuto, j’ai suivi :
celui de départhttp://techtots.blogspot.fr/2010/01/openvpn-with-pammysql-usernamepassword.html
ensuite je l’ai comparé à celui-ci : http://bibabox.fr/openvpn-avec-utilisateurs-mysql-ou-systeme/

Encore merci

Bon, je te suggère d’activer les logs de mysql (voir my.cnf, décommente

[code]# Be aware that this log type is a performance killer.

As of 5.1 you can enable the log at runtime!

#general_log_file = /var/log/mysql/mysql.log
#general_log = 1
[/code]
) Cela permettra de savoir si les requêtes sont faites ou pas…

[quote=“fran.b”]Bon, je te suggère d’activer les logs de mysql (voir my.cnf, décommente

Et bien voici le résultat :

120710 12:24:32 446 Connect dbuser@localhost on dbname 446 Init DB dbname 446 Query SELECT password FROM dbtable WHERE login = 'xyz' AND (active=1) 446 Query SELECT password FROM dbtable WHERE login = 'xyz' AND (active=1) 446 Quit

Pour moi, les SELECT ont l’ai un peu bizarre avec le active=1 entre ()
Sinon je ne vois pas où pourrait être le problème à part venant du SHA1 car tous les passwords sont en SHA1 dans la

Essaie de faire strictement la même requête SQL en local, tu verras si c’est un pb de ()

Alors, via ssh donc en cli :
NON :

OK :

OK :

OK :

donc je viens d’essayer avec : where=active='1'
et ça ne fonctionne pas

bon ap

edit : je viens de tester et ça ne fonctionne pas, toujours la même erreur au niveau du serveur openvpn :

j’ai l’impression que ça vient du crypt=4, je vais tester avec crypt=sha1

edit2 : idem avec crypt=sha1, je vais bientôt me pendre avec cette histoire

Bon rajoute l’option verbose=debug dans les paramètres de pam_mysql.so, ensuite tu peux d’abord tester avec crypt=0 (non crypté) pour voir.

Ça ne me sort rien de plus même avec sqllog=yes dans la ligne du pam_mysql.so donc j’ai un véritable problème

sqllog établit les logs de connexions dans une table sql si j’ai bien compris la doc. verbose=1 te donnera tous les détails. Visiblement, la connexion avec MySQL se fait (vérifie tout de même que le login est bon. Donc je pense que c’est dans la reconnaissance. Avec le verbose, tu verras tout dans les logs y compris les mots de passe en clair.

Toujours rien de plus dans les logs comme si le pam ne fonctionnait pas comme attendu au niveau du log.
Idem pour le log au niveau de la sortie d’openvpn.
C’est décourageant mais je pense passer par un bon vieux script sh comme dans ce tuto : http://chagridsada.blogspot.fr/2011/01/openvpn-system-based-on-userpass.html
Il me reste plus qu’à faire en sorte que ce soit du sha1.

edit : ok alros 2 news
1 - bonne nouvelle : fichier login.sh

[code]
#!/bin/bash
##Dababase Server
HOST=‘localhost’
#Default port = 3306
PORT=‘3306’
#Username
USER=‘dbuser’
#Password
PASS=‘dbpass’
#database name
DB=‘dbname’

##Authentication
user_id=$(mysql -h$HOST -P$PORT -u$USER -p$PASS $DB -sN -e “select login from clients where login = ‘$1’ AND password = SHA1(’$2’) AND active=‘1’”)
##Check user
[ “$user_id” != ‘’ ] && [ “$user_id” = “$1” ] && echo “user : $1” && echo ‘authentication ok.’ && exit 0 || echo ‘authentication failed.’ && exit 1[/code]
Ça fonctionne dans le terminal, il me retourne authentication ok

2 - en mettant cette ligne dans le fichier server.conf à la place de la ligne plugin

j’obtiens ce problème :

edit 2 : et pourtant le openvpn --help donne bien :

--auth-user-pass-verify cmd method: Query client for username/password and run script cmd to verify. If method='via-env', pass user/pass via environment, if method='via-file', pass user/pass via temporary file.

edit 3 : Dernière possibilité, mettre en place une PKI interne avec auto-génération des certificats + clés d’accès mais là, quel est le meilleur moyen au niveau clarté d’utilisation et obligatoirement open-source pour en mettre une en place.
J’avais déjà trouvé des noms comme :
[ul]
[li]TinyCA[/li]
[li]OpenCA[/li]
[li]CAcert : leur code source est sous GNU GPL[/li][/ul]
En connaissez-vous une autre ou une en particulier que vous pourriez recommander ?
Encore merci

edit 4 : c’est décidé, j’abandonne et je vais mettre en place tous les scripts nécessaires pour faire la génération et révocation de certificat. Je pense entre autre à GnuTLS 3.x

Bonjour,

vu que le topic est première place pour cette erreur dans Google je déterre un peu le sujet.

Il suffit de rajouter la ligne:

script-security 3

Dans le fichier conf server d’OpenVPN et ça marche.