OpenVPN2.0以降には、OpenVPNサーバーが接続しているクライアントからユーザー名とパスワードを安全に取得し、その情報
この認証方法を使用するには、まずauth-user-passディレクティブをクライアント設定に追加します。 OpenVPNクライアントは、ユーザー名/パスワードをユーザーに照会し、安全なTLSチャネルを介してサーバーに渡すように指示します。
次に、スクリプト、共有オブジェクト、DLLなどの認証プラグインを使用するようにサーバーを設定します。 OpenVPNサーバーは、VPNクライアントが接続しようとするたびにプラグインを呼び出し、クライアントに入力されたユーザー名/パスワードを渡します。 認証プラグインは、Failure(1)またはsuccess(0)の値を返すことによって、OpenVPNサーバーがクライアントに接続を許可するかどうかを制御できます。
スクリプトプラグインの使用
スクリプトプラグインは、サーバー側の設定ファイルに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-scriptssubdirectoryのOpenVPNソースファイル配布に含まれています。 これは、pam認証モジュールを使用してLinuxサーバー上のユーザーを認証し、シャドウパスワード、RADIUS、またはLDAP認証を実装することができます。 auth-pam.pl 主にデモ目的のために意図されています。 実際のPAM認証の場合は、以下で説明するopenvpn-auth-pamsharedオブジェクトプラグインを使用します。
共有オブジェクトまたは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ディレクティブを使用することで、権限を減らして実行でき、rootで読み取り可能な唯一のシャドウパスワードファイルに対
- OpenVPNは、ファイルや環境ではなく、仮想メモリを介してプラグインにユーザー名/パスワードを渡すことができます。
- Cコンパイルされたプラグインモジュールは、一般的にスクリプトよりも高速に実行されます。
OpenVPNで使用するための独自のプラグインの開発に関する詳細については、OpenVPNソース配布のpluginサブディレクトリにある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ディレクティブは削除できません。