web-dev-qa-db-ja.com

静的チャレンジを使用する場合のOpenVPNパスワードの保存方法

OpenVPNには2要素認証を使用していますが、_static-challenge_ディレクティブを使用してそれを行っています。

VPNのユーザー名とパスワードも保存したい。

マニュアルページごとに_auth-user-password up_を使用してこれを実行しようとしましたが、実行すると、静的チャレンジを提供する機会が与えられないため、失敗します。

pythonスクリプトをユーザー名、パスワード、チャレンジレスポンスをstdin経由でopenvpnプロセスに渡すスクリプトを作成しようとしましたが、openvpnがstdinに送信するものを取得していないようです(私が書いたサンプルスクリプトに対して同じコードを実行しても、sys.stdin.readline()を使用して入力を取得しますが)スニペットを以下に示します。

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

ユーザー名とパスワードを保存し、静的チャレンジを使用する方法についての考えはありますか?

ありがとう!

3
Sam King

問題は、ユーザー名とパスワードが標準入力経由で送信されないことだと思います!

python module "pexpect"をご覧ください。

3
cornelinux

疑似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