OpenVPNドキュメント

代替認証方法の使用

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スクリプトを使用します。
詳細についてはマニュアルページauth-user-pass-verifyの欄を参照してください。

auth-pam.plはOpenVPNソースファイルの中のsample-scriptsサブディレクトリに含まれています。
このスクリプトはPAM認証モジュール(シャドウパスワード、RADIUS、LDAP 認証の実装が可能)を使用してLinuxサーバー上のユーザーを認証します。
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モジュールを使用してクライアントが入力したユーザー名/パスワードを検証するようになります。

実際の運用環境ではauth-pam.plスクリプトよりopenvpn-auth-pamプラグインを使用する方がいくつかの利点があるためお勧めです。

  • 共有オブジェクトopenvpn-auth-pamプラグインは、セキュリティ強化のため分割権限実行モデルを採用しています。
    これによりOpenVPNサーバーuser nobody, group nobody, chrootといったディレクティブを使用することにより実行権限を制限した状態で実行が可能となります。
    また、その場合でも、root権限のみで読取可能なシャドウパスワードファイルによる認証は可能となります。
  • ファイルや環境経由ではなく仮想メモリ経由でユーザー名/パスワードをプラグインに渡すことができるため、サーバーマシン上のローカルセキュリティが向上します。
  • 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

これにより、クライアント証明書での認証はクライアントの共通名を使用し、サーバーはインデックス作成の目的でユーザー名を使用します。