web-dev-qa-db-ja.com

OpenVPNの複数認証方法を設定するにはどうすればよいですか?

Mfaを使用してOpenVPNに接続します。 .batまたは.cmdファイルをクリックしてOpenVPNに接続するというクライアント要件があります。ユーザー名とパスワードを使用してOpenVPNに自動接続するソリューションを見つけました。ただし、これを行うには、pam構成ファイルでmfaを無効にする必要がありました。

両方の認証方法を維持する方法はありますか?特定のユーザーが自動ログインプロファイルを持つことはできますが、他のユーザーは引き続きmfaを使用してログインする必要がありますか?

私の設定は以下の通りです:

client
dev tun
proto udp
remote xx.xx.xx.xxx Protocol
nobind
resolv-retry infinite
persist-key
persist-tun
auth-user-pass pass.txt
auth-nocache
ca ca.crt
cert user.crt
key user.key
comp-lzo
verb 4
tls-auth ta.key 1
cipher AES-256-CBC
remote-cert-tls server
keepalive 5 300
reneg-sec 36000

そしてserver.conf:

port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/2.0/keys/xxxx.crt
cert /etc/openvpn/easy-rsa/2.0/keys/xxxx.crt
key /etc/openvpn/easy-rsa/2.0/keys/xxxx.key  # This file should be kept secret
dh /etc/openvpn/easy-rsa/2.0/keys/xxxx.pem
server xx.xx.xx.xx 255.255.255.0
ifconfig-pool-persist ipp.txt
Push "route 192.16.5.0 255.255.255.0"
Push "route 192.16.6.0 255.255.255.0"
Push "route 192.16.7.0 255.255.255.0"
Push "route 192.16.8.0 255.255.255.0"
Push "dhcp-option DNS 132.196.243.9"
Push "dhcp-option DNS 8.8.8.8"
keepalive 5 300
reneg-sec 36000
tls-auth /etc/openvpn/easy-rsa/2.0/keys/xxxx.key 0 # This file is secret
cipher AES-256-CBC   # AES
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log-append  /var/log/openvpn.log
verb 5
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn #  This is my authentication plugin. I want to use another one along with it.
2
salman.isha

OpenVPN 2.0以降には、OpenVPNサーバーが接続しているクライアントからユーザー名とパスワードを安全に取得し、その情報をクライアントの認証の基礎として使用できるようにする機能が含まれています。

この認証方法を使用するには、最初にauth-user-passディレクティブをクライアント構成に追加します。 OpenVPNクライアントに、ユーザーにユーザー名/パスワードを照会するように指示し、安全なTLSチャネルを介してサーバーに渡します。

次に、認証プラグイン(スクリプト、共有オブジェクト、またはDLL)を使用するようにサーバーを構成します。 OpenVPNサーバーは、VPNクライアントが接続を試みるたびにプラグインを呼び出し、クライアントに入力されたユーザー名/パスワードを渡します。認証プラグインは、OpenVPNサーバーが失敗(1)または成功(0)の値を返すことにより、クライアントが接続を許可するかどうかを制御できます。

スクリプトプラグインの使用

スクリプトプラグインは、サーバー側の構成ファイルにauth-user-pass-verifyディレクティブを追加することで使用できます。例えば:

auth-user-pass-verify auth-pam.pl via-fileは、auth-pam.pl Perlスクリプトを使用して、接続しているクライアントのユーザー名/パスワードを認証します。詳細については、マニュアルページのauth-user-pass-verifyの説明を参照してください。

auth-pam.plスクリプトは、sample-scriptsサブディレクトリのOpenVPNソースファイル配布に含まれています。 PAM認証モジュールを使用してLinuxサーバー上のユーザーを認証します。これにより、シャドウパスワード、RADIUS、またはLDAP認証を実装できます。 auth-pam.plは、主にデモンストレーションを目的としています。実際のPAM認証には、以下で説明するopenvpn-auth-pam共有オブジェクトプラグインを使用します。

共有オブジェクトまたはDLLプラグインを使用

共有オブジェクトまたはDLLプラグインは通常、実行時にOpenVPNサーバーによってロードされるコンパイル済みCモジュールです。たとえば、LinuxでRPMベースのOpenVPNパッケージを使用している場合、openvpn-auth-pamプラグインはすでにビルドされている必要があります。これを使用するには、これをサーバー側の構成ファイルに追加します。

plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so loginこれは、OpenVPNサーバーに、loginPAMモジュールを使用してクライアントが入力したユーザー名/パスワードを検証するように指示します。

実際の本番環境で使用する場合は、openvpn-auth-pamプラグインを使用することをお勧めします。これは、auth-pam.plスクリプトに比べていくつかの利点があるためです。

共有オブジェクトopenvpn-auth-pamプラグインは、セキュリティを強化するために分割特権実行モデルを使用します。つまり、OpenVPNサーバーは、ディレクティブuser nobody、group nobody、およびchrootを使用して、制限された特権で実行でき、ルート読み取り専用のシャドウパスワードファイルに対して認証を行うことができます。 OpenVPNは、ファイルや環境ではなく、仮想メモリを介してプラグインにユーザー名/パスワードを渡すことができます。これは、サーバーマシンのローカルセキュリティに適しています。 Cでコンパイルされたプラグインモジュールは、通常、スクリプトよりも高速に実行されます。 OpenVPNで使用する独自のプラグインの開発に関する詳細については、OpenVPNソースディストリビューションのプラグインサブディレクトリにあるREADMEファイルを参照してください。

Linuxでopenvpn-auth-pamプラグインをビルドするには、OpenVPNソースディストリビューションのplugin/auth-pamディレクトリにcdして、makeを実行します。

クライアント認証の唯一の形式としてユーザー名/パスワード認証を使用

デフォルトでは、サーバーでauth-user-pass-verifyまたはユーザー名/パスワードチェックプラグインを使用すると、二重認証が有効になり、クライアントを認証するには、クライアント証明書とユーザー名/パスワード認証の両方が成功する必要があります。

セキュリティの観点からは推奨されていませんが、クライアント証明書の使用を無効にして、ユーザー名/パスワード認証のみを強制することもできます。サーバー上:

client-cert-not-requiredこのような構成では、通常、次の設定も行う必要があります。

username-as-common-nameこれは、クライアント証明書を介して認証されていたクライアントの共通名を使用するため、インデックス作成の目的でユーザー名を使用するようにサーバーに指示します。

client-cert-not-requiredはサーバー証明書の必要性を排除しないため、client-cert-not-requiredを使用するサーバーに接続するクライアントは、certおよびkeyディレクティブを削除する場合があることに注意してください。クライアントがサーバー証明書を検証する必要があるため、caディレクティブではなく、クライアント構成ファイルから。

1
manjesh23