web-dev-qa-db-fra.com

Comment stocker le mot de passe OpenVPN lors de l'utilisation d'un défi statique

J'utilise l'authentification à deux facteurs pour OpenVPN, et je le fais en utilisant la directive static-challenge.

Je souhaite également stocker mon nom d'utilisateur et mon mot de passe VPN.

J'ai essayé de le faire en utilisant auth-user-password up par la page de manuel, mais quand je le fais, cela ne me donne pas l'occasion d'offrir un défi statique, donc cela échoue.

J'ai essayé d'écrire un script python qui transmettrait un nom d'utilisateur, un mot de passe et une réponse de défi via stdin au processus openvpn, mais openvpn ne semble pas recevoir les éléments que j'envoie à stdin le même code par rapport à un exemple de script que j'ai écrit et qui est entré avec sys.stdin.readline() (travaillé). Un extrait est ci-dessous.

openvpn = subprocess.Popen(                                                      
        ['openvpn', '--config', os.path.expanduser('~/.ovpn-config')],           
        stdin=subprocess.PIPE)                                                   
openvpn.communicate('%s\n%s\n%s\n' % (username, password, otp))                  

Avez-vous des idées sur la manière de stocker le nom d'utilisateur et le mot de passe et d'utiliser un défi statique?

Merci!

3
Sam King

Je suppose que le problème est que le nom d'utilisateur et le mot de passe ne sont pas envoyés via stdin!

Vous devriez jeter un oeil au module python "pexpect".

3
cornelinux

Vous devez utiliser un pseudo tty:

#!/usr/bin/env python

import os
import sys
import pty
import subprocess

K = "GOOGLEAUTHKEY"
OVPN = "client.ovpn"
CHALLENGE = "CHALLENGE"

p = subprocess.Popen(["oathtool", "--totp", "-b", K], stdout=subprocess.PIPE)
code = p.stdout.read().strip()

cp, fd = pty.fork()
if cp == 0:
    os.execlp("openvpn", "openvpn", "--config", OVPN)
else:
    f = os.fdopen(fd)
    challenge = False
    while not challenge:
        l = os.read(fd, len(CHALLENGE))
        challenge = l == CHALLENGE
        if not challenge:
            f.readline()
    os.write(fd, "%s\n" % code)
    while True:
        try:
            print f.readline().strip()
        except KeyboardInterrupt:
            os.kill(cp, 15)
        except IOError:
            print "Bye"
            sys.exit(0)
0
Jean Schurger